Чтение ядра GHC

Ядро - промежуточный язык GHC. Чтение ядра может помочь вам лучше понять производительность вашей программы. Кто-то попросил у меня документацию или учебники по чтению Core, но я не мог найти много.

Какая документация доступна для чтения GHC Core?

Вот что я нашел до сих пор:

Ответ 1

GHC Core - это System FC, на который переводится весь Haskell. (Приблизительная) грамматика для Core определяется следующим образом:

enter image description here

Core тесно связан с более простой и более известной системой F. Все преобразования которые GHC делает на уровне Core, являются рефакторингами, поддерживающими сохранение этого представления Core, для повышения производительности. И, не так хорошо известно, вы можете напрямую писать в Core для программирования GHC.

Ядро GHC подходит в конвейере компилятора (как это было в 2002 году, sans-LLVM и CMM):

enter image description here

Основными документами для изучения ядра GHC являются:

Связанный материал, который может помочь понять:

  • GHC -fext-core output
  • Я потратил много времени на изучение Core, прочитав источник GHC. Некоторые из них описаны в моей тезисе бакалавра с 2002 года, со страницы 16.
  • Используя инструмент ghc-core, чтобы генерировать Core в формате, который мне нравится.

Core в свою очередь преобразуется в код STG, который выглядит примерно так:

enter image description here

Смешные имена в Core кодируются в "Z-кодировке":

enter image description here

Типы и виды ядра GHC (из бумаги Толмаха):

enter image description here

Наконец, GHC primops регулярно появляется в выпуске GHC Core, когда вы оптимизировали свой Haskell до базовых инструкций, о которых знает GHC. Набор примитивов задается как набор основных функций в предварительно обработанном файле.

Ответ 2

Совет. Если вам не нужны аннотации и принуждения типа, используйте -ddump-simpl вместе с опцией -dsuppress-all. Вывод Core должен быть намного читабельнее.

Ответ 3

Хотя не совсем язык основного языка GHC, как говорит Дон, язык STG очень похож. Недавно я прошел проверку безопасности типа STG language + machine, и впоследствии я понял, что могу легко понять Core.

Текст, который я использовал для изучения STG, достаточно доступен: Внедрение Lazy Functional Languages ​​на складе Hardware: The Spineless Tagless G-machine от Simon Peyton-Jones. Большая часть статьи посвящена деталям реализации, но я рекомендую раздел 4, в частности, как пояснение языка STG, которое дает мотивацию для некоторых противоречивых дизайнерских решений и предоставляет переводы знакомых примеров, таких как map.

Ответ 4

"Внешнее представление для основного языка GHC" - это документ, который можно найти при установке ghc (share/doc/ghc/core.pdf) или в Интернете.