2015-06-13 92 views
2

Haskell(GHC)運行時如何知道在評估完thunk後應該執行哪些代碼?Haskell中的延期與調用堆棧

在概念層面上,它與其他編程語言中的調用堆棧有什麼不同(除了在堆上存儲封閉變量並具有尾遞歸)?

+3

您是否閱讀過關於GHC如何工作的任何文檔?稍微過時的無骨刺無標籤G機器紙和GHC評論一起涵蓋了這一點。 –

+0

@丹尼爾,我實際上試圖閱讀他們,但退出。像許多人一樣,我通過慢慢整理小部分信息來學習最好。閱讀論文需要對所有提出的概念進行「線性」理解,包括先決條件。我相信這個問題的答案也會幫助其他人在學習Haskell時邁出一步。 – sevo

+3

與現有文獻相比,你希望在這裏回答這個問題時你會做什麼不同的事情?這是一個很大的話題,「一個人必須瞭解先決條件」並不是真的可以通過第二次寫回答來改變。 –

回答

2

與大多數情況一樣,GHC(或者說,GHC RTS)具有正常的調用堆棧。

不同之處在於這個堆棧的內容。它與你所期望的不符。

假設函數foo調用函數bar,該函數調用函數baz。您可能被期待的調用堆棧看起來像

foo 
bar 
baz 

在一些點。但實際上,當foo調用bar時,所有「呼叫」確實會創建一個thunk並立即返回。因此bar不會出現在該堆棧上。但foofoo返回一些數據給來電者,並且來電者決定做一些事情,在那一點bar可能會出現在調用堆棧,即使foo無處可見。

總之,調用堆棧中的東西順序與誰調用誰無關。這取決於誰看什麼。

+0

那麼最終強制執行thunk的代碼與C調用約定類似嗎?或者它是否使用原則上類似的GHC專用約定(和堆分配堆棧)? – sevo

+0

我在這裏有點超出我的深度,但我相信這是與thiscall不一樣的。 (thunk評估代碼得到一個指向正在評估的thunk的指針,我認爲還有一些其他全局指針也是優化的。)如果你對這個東西感興趣,請查看GHC代碼評論。 – MathematicalOrchid