捷徑計算

Download Report

Transcript 捷徑計算

第三章
變數與繫結
陳維魁 博士
[email protected]
儒林圖書公司
大綱









變數的定義
變數元件
儲存區配置問題
參考的透明性
完全計算
捷徑計算
繫結(binding)
繫結時間
精選習題
2
變數的定義

變數是由四個元件所組成

名稱(name)
屬性(attribute)
引用(reference)
值(value)

名稱、位址、值、型態、生命期、領域



3
變數元件

名稱


變數的名字
並非所有的變數都是有名稱的,有的變數是沒
有名稱的,如指標變數(pointer variable)的名稱
僅是引用(reference)該變數的方式,並非真正
的名稱,此類變數稱為不具名變數(anonymous
variable)。
4
變數元件

屬性



屬性即為型態,代表變數的性質
如整數、實數、字元、字串及布林值等等
變數的屬性有的程式語言是在設計程式時決
定,如Pascal;有些則是在執行的時候決定,
如SNOBOL
5
變數元件

引用(位址)


即指變數的儲存位址
詳細內容請見第二節之內容
6
位址


同一個名稱在不同時間可能對應不同變數
位址
別名:不同變數名稱引用同一個記憶體位
址




1程序參數引起 如呼叫SUB(A,A)
2Fortran的EQUIVALENCE 陣列
3可變紀錄:可以用不同攔位名稱來引用同個記
憶體
4指標變數引起,當兩個指標只到同個記憶體
7
位址

別名的優點



共用記憶體節省空間
有效率的存取矩陣元素
缺點


程式的可讀性降低
驗證程式的正確性比較難
8
變數元件

值


變數的值
以C語言的“int x = 1;”敘述來作為範例,此敘
述表示宣告一個名稱為x的變數,其屬性為整
數而值為1,但其在記憶體中的位址則需視系
統是利用靜態儲存區配置或動態儲存區配置才
能決定系統會於何時配置記憶體空間給變數x
使用
9
儲存區配置問題

靜態儲存區配置(static storage allocation)




代表程式執行前,配置記憶體空間給變數
如Fortran,Cobol,Pascal的全域變數與PL/1的static記
憶指令
可加速執行的速度。
動態儲存區配置(dynamic storage allocation)



代表程式執行時,配置記憶體空間給變數
如Algol 60,APL,LISP,Snobol與Pascal的區域變數
可增加執行時的彈性,但執行速度較慢
10
參考的透明性


referential transparency
意義

程式執行的過程中,計算運算式(expression)後, 應
只能得到一個值,不能更改或破壞原來執行的環
境這種現象便是參考的透明性
11
完全計算


complete circuit evaluation
指對運算式作求值動作時,必需做完整個
運算式才可得出最後的結果,如此的計算
方式便稱為完全計算
12
捷徑計算



short circuit evaluation
short cut evaluation
指對運算式(通常是指布林運算式)作求值
動作時,無需做完整個運算式即可得出最
後的結果
13
捷徑計算範例

A1×A2×A3×……×A100


A and B and C


若A1為0,則A1×A2×A3×……×A100之結果為
0,不需將整個運算式計算完畢再決定最後的
結果值
若A為false則運算式的結果為false,不需將整
個運算式計算完畢再決定最後的結果值
A or B or C

只要A為true則整個運算式的結果就為true,不
需將整個運算式計算完畢再決定最後的結果值
14
捷徑計算


各種語言對“捷徑計算”的處理方式
內定(default)法

PASCAL內定採用完全計算




若在程式段中加入“{$B-}”敘述,則在該敘述後之所有布林
運算式將採用捷徑計算
若利用“{$B+}”則可恢復完全計算
C與C++則內定採用捷徑計算
運算子(operator)法

ADA利用AND THEN及OR ELSE代表採用捷徑計算



A OR ELSE B OR ELSE C及A AND THEN B AND THEN
C
AND及OR則是代表採用完全計算
JAVA利用 || 及&&代表採用捷徑計算,而 | 及&則是代表採
用完全計算。
15
例如






PASCAL程式片段
i:=1;
While (i<=n) and(a[i]<>key) do
i:=i+1;
PASCAL採用完全計算,搜尋第n筆後執
行i會變成n+1
判斷條件a[i]<>key仍會執行產生錯誤
16
例如







C語言採用捷徑計算
Void main();
{ int a=1, b=10;
c=((a>1)&&(b++));
}
由於(a>1)不成立,所以(b++)不執行
所以程式最後 b=10, c=0
17
繫結(binding)

意義

繫結是指變數的名稱與其位址,屬性或值相結合
的動作
18
繫結時間

程式語言設計時的繫結




程式語言所提供的所有可能資料型態
所有符號的意義等等
限制撰寫程式所能選擇的項目
程式語言製作時的繫結



所有跟機器相關的特性及變數可能的值
在不同計算機中即使相同的數學運算式,亦可
能得到不同的結果
固定在某種機器上才有的特性,另一台機器可
能就無法執行
19
繫結時間

