180 likes | 379 Vues
程式語言簡介. 程式語言的演進. 一、機器語言 (machine language) 由一堆的 「 0 」或「 1 」 所組成。 對於 不同 型態的電腦,因為其結構不同就有不同的機器語言。 不容易撰寫外,對於程式的維護也相對的困難。 二、組合語言 (assembly language) 使用 輔助記憶碼 以方便記憶。 不同型態的電腦,其組合語言也是不相同的。 須經由 assembler( 組譯程式 ) 組譯成機器碼後,才可執行。. 程式語言的演進. 三、高階語言 (high-level language) 使用人們所熟悉的語法來描述。
E N D
程式語言的演進 一、機器語言(machine language) • 由一堆的「0」或「1」所組成。 • 對於不同型態的電腦,因為其結構不同就有不同的機器語言。 • 不容易撰寫外,對於程式的維護也相對的困難。 二、組合語言(assembly language) • 使用輔助記憶碼以方便記憶。 • 不同型態的電腦,其組合語言也是不相同的。 • 須經由assembler(組譯程式)組譯成機器碼後,才可執行。
程式語言的演進 三、高階語言(high-level language) • 使用人們所熟悉的語法來描述。 • 大大減低了程式設計的難度,這使得它廣為程式設計師所採用。 • 須經由compiler(編譯程式)或interpreter(直譯程式)翻譯成機器碼後,才可執行。 四、非常高階語言(very high-level language) • 第四代程式語言(fourth –Generation Language;4GL) • 程式設計師只要設定它所要的格式及其結果,這種語言會自動推展出所期望的程式碼。
語言轉譯程式 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.產生可執行之機器語言程式 利用廠商所提供的連結程式(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。 • 如果採用“靜態範疇”規則,印出的 x = ? 為什麼? • 如果採用“動態範疇”規則,印出的 x = ? 為什麼? PROGRAM main INTEGER x; PROCEDURE sub1 BEGIN PRINT x; END PROCEDURE sub2 INTEGER x; BEGIN x=20; CALL sub1; END BEGIN x=10; CALL sub2; END
副程式參數傳遞法 • 形式參數 • 副程式本身所定義的參數名稱及型態 • 實際參數 • 呼叫者(主程式)呼叫副程式時,所附上一些該有的參數。 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); } a x 5 5 / 10 t 5 b y 10 / 5 10
副程式參數傳遞法 • 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); } a t x 1500 / 1000 1000 1000 5 / 10 位址 b y 1500 1500 10 / 1000 / 5
副程式參數傳遞法 • 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 a x 5 5 / 10 / 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); } a x 5 5 / 10 10 / t 5 b y 10 / 5 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; begin a:=2; b:=3; p(a+b,a,a); print "a=",a; end
副程式參數傳遞法 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 寫出右列程式之最後輸出結果。