Re: [問題] 為什麼local variable的scope不能延及ꐠ…

看板PLT (程式語言與理論)作者 ( )時間17年前 (2008/03/06 20:47), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串8/9 (看更多)
趁 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)

03/06 22:49, , 1F
晚點我在講講一些 dynamic scoping 的經驗... 現在在忙別的
03/06 22:49, 1F
文章代碼(AID): #17p-VVzF (PLT)
討論串 (同標題文章)
文章代碼(AID): #17p-VVzF (PLT)