簡體   English   中英

編譯到 GHC 核心

[英]Compiling to GHC Core

我想為一種可以生成 GHC Core 的簡單語言創建一個前端。 然后我想獲取這個輸出並通過正常的 GHC 管道運行它。 根據此頁面,無法直接通過 ghc 命令執行此操作。 我想知道是否有任何方法可以做到這一點。

理想情況下,我期望對 ghc-api 進行一些函數調用,但我也願意接受任何建議,包括(不那么廣泛的)GHC 源代碼中的黑客攻擊。 任何指針都會有所幫助!

請注意,Core 是一種顯式類型的語言,這使得從其他語言生成它變得非常困難(GHC 類型檢查器已推斷出所有類型,因此沒有問題)。 例如,通常的恆等函數(id = \\x -> x :: forall a. a -> a)變成

id = \(a :: *) (x :: a) -> a

其中a是類型為*的類型變量。 它是類型級forall綁定的術語級占位符。 類似地,當調用id你需要給它一個類型作為它的第一個參數,所以 Haskell 表達式(id 42)被轉換為(id Int 42) 此類類型綁定和類型應用程序不會出現在生成的機器代碼中,但它們可用於驗證編譯器轉換是否正確。

從好的方面來說,可能只生成 Haskell —— 如果您可以以 GHC 始終能夠確定其類型的方式生成代碼,那么您實際上只是使用 Haskell 的一個很小的子集。 不過,這是否可行在很大程度上取決於您的源語言。

無論是通過ghc命令還是 API,仍然無法讀取外部核心文件。 對不起 :(

理論上可能可以使用 GHC API 從您的表示中構建核心語法樹,但這聽起來非常痛苦。 我建議針對其他一些后端。 你不一定要停止使用 GHC; 帶有未裝箱類型和unsafeCoerce簡單 Haskell 使您可以非常接近生成的 Core,因此您可以定義自己的簡單“Core-ish”語言並將其編譯為該語言。 (事實上​​,你甚至可以自己編譯 GHC Core ,但這對我的口味來說有點太元了。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM