作者scwg ( )
看板PLT
標題Re: [問題] 為什麼local variable的scope不能延及子程序?
時間Thu Mar 6 20:47:25 2008
趁 noctem 老師還沒上線來獻個醜 :p
這個議題的兩種做法分別叫 static scoping 和 dynamic scoping
static 就是 C/C++ 以及目前幾乎所有主流語言處理 local variable 的方式
dynamic scoping 我只知道早年的 lisp 有在用
godfat 大已經提過兩者在實用上的差異
基本上 dynamic scoping 會造成「關注點」分散,
一個 function 的 local variable 會被此 function 以外的程式所更改
比起來 pass by reference 至少會把 reference 傳進去,
是看得到某個變數有機會被改到的
這造成 dynamic scoping 的程式在設計與除錯上非常困難
我再補充兩個這兩種 scoping 的差異
首先, dynamic scoping programming language 的 typing 會變得很複雜
compile 成 machine code 更難:
int main(){
a();
b();
return 0;
}
void a(){
int x = 1; // A
dynamic_scoping();
printf("%d\n", x);
}
void b(){
double x = 1.0; // B
dynamic_scoping();
printf("%f\n", x);
}
void dynamic_scoping(){
x += 2; // C
}
在 C 的地方, 請問 x 的型態是什麼?
如果是在 main() -> a() -> dynamic_scoping()
的情況下, 因為 A, x 是 int
可是在 main() -> b() -> dynamic_scoping() 的設定下就變成 B 處的 double
第二, C 這一行要如何 compile 成 machine code?
如果 x 是 int, 那就用普通的整數加法就可以了,
但是如果是 double 就要用 floating point add 去加 floating point 型式的 2.0
甚至如果 x 是 class, 有 overload += operator, 或根本不支援..
但是, 如果今天上面那個程式不是 compiling language,
而是用 interpreter 去執行的話, 事實上這樣的 interpreter 是比較好實作的!
因為
1. interpreter 本來就會記得每個變數的型態, 所以上第一點就不重要了
2. 既然有 1. 只要根據變數型態很容易判斷 += 該怎麼執行, 所第二點就繞過了
3. 不用 maintain stack, 只要一個 flat namespace, 或一個 hash 就夠了
(雖然這樣 JIT 同樣變得遙不可及...)
(但是這解釋了為什麼早年的 lisp 是 dynamic scoping -- interpreter 好寫)
最後, 類似 interpreter, dynamic scoping language 的 semantics 比較好定義..
不論是 denotational semantics 還是 operational semantics..
(我沒試過 axiomatic semantics, 所以不確定..)
--
A man may die, countries may rise and fall, but an idea lives on.
- John F. Kennedy
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.54
※ 編輯: scwg 來自: 140.112.30.54 (03/06 20:47)
1F:推 godfat:晚點我在講講一些 dynamic scoping 的經驗... 現在在忙別的 03/06 22:49