2013-03-16 144 views
2

這是不是一個真正的哈斯克爾問題可言,但我想有很多的跟隨哈斯克爾標籤誰知道這個問題的答案...人調用堆棧管理

目前我試圖總結我的左右腦可以如何保持功能的輸入輸出局部變量和同一堆棧上臨時值的所有,但對出口的正確棧佈局結束。

通常一個堆棧提供推拉操作,它只修改最上面的堆棧項。有時你也可以隨機讀取進入堆棧下方的物品。 (這解釋瞭如何保持變量並隨機訪問它們。)但通常改變堆棧大小的唯一方法是將項目關閉。如果你想把這個項目放在堆棧的頂部並刪除它下面的東西,那就沒什麼用處了。

如何真正的編譯器一樣東西?

+0

在將東西需要從調用堆棧不是頂部刪除什麼情況? – sepp2k 2013-03-16 11:52:43

+0

@ sepp2k通常你將參數壓入堆棧,調用函數,當它返回時,結果是堆棧中唯一的東西。那麼如果你有大量的爭論,然後是一堆當地人,然後你最終在棧頂建立了結果,那麼在你返回之前,你需要以某種方式查看它下面的所有東西...... – MathematicalOrchid 2013-03-16 11:56:57

回答

2

調用堆棧幀可以只是之前的返回值保留的空間,其中參數去的空間,然後當地人。這就是爲什麼知道這種類型有助於確定預留空間的大小的原因。或者,在像Lisp這樣的動態語言中,指向盒裝值的指針將會到達那裏。它只是特定函數調用協議的一部分。

BTW帶密封蓋的語言運行時堆棧通常是一個樹(見「的Funarg問題」)。

+0

因此,在推動所有其他功能之前,您需要爲返回值預留空間,並且在返回時只刪除除結果之外的所有內容? – MathematicalOrchid 2013-03-17 19:30:40

+0

@MathematicalOrchid我認爲這會奏效,是的。放置在堆棧上的順序不必與實體啓動的時間順序相對應。 – 2013-03-18 00:31:08

2

我不能哈斯克爾直接說話,但一般它的應用程序二進制接口(ABI或)的工作來指定數據如何被傳遞到從功能(稱爲調用約定)。根據調用約定和數據大小,您提到的部分或全部內容可以存儲在寄存器(甚至全局)中而不是堆棧中。而且,調用函數的返回地址以及可能的一些處理器狀態也將被存儲在堆棧上。

舉個例子來說,在OS X IA-32 Function Calling Conventions。堆棧佈局:

OS X IA-32 stack convention

在這調用約定,返回值通常被存儲在寄存器