static scoping,可以通過分析/解析源代碼來確定標識符(相對於動態範圍,或多或少需要知道調用者環境)。我的問題是這樣的,因爲靜態範圍只需要解析源代碼來知道範圍和標識符綁定,是在編譯時作出的範圍環境/標識符綁定,還是當每個函數(或新的範圍)被訪問。在靜態(詞法)範圍內,變量/聲明標識符何時綁定?
JavaScript示例:
var globalVar;
function fooFunc() {
var fooVar;
function barFunc() {
var barVar;
}
}
在這個簡單的JavaScript例如,我可以肉眼檢查該barFunc環境將具有barVar的可變程序確定,並具有具有fooVar以及父環境作爲barFunc函數,並且具有globalVar全局範圍的父環境。我很好奇,如果編譯器/解釋器作爲一個整體讀取源代碼並進行綁定,或者如果這些確定是通過函數(或作用域範圍)在函數上進行的話。
如果我不清楚,請告訴我。
謝謝你,
編輯:雖然我的例子是在JavaScript中(我敢particularlly好奇),我也很好奇,如果這個不同(即JavaScript中,C/C++語言之間,C#/ VB等)
您是否知道編譯後的語言(即C/C++)在運行時還是編譯時使這些綁定成爲可能? – contactmatt 2013-02-22 16:17:26
C/C++中局部變量的空間通常保留在調用堆棧中。我不知道內部結構,但我的猜測是在編譯時確定父範圍的偏移量,但實際地址只能在實際調用函數時的運行時確定。 – 2013-02-22 16:22:44