我在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)的複雜度。其他想法可能是分配整個內存塊而不是單個單元。
我的問題是你是否看到了解決我的問題的更好/不同的方式。
任何理由不執行的STG機呢?不用說已經有一個從STG到LLVM的編譯器,你可以參考它。 –
那麼,G機很好,很簡單。還有一個經典。 – augustss