計算機概論 第二版

Download Report

Transcript 計算機概論 第二版

LOGO
計算機概論
第二版
Foundations of Computer Science
Chapter 9 程式語言
歐亞書局
9.1 演化
電腦語言(computer language)就是根據事先定義好的規則
〔語法(syntax)〕,將一組事先定義好的文字組合成程式。
機器語言
在電腦剛發明的年代,唯一可使用的程式語言就是機器語言
(machine languages)。每種電腦都有它自己的機器語言,是
由一堆的 0 與 1 位元流所構成。
電腦唯一懂的語言就是機器語言。
歐亞書局
p.226
表 9.1 二整數相加的機器語言碼
16 進制值
歐亞書局
機器語言碼
p.226
組合語言
隨著程式設計的進展,二進位碼被指令取代,而記憶體位址
則被符號或助憶碼所取代。因為助憶碼集合經組合後取代原
機器語言,所以之後這些助憶碼式語言就被歸類為組合語言
(assembly languages)。
組譯器(assembler)是用來將符號碼轉譯為機器碼的一個特
殊的程式。
歐亞書局
p.227
表 9.2 二整數相加的組合語言程式碼
組合語言碼
歐亞書局
描述
p.227
高階語言
為了增進程式設計師的效能與將焦點由電腦硬體轉為專注於
解決問題本身,於是引導了高階語言(high-level languages)
的發展。
高階語言撰寫的程式可移植到不同電腦執行,這讓程式設計
師可以專注於應用而非錯綜複雜的電腦結構,同樣也可以避
免程式設計師陷入組合語言的細節。高階語言也具有一項組
合語言的特徵,就是都必須轉譯成機器語言,這樣的處理被
稱為直譯或編譯。
歐亞書局
p.227
程式 9.1 使用 C++ 撰寫的加總程式
歐亞書局
p.228
9.2 轉譯
程式一般而言都會以某種高階語言撰寫而成,因此若欲在某
電腦上執行此程式,就必須先轉譯為此電腦相對應的機器語
言。這種以高階語言撰寫的程式被稱為原始程式(source
program),而轉譯後的程式稱為目的程式(object program)。
有兩種轉譯方法:編譯(compilation)與直譯
(interpretation)。
編譯
一般編譯器(compiler)會將整個原始程式轉譯為目的程式。
歐亞書局
p.228
直譯
逐行將原始程式轉譯為對應的目的程式並加以執行的處理過
程。某些電腦語言會使用直譯器(interpreter)將原始程式轉
譯為目的程式。
第一種直譯
早於 Java 語言前的直譯語言,每一行的原始程式會被轉譯為
對應電腦的機器語言並立即執行。
第二種直譯
隨著 Java 出現,採用了新型態的直譯處理。將原始程式轉譯
為目的程式分為兩步驟:編譯與直譯。Java 原始程式首先被
編譯為 Java 位元組碼(byte code),而位元組碼可以在任何
執行 JVM 模擬器的電腦上進行編譯或直譯。
歐亞書局
p.229
圖 9.1 原始程式的轉譯處理
歐亞書局
p.229
語彙分析器(lexical analyzer)將原始碼一個符號接著一個符
號讀入,並產生一串符記(tokens)。
語法分析器(syntax analyzer)將一組符記剖析為指令。
語意分析器(semantic analyzer)檢查由語法分析器產生的句
子,以確保語意不會產生混淆。
由語意分析器所產生的明確指令,每一條都會被轉換為一組
機器語言所構成的指令,以供電腦執行,這項工作會在程式
碼產生器(code generator)完成。
歐亞書局
p.230
9.3 程式設計類型
圖 9.2 程式設計語言的種類
歐亞書局
p.230
程序式類型
程序式類型〔procedural paradigm;或規則式類型(imperative
paradigm)〕可將程式視為主動的代理人,能主動處理被動的
物件。被動的物件無法自行啟動,但可以接受主動代理人發
出的動作。
在程序式類型中的程式是屬於主動代理人,將資料或資料項
視為被動的物件。資料項被儲存於電腦的記憶體中,以供程
式處理。
歐亞書局
p.231
圖 9.3 程序式類型的觀念
歐亞書局
p.231
圖 9.4 程序式程式的組成單元
歐亞書局
p.232
若干程序式語言
FORTRAN〔方程式轉譯程式語言(FORmula TRANslation)
是第一個高階語言。
COBOL〔共通商業導向程式語言(COmmon BusinessOriented Language)是用來當做商業程式設計語言使用。
Pascal 的設計目標在教導程式設計初學者時,可用以強調結
構化程式設計的方法。
C 語言(C language)是為了用來寫作業系統與系統軟體。
Ada 是由美國國防部(DoD)契約承包商所使用的統一語言。
歐亞書局
p.232
物件導向式類型
物件導向式類型(object-oriented paradigm)以處理主動物件
取代被動物件。在日常生中我們經常碰到許多主動物件,執
行在這些物件上的動作都被包含於物件裡,所以物件僅需要
接收外界傳來的適當刺激,就會去執行相關的某個動作。
物件導向式類型的檔案中會包含所有的程序,稱為方法
(methods),也就是會對檔案執行的動作:列印、複製、刪
除等。
歐亞書局
p.234
圖 9.5 物件導向式類型的概念
歐亞書局
p.234
圖 9.6 類別組成單元
歐亞書局
p.235
方法(method) :其格式非常近似於某些程序式語言中的函
式,每個方法都有其標頭、區域變數與其狀態。
繼承(inheritance):在物件導向式類型中,某個物件可以繼
承另一個物件。
多樣性(polymorphism):在相關的類別中,能使用同一個名
字定義出不同的運算,來完成不同的事。
物件導向式語言(object-oriented languages):C++ 與 Java。
歐亞書局
p.235
函式類型
在函式類型(functional paradigm)中的程式被視為數學函式。
在本文中,將函式(function)視為一個黑箱,有一串輸入與
一串輸出。
函式語言(functional language)能:
1. 預先定義一組基本(不可分割的)函式,可以讓任何程式
設計師使用。
2. 允許程式設計師合併基本的函式,產生新的函式。
函式語言範例:LISP 與 Scheme。
歐亞書局
p.237
圖 9.7 函式語言中的函式
歐亞書局
p.237
圖 9.8 從一串列中取出第三個元素
歐亞書局
p.237
宣告式類型
宣告式語言(declarative language)使用邏輯推論的原理來回
覆查詢。一些給定的敘述(事實)被假設為真,使用邏輯推
論的規則去演繹出新的敘述(事實)。
演繹規則:
If (A is B) and (B is C), then (A is C)
兩項事實:
事實 1:蘇格拉底是人類 ====> A is B
事實 2:人類是凡人 ====> B is C
演繹出一個新的事實:
事實 3:蘇格拉底是凡人 ====> A is C
歐亞書局
p.238
著名的宣告式語言之一是 Prolog〔邏輯程式語言
(PROgramming in LOGic),一個 Prolog 程式是由事實與規
則所撰寫而成的,例如,前述有關人類的事實可以陳述為:
人類(約翰)
凡人(人類)
然後使用者可以問
?—凡人(約翰)
接著程式將回覆「是的」。
歐亞書局
p.239
9.4 共通概念
快速導覽某些程序式語言,進而歸納出共通的概念。
識別符號
所有程序式語言甚至其他語言中的一個特徵,那就是物件的
名字──識別符號(identifier)。識別符號可以讓我們在程式
裡為物件命名。只要很簡單的給這些資料不同的識別符號,
然後讓編譯器(compiler)繼續追蹤這些資料實際的位址為何
即可。
歐亞書局
p.239
資料型別
資料型別(data type)定義成一組值(values)與應用於這些
值上的一組運算(operations),每個型別所有可能值構成的
集合就是那個型別的值域。
簡單型別(simple type)無法打破成更小的資料型別。
組合型別(composite type)是一組元素的集合,其中的每個
元素不是屬於簡單型別,就是屬於組合型別(此為遞迴式定
義)。
歐亞書局
p.240
變數
變數(variables)就是將記憶體位置予以命名,在電腦裡每個
記憶體位置都有其位址。以名稱來取代位址,這樣程式設計
師就不用管程式在哪裡被執行的問題。
變數的宣告
在大多數的程序式或物件導向式語言裡,變數在使用前需先
被宣告。宣告(declaration)就是為變數命名。
變數的初始化
雖然儲存在變數中的資料值,在程式執行中可能會有變化。
大多數的程序式語言,允許變數在宣告時就進行初始化。初
始化就是將值存入變數中。
歐亞書局
p.240
定字
定字(literal)在程式中是指預先決定的值,圓的面積π(pi) 的
近似值就被視為一個定字。
常數
常數(constants)就像變數一樣,是一處被命名的記憶體位址,
用來儲存數值。一旦在程式的起始處被定義後其值內容就不
可以改變。
輸入與輸出
大多數程式語言都使用預先定義好的函式來處理輸入與輸出。
表示式
表示式(expression)是一串運算元與運算子所構成。
歐亞書局
p.241
表 9.3 算術運算子
歐亞書局
p.243
表 9.4 關係運算子
歐亞書局
p.243
表 9.5 邏輯運算子
歐亞書局
p.243
敘述
程式中的敘述(statement)用來產生要被執行的動作,它會直
接被翻譯成一個或更多個可執行的電腦指令。
設定敘述(assignment statement)會將某值設定給變數,也就
是將值存入在宣告區內早已被創造出來的某變數中。
複合敘述(compound statement)是一組由若干個(可能沒有
或很多個)敘述所組成的程式碼,它可以被視為程式區塊
(block)。複合敘述允許一群敘述變成單一實體。
歐亞書局
p.244
圖 9.9 二路與多路選擇敘述
歐亞書局
p.245
圖 9.10 三種重複敘述
歐亞書局
p.246
副程式
副程式(subprogram)的概念在程序式語言中是很重要的,因
為副程式會使程式更具結構性。副程式僅需要撰寫一次,就
可以重複叫用好多次去完成特定的任務。
圖 9.11 副程式的概念
歐亞書局
p.246
區域變數
每當副程式被叫用或由副程式返回時,這些區域物件或區域
變數(local variables)就被產生。區域物件是隸屬於副程式。
參數
參數在主程式中被稱為實際參數(actual parameter),而在副
程式稱為形式參數(formal parameter)。程式可藉由兩個方式
將參數傳遞給副程式:
1. 值
2. 參考
歐亞書局
p.247
範例 9.1
假設副程式的任務是完成主程式要求的列印工作。每當主程式想
要列印時,它會將此值傳給副程式列印。在主程式的變數是 X,
而副程式內的變數是 A。由主程式傳給副程式的是變數 X 內的
值,此值會被儲存於副程式內的變數 A 中,接著副程式就會將其
印出。
歐亞書局
p.247
圖 9.12 傳值範例
歐亞書局
p.247
範例 9.2
在範例 9.1 中,由於主程式僅將其值傳給副程式,因此不需要特
意產生一變數,僅需將定字值由主程式傳給副程式即可。換句話
說,主程式可以 print(X) 或 print(5) 呼叫副程式即可。
歐亞書局
p.248
範例 9.3
現實生活中類似傳值的例子。當朋友向你借閱某本書,但該書可
能是絕版書時,珍貴的價值會讓你複製這本書後才借給朋友,因
此任何對副本書的損害都不會影響你的原本書。
傳值方式有個優點:副程式僅接收其值。因此不管有意或無意都
不會改變在主程式中變數的值,然而,一旦主程式需要副程式改
變時,這一點就變成了缺點。
歐亞書局
p.248
範例 9.4
假設主程式有兩個變數 X 與 Y,欲將其值交換。主程式呼叫名為
swap 的副程式完成運算,它將 X 與 Y 的值傳入副程式,此值被儲
存於 A 與 B。副程式 swap 利用變數 T(暫存)完成 A 與 B 的內
容交換動作,但在主程式的變數 X 與 Y 的內容仍然沒變,因此交
換的動作並未達成。
歐亞書局
p.248
圖 9.13 傳值方式無效的範例
歐亞書局
p.248
範例 9.5
倘若我們使用相同的 swap 副程式,但以傳參考方式傳遞變數內
容。X 與 Y 的內容將因此而改變,請見圖 9.14。
圖 9.14 傳參考範例
歐亞書局
p.249