在模塊級別聲明的函數永遠不會有閉包,並通過LOAD_GLOBAL
訪問非局部變量。全局變量與解除引用變量的實現
聲明的功能而不是在模塊級別可能有閉包並通過LOAD_DEREF
訪問非本地變量,如果這些變量不是全局變量的話。所以基本上我們有三種存儲和加載變量的方法:GLOBAL
(全局),FAST
(本地)和DEREF
(非本地,封閉,覆蓋)。
爲什麼GLOBAL
?如果讓所有函數都關閉,那麼FAST
和DEREF
就足夠了嗎?非局部變量和全局變量之間是否存在一些重要區別?這可能是由於性能問題,因爲也許全局變量(如模塊級定義的所有函數和類(包括它們的方法)加上內建函數)通常比非局部變量更常見?
然後我猜在編譯期間的枚舉過程中,編譯器還會判斷一個變量是否(可能)從一個封閉範圍內訪問,並且在這些情況下使用'STORE_DEREF'而不是'STORE_FAST'。這是正確的嗎? – Hyperboreus
@Hyperboreus是的,它只是搜索作業和非本地聲明。 – delnan
這是否也意味着我需要兩次掃描來編譯一個塊(範圍,幀,我不知道正確的術語)?我的意思是,我需要所有*封閉*塊的信息以便在「STORE_FAST」和「STORE_DEREF」之間做出決定。同時,我需要關於所有*封閉*塊的信息,以便在「LOAD_DEREF」和「LOAD_GLOBAL」之間做出決定。因此編譯一個孩子取決於父母,反之亦然。還是我得到這個錯誤? – Hyperboreus