Haskell(GHC)運行時如何知道在評估完thunk後應該執行哪些代碼?Haskell中的延期與調用堆棧
在概念層面上,它與其他編程語言中的調用堆棧有什麼不同(除了在堆上存儲封閉變量並具有尾遞歸)?
Haskell(GHC)運行時如何知道在評估完thunk後應該執行哪些代碼?Haskell中的延期與調用堆棧
在概念層面上,它與其他編程語言中的調用堆棧有什麼不同(除了在堆上存儲封閉變量並具有尾遞歸)?
與大多數情況一樣,GHC(或者說,GHC RTS)具有正常的調用堆棧。
不同之處在於這個堆棧的內容。它與你所期望的不符。
假設函數foo
調用函數bar
,該函數調用函數baz
。您可能被期待的調用堆棧看起來像
foo
bar
baz
在一些點。但實際上,當foo
調用bar
時,所有「呼叫」確實會創建一個thunk並立即返回。因此bar
不會出現在該堆棧上。但foo
foo
返回一些數據給來電者,並且來電者決定做一些事情,在那一點bar
可能會出現在調用堆棧,即使foo
無處可見。
總之,調用堆棧中的東西順序與誰調用誰無關。這取決於誰看什麼。
那麼最終強制執行thunk的代碼與C調用約定類似嗎?或者它是否使用原則上類似的GHC專用約定(和堆分配堆棧)? – sevo
我在這裏有點超出我的深度,但我相信這是與thiscall不一樣的。 (thunk評估代碼得到一個指向正在評估的thunk的指針,我認爲還有一些其他全局指針也是優化的。)如果你對這個東西感興趣,請查看GHC代碼評論。 – MathematicalOrchid
您是否閱讀過關於GHC如何工作的任何文檔?稍微過時的無骨刺無標籤G機器紙和GHC評論一起涵蓋了這一點。 –
@丹尼爾,我實際上試圖閱讀他們,但退出。像許多人一樣,我通過慢慢整理小部分信息來學習最好。閱讀論文需要對所有提出的概念進行「線性」理解,包括先決條件。我相信這個問題的答案也會幫助其他人在學習Haskell時邁出一步。 – sevo
與現有文獻相比,你希望在這裏回答這個問題時你會做什麼不同的事情?這是一個很大的話題,「一個人必須瞭解先決條件」並不是真的可以通過第二次寫回答來改變。 –