2012-01-19 72 views
5

我想創建一個可生成GHC核心的簡單語言的前端。然後我想通過正常的GHC管道獲取這個輸出。根據this page,它不是直接可能從ghc命令。我想知道是否有任何方式來做到這一點。編譯爲GHC核心

我希望能夠對ghc-api進行一些函數調用,但我也樂於接受任何包含GHC源代碼的(不那麼廣泛)黑客行爲的建議。任何指針都會有幫助!

+0

「目前(從版本6.8.2開始),GHC無法讀取外部核心文件作爲源文件。」您恐怕必須在_internal_ core中生成一個表示並將其傳遞給GHC。爲了你的緣故,我希望我過於悲觀,但我相信你需要的遠遠不止是對ghc-api的幾個呼叫。 –

回答

5

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

從你的表示中使用GHC API構建核心語法樹可能在理論上是可能的,但這聽起來非常痛苦,我會建議瞄準其他後端,你不一定要停止使用GHC ;使用unboxed類型的簡單Haskell和unsafeCoerce可以讓你得到非常接近的Core,所以你可以定義你自己的簡單的「Core-ish」語言並編譯它(實際上,你甚至可以編譯GHC Core 本身 ,但這對我的口味來說太過分了。)

+1

您可能也有更好的運氣編譯爲Haskell-that-is-essentially-already-Core。 –

9

請注意,Core是一種明確的類型化語言,它可能會使得從其他語言生成相當困難(GHC類型檢查程序有i推薦所有類型,所以它沒有問題)。例如,通常的恆等函數(id = \x -> x :: forall a. a -> a)變得

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

其中a是一種*類型變量。它是類型級別forall綁定的術語級佔位符。同樣,當調用id時,您需要爲其指定一個類型作爲其第一個參數,以便將Haskell表達式(id 42)轉換爲(id Int 42)。這種類型的綁定和類型應用程序不會出現在生成的機器代碼中,但它們對驗證編譯器轉換是否正確很有用。

好的一面,可能只是生成Haskell - 如果你能以GHC總是能夠確定它的類型的方式生成代碼,那麼你基本上只是使用Haskell的一個小子集。不過,這是否可以正常工作取決於您的源語言。