Компиляция в GHC Core

Я хотел бы создать внешний интерфейс для простого языка, который будет производить GHC Core. Я хотел бы затем взять этот вывод и запустить его через обычный конвейер GHC. Согласно этой странице, это невозможно напрямую из команды ghc. Мне интересно, есть ли способ сделать это.

В идеале я ожидаю несколько вызовов функций для ghc-api, но я также открыт для любых предложений, которые включают (не столь обширный) взлом источника GHC. Любые указатели помогут!

2 ответа

Решение

По-прежнему нет возможности читать файлы External Core, будь то через ghc команда или API. Извини:(

Вероятно, теоретически возможно построить ядро ​​синтаксиса из вашего представления, используя GHC API, но это звучит очень болезненно. Я бы порекомендовал ориентироваться на какой-нибудь другой бэкэнд. Вы не обязательно должны прекратить использование GHC; простой Haskell с распакованными типами и unsafeCoerce позволяет вам довольно близко приблизиться к получающемуся ядру, чтобы вы могли определить свой собственный простой язык "Core-ish" и скомпилировать его для этого. (Действительно, вы могли бы даже скомпилировать само ядро 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. Однако может ли это сработать, во многом зависит от вашего исходного языка.

Другие вопросы по тегам