程式語言簡介
程式語言的演進 一、機器語言(machine language) 二、組合語言(assembly language) 由一堆的「0」或「1」所組成。 對於不同型態的電腦,因為其結構不同就有不同的機器語言。 不容易撰寫外,對於程式的維護也相對的困難。 二、組合語言(assembly language) 使用輔助記憶碼以方便記憶。 不同型態的電腦,其組合語言也是不相同的。 須經由assembler(組譯程式)組譯成機器碼後,才可執行。
程式語言的演進 三、高階語言(high-level language) 四、非常高階語言(very high-level language) 使用人們所熟悉的語法來描述。 大大減低了程式設計的難度,這使得它廣為程式設計師所採用。 須經由compiler(編譯程式)或interpreter(直譯程式)翻譯成機器碼後,才可執行。 四、非常高階語言(very high-level language) 第四代程式語言 (fourth –Generation Language;4GL) 程式設計師只要設定它所要的格式及其結果,這種語言會自動推展出所期望的程式碼。
語言轉譯程式 非常高階語言 高階語言 Interpreter 直譯程式 Compiler 編譯程式 Machine Code 機器程式碼 BASIC 非常高階語言 高階語言 Interpreter 直譯程式 Fortran COBOL PASCAL C C++ BCB Compiler 編譯程式 Machine Code 機器程式碼 ASSEMBLY 組合語言 Assembler 組譯程式 機器語言
語言轉譯程式 對於高階(High Level)語言,您仍得將其翻譯成機械碼才得以執行。 翻譯的方式有兩種: 直譯法(為直譯程式的翻譯方式) 亦即當演講者講了一句後,翻譯員立即將此句翻譯給聽眾,聽眾馬上了解演講者所講的這句話;如此一直到演講者講完為止。 全譯法(為編譯程式的翻譯方式) 亦即讓演講者將整篇講稿講完後,翻譯員才將整篇講稿翻譯出來,而後聽眾才了解整個演講的內容。
語言轉譯程式 直譯器 (Interpreter) 直譯法的優點是: 1.在直譯法下,使用者欲執行程式時,一般是執行一條命令即可。 2.直譯程式該翻譯程式在被使用者使用過程中,一般都儲存在主記憶體,所以當使用者每次執行程式時,不必浪費取出直譯程式的 I/O 時間。 3.由於在直譯法下,使用者不需要執行連結的工作,所以可以省去不少有關連結工作的 I/O 時間。 4.直譯程式在執行時,是採用交談式(Interactive)的方式。亦即使用者可以很容易的與電腦作溝通之工作。
語言轉譯程式 編譯器 (Compiler) 1.產生目的程式 2.產生可執行之機器語言程式 3.執行程式 欲利用編譯器來完成高階語言之翻譯然後執行時,一般需要逐次完成下列三個步驟後,才能完成使用者程式之執行工作。 1.產生目的程式 利用編譯程式將原始程式全部翻譯成機器語言程式,亦即翻譯成目的程式。 2.產生可執行之機器語言程式 利用廠商所提供的連結程式(Linker)執行連結的工作。此時才產生一個可執行的機器語言程式。該可執行的機器語言程式,在IBM PC 下稱之為可執行程式(Executable Program) ,其延伸檔名(Filename Extension)一般為 EXE 或 COM。 3.執行程式 執行使用者程式,亦即執行機器語言程式。
程式語言的應用 科學計算 商業應用 人工智慧 系統程式語言 FORTRAN (Mathematical FORmula TRANslating System) 商業應用 COBOL (Common Business Language) 人工智慧 LISP, Prolog 系統程式語言 C, C++
資料型態 整數型態 浮點數型態 字符型態 陣列型態 int:2 bytes, -32768(-216)~+32767(+216-1) long:4 bytes, -2147483648(-232)~+2147483647(+232-1) 浮點數型態 IEEE-754 單精準度:Sign(1 bit) + Exponent(8 bits) + Mantissa(23 bits) 字符型態 char:1 byte, ASCII 陣列型態 一群具有相同資料型態的變數所組成,如 int A[100] 資料型態可為:整數,浮點數,字符…等。 A[0] A[1] A[2] ……… ……… A[99]
資料型態 紀錄型態 指標型態 又稱為結構型態,存放的是不同類型的資料型態,由一群欄位(Field)所結合而成。 指標型態所存放的值是位址。 完成資料結構的好幫手。 struct scoretable { int id; char name; int score[5]; } student[100] int a; int *p; a=10; P=&a;
變數的範疇(scope) 靜態範疇 動態範疇 副程式sub1並未定義 x 的值為10。 依程式本身,變數的實際位置來決定。 依程式執行時,副程式的呼叫順序來決定。 副程式sub1並未定義 x 的值為10。 如果採用“靜態範疇”規則,印出的 x = ? 為什麼? 如果採用“動態範疇”規則,印出的 x = ? 為什麼? PROGRAM main INTEGER x; PROCEDURE sub1 BEGIN PRINT x; END PROCEDURE sub2 x=20; CALL sub1; x=10; CALL sub2;
副程式參數傳遞法 形式參數 實際參數 副程式本身所定義的參數名稱及型態 呼叫者(主程式)呼叫副程式時,所附上一些該有的參數。 void swap(int a, int b) { int t; t=a; a=b; b=t; } main ( ) int x=5, y=10; swap (x,y); Printf(“%d,%d”.x,y); 形式參數 實際參數
副程式參數傳遞法 Call by Value (傳值) 僅將主程式實際參數的值,copy給副程式的形式參數,主程式實際參數的值不會改變,沒有side effect (副作用) 。 C語言只有call by value void swap(int a, int b) { int t; t=a; a=b; b=t; } main ( ) int x=5, y=10; swap (x,y); Printf(“%d,%d”.x,y); x a 5 5 / 10 t 5 y b 10 10 / 5
副程式參數傳遞法 Call by Address (傳址) 又稱“Call by Reference” 將只程式實際參數的位址,傳給副程式的形式參數,主程式實際參數的值可能改變,有side effect (副作用) 。 C++採用Call by Address void swap(int a, int b) { int t; t=a; a=b; b=t; } main ( ) int x=5, y=10; swap (x,y); Printf(“%d,%d”.x,y); x a t 1500 / 1000 5 / 10 1000 1000 位址 y b 1500 10 / 5 / 1000 1500
副程式參數傳遞法 Call by Name (傳名) 以實際參數的名稱取代形式參數(早期的做法),有side effect(副作用)。 void swap(int a, int b) { int t; t=a; a=b; b=t; } main ( ) int x=5, y=10; swap (x,y); Printf(“%d,%d”.x,y); x / x a 5 / 10 5 / 10 t 5 y b / y 10 / 5 10 / 5
副程式參數傳遞法 Call by Value/Result 取代Call by Address,因為在分散式環境裡,主副程式的address 配置不同,所以不能用Call by Address,有side effect (副作用)。 void swap(int a, int b) { int t; t=a; a=b; b=t; } main ( ) int x=5, y=10; swap (x,y); Printf(“%d,%d”.x,y); x a 10 / 5 5 / 10 t 5 y b 5 / 10 10 / 5
副程式參數傳遞法 Homework_8 請分別以下列參數傳遞法 call by value call by address call by name call by value/result 寫出右列程式之最後輸出結果。 program main(input,output); procedure p(x,y,z); begin y:=y+1; z:=z+x; end; a:=2; b:=3; p(a+b,a,a); print "a=",a; end
副程式參數傳遞法 請分別以下列參數傳遞法 call by value call by address call by name main( ) { int a[5]={2,4,6,8,10}; int x=1; f(x,a[x]); print “x=“, x; print a[0],a[1],a[2],a[3],a[4]; } void f(int i, int j ) i=3; j=100; 請分別以下列參數傳遞法 call by value call by address call by name call by value/result 寫出右列程式之最後輸出結果。