翻譯時的繫結





編譯時期由設計師指定:如宣告int,則在編譯時繫結到整
數型態
編譯時期由編譯器指定:如x:=x+10, +執行何種型態的相
加,由編譯器決定
載入時期:繫結到指定的變數位址(若採靜態儲存區配置法)
連結時期:變數真正的型態(若採外顯式—explicit 型態法)
在連結時期發生
執行時的繫結


執行時期進入副程式:例如宣告在Pascal副程式的局部變數
繫結
執行時期的任何時刻:例如執行X:=X+10,變數會繫結到新
的值
20
範例
假設“y = x+100;”為一個C語言的敘述(statement),若
a. 以“=”為指定運算子(assignment operator)
”=”是指運算子是符號代表的意義,程式設計時決定,是”程式設計
時的繫結”
b.
以“+”為加法符號
“+”是加法符號代表意義,程式設計時決定,是”程式設計時的繫結”
c.
“+”表示整數加法
等到運算元的型態決定後,才能決定,運算元型態是在編譯時候才能決
定,“翻譯時的繫結”
d.
“100”表示十進位的一百
在程式設計時決定,,是”程式設計時的繫結”
e.
整數100的內部表示法(internal representation)
涉及機器相關的實作問題,是”語言製作時的繫結”
21
繫結時間
f.
100為整數
是符號代表的意義,程式設計時決定,是”程式設計時的繫結”
g.
x, y的型態(type)
編譯時候才能決定,是“翻譯時的繫結”
h.
x, y的值
變數的值通常在執行時決定,是“執行時的繫結”
i.
x, y的位址(address)
變數的位址應該在執行時決定是“執行時的繫結”
j.
x, y可以宣告的型態
變數可能型態在設計時決定,是是”程式設計時的繫結”
22
精選習題

假設以下的敘述為一未提供“捷徑計算”
能力的程式段,請利用程式設計的技巧,
使此敘述經此改寫的動作後,具有與“捷
徑計算”之處理方法相同之處理模式 。
if <A> and <B> then E1 else E2
23
Ans

if <A> then
if <B> then E1
else E2
endif
else E2
endif
24


(1)寫出兩種布耳表式(boolean
expression)之AND與OR兩運算子
(operator)運算方式並比較兩方法之主要
優缺點。
(2)比較ADA,C,Pascal等三種程式語
言對布耳表式運算方式所提供的機制。
25










(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。
捷徑計算與完全計算之比較:
捷徑計算效率較佳,但可能較容易使程式設計師犯下難以除錯之邏輯錯誤;
而完全計算則是效率較差,但較不容易使程式設計師犯下難以除錯之邏輯錯
誤。
26




(2)
a. ADA利用不同的運算子代表不同之計算,如and與or代
表完全計算而and then與or else則代表捷徑計算。
b. C採用捷徑計算。
c. Pascal採用完全計算。
27
精選習題

試問在C語言中,最佳化編譯程式
(optimization compiler)是否可以將二元布
林運算子(boolean operator)前後的兩項子敘
述(sub-expression)互相對調?其理由為何

28
Ans

因為C語言採用捷徑計算,所以最佳化編
譯程式不可以將二元布林運算子前後的兩
項子陳式互相對調,否則可能會使得執行
結果不唯一。
29
精選習題

試說明何以動態儲存區配置允許程式中使
用遞迴呼叫(recursive call),而靜態儲存區
配置則不允許?

30
Ans

因為若使用靜態儲存區配置則在編譯
時就已將記憶體配置好,但是遞迴呼
叫則是在執行時才知道會呼叫幾次,
因為呼叫次數未定故無法事先配置記
憶體空間,所以靜態儲存區配置不允
許程式中使用遞迴呼叫,而動態儲存
區配置則是執行時才分配記憶體空間
,所以允許使用遞迴呼叫。
31
精選習題


試定義何謂靜態型態繫結(static type
binding)及動態型態繫結(dynamic type
binding)
試說明下列的語言,各主要採取何種型態
繫結方式:Fortran,Pascal,Lisp,
APL,Smalltalk。
32
Ans
(1)
靜態資料型態繫結:在編譯時
,指定變數的型態。例:Fortran,
Pascal。
 (2)
動態資料型態繫結:在執行時
,指定變數的型態。例:Lisp,APL
及Smalltalk。

33
練習






參考下列程式,說明可能繫結的位置
main(){
int x,y;
scanf(“%d”,y);
x=y+10;
printf(“x=%d”,x);
34
Ans







程式設計時的繫結各種敘述和符號,如+;
程式語言製作時的繫結,變數x,y可能值
的範圍
程式編譯時的繫結,變數x,y的資料型態
執行載入:繫結目的程式的記憶體位址
執行連結:繫結程式庫的位址
執行進入main():繫結x,y的記憶體
執行時期,y繫結到scanf讀取的值和
35
y+10的值