假設您正在將函數式語言編譯爲便攜式C語言,並且假設您因各種原因需要精確而非保守的垃圾收集。沒有可移植的方式(在一般情況下可能根本沒有辦法)讓垃圾收集器找出C堆棧上的指針和指針。在我看來,這個問題有兩種解決方案:將函數式語言編譯爲C
陰影堆棧。使每個C函數保持關於什麼是和不是指針的簿記信息。這是由例如推薦的方法LLVM。
利用您正在編譯的功能語言,這意味着主線代碼沒有副作用。當分配器檢測到內存不足時,不是調用垃圾收集器本身,而是使用longjmp中止當前操作回到調用垃圾回收器的主循環(在可能包含指針的變量集合已知的上下文中提前)然後重新開始操作。
在我看來,如果你正在處理一個純功能性語言,其中的第二種方法是適用的,它必須比第一種方法更有效,也更容易使用的手寫下
混合我忽略了什麼問題嗎?任何提及此技術的現有討論或實施?
可能沒有幫助,但我試了第一次,同時爲我的計劃解釋程序編寫標記掃描。性能被吸引了,所以我最終得到了一個純粹的虛擬堆棧,它不在C運行時的堆棧之內,主要是因爲跨運行時堆棧自省幾乎是不可能的。性能也很糟糕,但在沒有gdb/ddd的情況下更容易調試。我決定做,因爲這是解釋器,當我到達編譯器的實現階段時(通常沒有完成),我們會解決它。 – Deleted
您打算如何重新啓動當前操作?不時保存檢查點,然後恢復最後一個檢查點(如何?) –
@ n.m .:在這方面問題的重要部分是「代碼沒有副作用」。提問者假設一種純粹的功能語言,所以沒有任何狀態會被修改。沒有必要「檢查」檢查點,當您跳轉到之前的狀態時,您不需要「撤消」任何更改,因爲語言無法進行更改。原則上,您在代碼中的位置告訴您關於程序狀態所需的一切。 –