Компиляция в GHC Core - PullRequest
       49

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

6 голосов
/ 19 января 2012

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

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

Ответы [ 2 ]

9 голосов
/ 20 января 2012

Обратите внимание, что 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.Однако может ли это сработать, во многом зависит от вашего исходного языка.

5 голосов
/ 19 января 2012

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

Вероятно, теоретически возможно построить ядро ​​синтаксиса из вашего представления, используя GHC API, но это звучит очень болезненно. Я бы порекомендовал ориентироваться на какой-нибудь другой бэкэнд. Вы не обязательно должны прекратить использование GHC; Простой Haskell с распакованными типами и unsafeCoerce позволяет вам довольно близко приблизиться к получающемуся Core, чтобы вы могли определить свой собственный простой язык «Core-ish» и скомпилировать его для этого. (Действительно, вы могли бы даже скомпилировать GHC Core сам , но это слишком мета для моих вкусов.)

...