1、1.假設以下的敘述為一未提供“捷徑計算”能力的程式段,試用程式設計的技巧,使此敘述經此改寫的動作後,具有與“捷徑計算”之處理方法相同之處理模式。if and then E1 else E2 endif,if then if then E1 else E2 endifelse E2endif,(1)寫出兩種布耳表式(boolean expression)之AND與OR兩運算子(operator)運算方式並比較兩方法之主要優缺點。(2)比較ADA,C,Pascal等三種程式語言對布耳表式運算方式所提供的機制。,(1)二種作法:a.捷徑計算(short circuit evaluation)的意義:
2、對運算式作求值動作時,無需做完整個運算式即可得出最後的結果,如此的計算方式便稱為捷徑計算。範例:(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.捷徑計算與完全計算之
3、比較:捷徑計算效率較佳,但可能較容易使程式設計師犯下難以除錯之邏輯錯誤;而完全計算則是效率較差,但較不容易使程式設計師犯下難以除錯之邏輯錯誤。,(2)a.ADA利用不同的運算子代表不同之計算,如and與or代表完全計算而and then與or else則代表捷徑計算。b.C採用捷徑計算。c.Pascal採用完全計算。,試問在C語言中,最佳化編譯程式(optimization compiler)是否可以將二元布林運算子(boolean operator)前後的兩項子陳式(sub-expression)互相對調?其理由為何?,因為C語言採用捷徑計算,所以最佳化編譯程式不可以將二元布林運算子前後的兩
4、項子陳式互相對調,否則可能會使得執行結果不唯一。,試說明何以動態儲存區配置允許程式中使用遞迴呼叫(recursive call),而靜態儲存區配置則不允許?,因為若使用靜態儲存區配置則在編譯時就已將記憶體配置好,但是遞迴呼叫則是在執行時才知道會呼叫幾次,因為呼叫次數未定故無法事先配置記憶體空間,所以靜態儲存區配置不允許程式中使用遞迴呼叫,而動態儲存區配置則是執行時才分配記憶體空間,所以允許使用遞迴呼叫。,試指出下列各種語言中何者使用靜態儲存區配置?何者使用動態儲存區配置?SNOBOL,APL,LISP,Pascal的區域變數及全域變數,FORTRAN,COBOL。,(1)靜態儲存區配置:FOR
5、TRAN、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。,在一個程式中,一個變數(varia
6、ble)是一個5-tuple,請逐一解釋這些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)繫於(bindin
7、g)資料名稱之時機若是在執行前為之,此種方式稱為:(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)P
8、ROLOG (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,就儲存繫合(s
9、torage binding)方式而言,應屬那一個變數?(A)靜態(static)變數 (B)堆疊動態(static dynamic)變數 (C)明示堆積動態變數(explicit-dynamic variable) (D)內隱堆積動態變數(implicit-dynamic 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。,