2012-06-17 34 views
7

我現在正在閱讀SICP,並且沒有真正理解5.5.6中SICP的詞彙尋址中描述的詞彙尋址的必要性。SICP第5章詞彙編址的優點是什麼?

既然說 「因爲我們的語言是詞法​​範圍的,任何表達的運行時環境將有相似之處,其中出現的表達程序的詞法結構的結構」,我覺得它的成本相同的搜索運行時環境中的一個變量,用於在編譯環境中進行搜索。 爲什麼我們打擾實現一個編譯環境? 我認爲編譯環境將具有與程序的詞法結構相同的結構,並且這與運行時環境相同,不是嗎?

回答

10

詞法編址對於加快變量查找非常有用。如果沒有詞彙尋址,查找變量需要遍歷當前環境的框架或其封閉環境的框架等,所有這些都在運行時 - 因爲我們不知道變量綁定在哪裏(如果有的話)。這在書中提到:

我們的編譯器,就像我們迄今爲止實現它一樣,會生成使用評估器機器的lookup-variable-value操作的代碼。這通過將它與當前綁定的每個變量進行比較來搜索變量,通過運行時環境逐幀向外進行處理。如果幀深度嵌套或變量很多,則此搜索可能很昂貴。

相反,對於詞法解決查找程序知道究竟在哪裏可以找到可變的編譯時間,大大減少查找變量所需的時間:

lexical-address-lookup需要作爲參數一個環境和一個由兩個數字組成的詞彙地址:指定要傳遞多少幀的幀編號,以及指定在該幀中傳遞多少變量的位移編號。 Lexical-address-lookup將產生相對於當前環境存儲在該詞彙地址中的變量的值。如果我們將lexical-address-lookup操作添加到我們的機器中,我們可以使編譯器生成使用此操作引用變量的代碼,而不是lookup-variable-value

+1

非常感謝!想想明白了。通過使用這些信息即編譯時可以獲取的詞彙地址來節省運行時間搜索成本。 – user1461328

+0

@ user1461328不客氣!請不要忘記接受您認爲正確的問題的答案,方法是點擊左側的複選標記。 –

+0

是的,我已經接受了。 – user1461328