根據這個答案這是什麼意思,一種編程語言是無堆棧的?
所有這些編程語言都無堆疊
- 無堆棧的Python
- PyPy
- Lisp的
- 方案
- 的Tcl
- 的Lua
- 鸚鵡VM
它究竟意味着它們是無堆疊?這是否意味着他們不使用調用堆棧?如果他們不使用調用堆棧,他們使用什麼?
根據這個答案這是什麼意思,一種編程語言是無堆棧的?
所有這些編程語言都無堆疊
它究竟意味着它們是無堆疊?這是否意味着他們不使用調用堆棧?如果他們不使用調用堆棧,他們使用什麼?
這對他們來說意味着什麼是無法堆棧的?這是否意味着他們不使用調用堆棧?
是的,這是正確的。
如果他們不使用調用堆棧,他們使用什麼?
當然,確切的實現方式會因語言而異。在Stackless Python中,有一個調度器使用最上面的框架及其結果啓動Python解釋器。解釋器根據需要逐個處理操作碼,直到達到操作碼CALL_FUNCTION
,這是您即將進入函數的信號。這會導致調度程序使用相關信息構建一個新框架,並使用退繞標誌返回調度程序。從那裏開始,調度員重新開始,將翻譯指向最頂層的框架。
無堆棧語言由於多種原因而避免調用堆棧,但在很多情況下,它被用來使某些編程結構變得更容易實現。規範的是continuations。繼續是非常強大,非常簡單的控制結構,可以表示您可能已經熟悉的任何常用控制結構(while
,do
,if
,switch
等)。
如果這是混亂的,你可能會想嘗試包裝你的頭維基百科的文章周圍,特別是嬌媚延續三明治比喻:
說你在廚房裏是在冰箱的前,想着三明治。你在那裏繼續,並將它粘在你的口袋裏。然後,你從冰箱裏取出一些火雞和麪包,爲自己做一個三明治,現在坐在櫃檯上。你在口袋裏調用延續,你發現自己又站在冰箱前面,想着三明治。幸運的是,櫃檯上有一個三明治,所有用來製作它的材料都沒有了。所以你吃了它。
它們不使用調用堆棧,因爲它們在continuation-passing style中操作。如果您不熟悉尾部呼叫優化,那麼理解這意味着什麼可能是一個好的第一步。
爲了模擬這個模型上的傳統調用/返回,不是推送返回地址,而是期望框架的其餘部分保持不變,調用者關閉其餘代碼和任何仍然需要的變量(其餘部分被釋放)。然後它向被調用者執行一個尾部調用,將這個延續作爲參數傳遞。當被調用者「返回」時,它通過調用這個延續來實現,將返回值作爲參數傳遞給它。
就上述情況而言,這只是一種複雜的函數調用方式。然而,它概括非常漂亮,更復雜的情況:
請參見http://stackoverflow.com/questions/1016218/how-does-a-stackless-language-work/1053159#1053159 – 2009-09-18 02:42:15