5.1 基本介紹
Programming Language 程式語言
年代 |
特徵1 |
特徵2 |
特徵3 |
特徵4 |
特徵5 |
1GL (Machine Language)低階語言 |
由 0, 1 組成 |
為機器能直接執行的語言 |
user 不易理解 |
|
|
2GL (Assembly Language)低階語言 |
提供簡易的符號供 user 使用 |
用 “assembler” 將之轉成 object code |
Ex: ADD R1 3 => 將 3 加到 Register R1 中 |
|
|
3GL (High-Level Language)高階語言 |
提供更多貼近 user 的指令 |
多為程序導向的程式語言 (procedural language -> tell “how” to do) |
Ex: int i = 3 + 5; |
代表:C (具 self-compile), PASCAL, FURTRAN, COBOL, BASIC, C++, JAVA, .NET |
C 語言: 1. compile 完的 object code, 不能跨平台 2. 此邊是語法, 故可跨平台 |
4GL (Non-procedural Language) 非程序導向高階語言 |
又稱為宣告式語言 (Declaractive Language) -> tell “what” to do |
代表:SQL, report generator |
Ex: Select height From student where height ≥ 180 |
|
|
5GL (Natural Language) 自然語言高階語言 |
使用到人工智慧的技術 |
為機器能直接執行的語言 |
代表:LISP, PROLOG |
|
|
種類
種類 |
代表性程式語言 |
備註 |
Interpreter language 直譯 |
Basic, Java, Javascript, ASP, PHP, JSP, ruby, groovy, python |
|
Compile language 編譯 |
C, C++, FURTRAN, PASCAL, COBAL -> 先編譯成 object code |
java, javascript 沒有關係 |
先 compile, 後 interpreter -> p-code, java |
跨平台 (cross-platform) |
|
Object Oriented Programming (OOP) |
java, C++, C#, .NET, javascript, ruby, python, groovy, VB, smalltalk, Ada |
|
Functional Programming Language (函式編程語言) FPL |
LISP, ML, F# |
適用於平行運算, 以 function 為 first class, 各 function 間 No side effect |
funtion (函式) => C, C++, Java
1 2 3 4
| return type function name parameter list { function code (body) }
|
return type
: 回傳型態 output
function name
: in c, c++ 中 main 代表主程式
parameter List
: 參數串列, 接收外界呼叫時須引入的參數 input
function code
process
funtion calling (呼叫)
1 2 3 4 5 6 7 8 9 10 11
| funA() { int a, b; ... funcB(a, b) // (a, b 為 actual parameter 實際參數 AP) }
funB(x, y) // (x, y 為 foraml parameter 型式參數 FP) { ... }
|
- 參數傳遞 (funcB in funcA)
- funcB execute
- funcB return
參數傳遞種類
Call by value |
Call by address |
Call by name |
Call by value-result |
AP 跟 FP 佔用不同的 memory space |
操作相同 Memory space |
AP 會直接取代 FP 之所在 |
在 function 最後結束時, 將 FP 寫回對應 AP 之內容 |
No side effect |
有 |
有 |
有 |
binding 速度慢 (最慢) |
最快 |
居中 |
|
不適合用於結構型資料的參數傳遞 |
適合 |
|
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| int main() { int a = 10, b = 20; fun(a, b); print(a, b); return 0; }
void fun(int x, int y) { x = 3; y = 6; }
|
問分別採 1. call by value 2. call by address 3. call by value result, output = ? a = ? b = ?
Sol:
- a=10, b=20
- x, y 為記錄 a, b 的位址, 並指回原變數。Ans: a=3, b=6
- 最後結束時會將 FP 寫回對應 AP 之內容, 具 side effect(砍掉前,將最後的值抓回)。Ans: a=3, b=6
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int main() { int a = 4, b = 6; fun(a, b, a+b); return 0; }
void fun(int x, int y, int z) { x = 7; y = 10; int t = z * z; printf(t) }
|
問採 1. call by name? 2. call by address?
Sol:
- 87, 需注意
a+b*a+b
先乘除後加減
- 100
- Note:
採 call by-address
時, 若有運算式, 則此採 call by-value 來接收
call by-reference
一般而言相同, 但在 c++ 中, 2 者完全不同
call by-name
多做一件事, 所以居中
結構化程式三要求 Structure Programming Language SPL
三要素:
- 循序 sequential
指令會依序一一往下執行
- 選擇 selective/conditional
利用 “判別式” 來決定接下來的執行步驟為何
if...else...
switch...case...
- 重複 repeat/iteractive
利用 “loop” 來反覆執行部分的 step
for loop
while
do...while
- SPL 中避免使用 “跳躍” 指令或動作
jump
, goto