1. 假設以下的敘述為一未提供“捷徑計算”能力的程式

Download Report

Transcript 1. 假設以下的敘述為一未提供“捷徑計算”能力的程式

1. 假設以下的敘述為一未提供
“捷徑計算”能力的程式段,試
用程式設計的技巧,使此敘述經
此改寫的動作後,具有與“捷徑
計算”之處理方法相同之處理模
式。
if <A> and <B> then E1 else
E2 endif
if <A> then
if <B> then
E1
else
E2
endif
else
E2
endif
• (1) 寫出兩種布耳表式(boolean expression)
之AND與OR兩運算子(operator)運算方式
並比較兩方法之主要優缺點。
• (2) 比較ADA,C,Pascal等三種程式語言
對布耳表式運算方式所提供的機制。
• (1) 二種作法:
• a. 捷徑計算(short circuit evaluation)的意義:
對運算式作求值動作時,無需做完整個運算式即可得出最後的結果,
如此的計算方式便稱為捷徑計算。
• 範例:
– (a)
A and B
當A為false時,A and B之結果即為false。
– (b)
A or B
當A為true時,A or B之結果即為true。
• b. 完全計算(complete circuit evaluation)的意義:
對運算式作求值動作時,必需做完整個運算式,可得出最後的結果,
如此的計算方式便稱為完全計算。
• 範例:
– (a)
A and B
當A為false時,仍然必須處理B之值,但結果依然為false。
– (b)A or B
當A為true時,仍然必須處理B之值,但結果依然為true。
• c. 捷徑計算與完全計算之比較:
捷徑計算效率較佳,但可能較容易使程式設計師犯下難以除錯之邏輯
錯誤;而完全計算則是效率較差,但較不容易使程式設計師犯下難以
除錯之邏輯錯誤。
• (2)
a.ADA利用不同的運算子代表不同之計算,
如and與or代表完全計算而and then與or
else則代表捷徑計算。
b. C採用捷徑計算。
c. Pascal採用完全計算。
• 試問在C語言中,最佳化編譯程式
(optimization compiler)是否可以將二元布
林運算子(boolean operator)前後的兩項子
陳式(sub-expression)互相對調?其理由為
何?
•
因為C語言採用捷徑計算,所以最佳化
編譯程式不可以將二元布林運算子前後的
兩項子陳式互相對調,否則可能會使得執
行結果不唯一。
•
試說明何以動態儲存區配置允許程式中
使用遞迴呼叫(recursive call),而靜態儲存
區配置則不允許?
•
因為若使用靜態儲存區配置則在編譯時
就已將記憶體配置好,但是遞迴呼叫則是
在執行時才知道會呼叫幾次,因為呼叫次
數未定故無法事先配置記憶體空間,所以
靜態儲存區配置不允許程式中使用遞迴呼
叫,而動態儲存區配置則是執行時才分配
記憶體空間,所以允許使用遞迴呼叫。
• 試指出下列各種語言中何者使用靜態儲存
區配置?何者使用動態儲存區配置?
SNOBOL,APL,LISP,Pascal的區域變
數及全域變數,FORTRAN,COBOL。
• (1) 靜態儲存區配置:FORTRAN、Pascal
的全域變數與COBOL。
• (2) 動態儲存區配置:SNOBOL、APL、
LISP及Pascal的區域變數。
• (1) 試定義何謂靜態資料型態繫結(static
type binding),及動態資料型態繫結
(dynamic type binding)。
• (2) 試說明下列的語言,各主要採取何種型
態繫結方式:Fortran,Pascal,Lisp,APL,
Smalltalk。
• (1) 靜態資料型態繫結:在編譯時,指定變
數的型態。例:Fortran,Pascal。
• (2) 動態資料型態繫結:在執行時,指定變
數的型態。例:Lisp,APL及Smalltalk。
• 在一個程式中,一個變數(variable)是一個
5-tuple<name、scope、type、l-value、rvalue>,請逐一解釋這些tuples。
• (1) name:代表名稱。
• (2) scope:代表變數可被引用的空間。詳
細內容請參考第六章。
• (3) type:代表型態。
• (4) l-value:代表位址。
• (5) r-value:代表值。
• 1. 把資料的屬性(attribute)繫於(binding)資
料名稱之時機若是在執行程式時為之,此
種方式稱為:(A)動態繫法(dynamic binding)
(B)靜態繫法(static binding) (C)早期繫法
(early binding) (D)隨機繫法(random
binding)。
• 2. 把資料的屬性(Attribute)繫於(binding)資
料名稱之時機若是在執行前為之,此種方
式稱為:(A)動態繫法(dynamic binding) (B)
靜態繫法(static binding) (C)早期繫法(early
binding) (D)隨機繫法(random binding)。
• 3. 程式語言中對變數(variables)之描述不
包含 (A)名稱(name) (B)數值(value) (C)錯
誤訊息(error message) (D)屬性(attribute)。
• 4. 那一種程式語言的原始設計中,變數名
稱與記憶體位置的連結一資料結合(data
binding)在編譯器處理時(compile time)決定?
(A)LISP (B)PROLOG (C)Pascal (D)APL。
• 5. 以下語言在資料類型及儲存的處理上 何
者與另三者不同?請選擇。(A)APL
(B)BASIC (C)C (D)PL/1。
• 6. 以下語言中,有幾種語言之變數採用動
態繫合型態(dynamic binding type) : Lisp、
Scheme、C++、Java?(A)1 (B)2 (C)3
(D)4。
• 7. 陣列(array)的設定採用堆積動態(heap
dynamic)者的語言為何?(A)FORTRAN 77
(B)Pascal (C)Ada (D)FORTRAN 9O。
• 8.在APL中可寫指令L1,2,3,4,5,6;其後又寫L38,
就儲存繫合(storage binding)方式而言,應屬那一
個變數?(A)靜態(static)變數 (B)堆疊動態(static
dynamic)變數 (C)明示堆積動態變數(explicitdynamic variable) (D)內隱堆積動態變數(implicitdynamic variable)。
• 9. 在以下語言中,指出有幾種語言其變數
採用靜態型態繫合(static binding type):
ADA,C,FORTRAN,APL (A)1 (B)2
(C)3 (D)4。
• 10.在處理式子(expression)時,多數語言均
做強制型態檢查(type checking),而接受合
理的混合式子,做強制轉換(coercion),以
下語言何者不做強制轉換。(A)ADA (B)C
(C)C++ (D)FORTRAN。