2011-07-29 125 views
7

我在Haskell中實現了一個簡單的帶有LLVM作爲其後端的懶惰函數語言。我已經閱讀了Simon Peyton Jones編寫的兩本書(「函數式編程語言的實現」,以及「實現函數式語言:本教程」),並基於此設計實現了G-Machine compiler and interpreter將G-Machine源代碼轉換爲LLVM IR

我現在正在從G-Machine指令生成LLVM IR代碼的問題。主要問題是G-Machine是一個堆棧機器,而LLVM IR是一個註冊機器。因此,爲了將G-Machine轉換成LLVM IR,我必須在LLVM IR中維護某種運行時堆棧(如果我錯了,請糾正我)。我正在考慮使用它的IR指令在LLVM堆棧上分配隨後的堆棧節點,但是我必須以鏈表方式創建堆棧,其中每個堆棧元素都有一個指向前一個堆棧的指針,第一個堆棧元素有一個空指針。然而,這種方法並不是非常優化的,並且在G-Machine的「Push n」操作的情況下,它將具有O(n)而不是優選的O(1)的複雜度。其他想法可能是分配整個內存塊而不是單個單元。

我的問題是你是否看到了解決我的問題的更好/不同的方式。

+1

任何理由不執行的STG機呢?不用說已經有一個從STG到LLVM的編譯器,你可以參考它。 –

+1

那麼,G機很好,很簡單。還有一個經典。 – augustss

回答

9

不要做鏈接列表堆棧,這太瘋狂了。使用固定內存塊。你可以使用一個指針堆棧和一個非指針堆棧,通過指針我指的是指向堆的東西。然後做垃圾收集非常容易,因爲所有的GC根都在指針堆棧上。

在LLVM寄存器中保留一些東西:堆指針,堆限制指針,兩個堆棧指針。

如果幸運的話,LLVM優化器會將低效的堆棧操作變成高效的寄存器操作。