2009-04-28 61 views
14

根據這個答案這是什麼意思,一種編程語言是無堆棧的?

https://stackoverflow.com/questions/551950/what-stackless-programming-languages-are-available/671296#671296

所有這些編程語言都無堆疊

  • 無堆棧的Python
  • PyPy
  • Lisp的
  • 方案
  • 的Tcl
  • 的Lua
  • 鸚鵡VM

它究竟意味着它們是無堆疊?這是否意味着他們不使用調用堆棧?如果他們不使用調用堆棧,他們使用什麼?

+0

請參見http://stackoverflow.com/questions/1016218/how-does-a-stackless-language-work/1053159#1053159 – 2009-09-18 02:42:15

回答

14

這對他們來說意味着什麼是無法堆棧的?這是否意味着他們不使用調用堆棧?

是的,這是正確的。

如果他們不使用調用堆棧,他們使用什麼?

當然,確切的實現方式會因語言而異。在Stackless Python中,有一個調度器使用最上面的框架及其結果啓動Python解釋器。解釋器根據需要逐個處理操作碼,直到達到操作碼CALL_FUNCTION,這是您即將進入函數的信號。這會導致調度程序使用相關信息構建一個新框架,並使用退繞標誌返回調度程序。從那裏開始,調度員重新開始,將翻譯指向最頂層的框架。

無堆棧語言由於多種原因而避免調用堆棧,但在很多情況下,它被用來使某些編程結構變得更容易實現。規範的是continuations。繼續是非常強大,非常簡單的控制結構,可以表示您可能已經熟悉的任何常用控制結構(whiledoif,switch等)。

如果這是混亂的,你可能會想嘗試包裝你的頭維基百科的文章周圍,特別是嬌媚延續三明治比喻

說你在廚房裏是在冰箱的前,想着三明治。你在那裏繼續,並將它粘在你的口袋裏。然後,你從冰箱裏取出一些火雞和麪包,爲自己做一個三明治,現在坐在櫃檯上。你在口袋裏調用延續,你發現自己又站在冰箱前面,想着三明治。幸運的是,櫃檯上有一個三明治,所有用來製作它的材料都沒有了。所以你吃了它。

10

它們不使用調用堆棧,因爲它們在continuation-passing style中操作。如果您不熟悉尾部呼叫優化,那麼理解這意味着什麼可能是一個好的第一步。

爲了模擬這個模型上的傳統調用/返回,不是推送返回地址,而是期望框架的其餘部分保持不變,調用者關閉其餘代碼和任何仍然需要的變量(其餘部分被釋放)。然後它向被調用者執行一個尾部調用,將這個延續作爲參數傳遞。當被調用者「返回」時,它通過調用這個延續來實現,將返回值作爲參數傳遞給它。

就上述情況而言,這只是一種複雜的函數調用方式。然而,它概括非常漂亮,更復雜的情況:

  1. 例外/最後的/ etc塊很容易模仿 - 如果你可以通過一個「迴歸」的延續作爲參數,你可以通過2(或更多)只如同輕鬆。 lisp-y「條件處理程序」塊(可能會或可能不會將控制權返回給調用者)也很容易 - 爲該函數的其餘部分傳遞一個延續,可能調用或可能不會調用該函數。
  2. 多個返回值同樣很容易 - 通過幾個參數繼續。
  3. 返回臨時/複製不再與函數參數傳遞不同。這通常會使消除臨時對象更容易。
  4. 尾遞歸優化是微不足道的 - 調用者只是傳遞它收到的「返回」延續,而不是捕獲一個新的延期。
相關問題