Чтение GHC Core

193

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

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

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

tibbe
источник
См. Также stackoverflow.com/questions/6048194/…
Дон Стюарт
skillmatter.com/skillscasts/… может быть также полезным.
Эрик Каплун

Ответы:

272

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

введите описание изображения здесь

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

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

введите описание изображения здесь

Основные документы, которые необходимо знать о GHC Core:

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

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

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

введите описание изображения здесь

Смешные имена в Core закодированы в «Z-кодировке»:

введите описание изображения здесь

Типы и виды сердечника GHC (из статьи Толмача):

введите описание изображения здесь

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

Дон стюарт
источник
61
Каждый ответ, который вы даете, всегда смехотворно завершен. Сделайте еще один голос и продолжайте в том же духе; Я склоняюсь кучи.
Роберт Массайоли
3
Объем документации CC-wiki, которую Дон и все сообщество Haskell выпустили через SO, ошеломляет. Продолжайте в том же духе, все!
Дэн Бертон
4
Я знаю, что это упомянуто, но я думаю, что полезность ghc-core должна быть подчеркнута в ответе.
Никита Волков
24

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

nominolo
источник
5
-dsuppress-allдействительно полезно. Вы также можете использовать, -dsuppress-coercionsесли хотите избавиться только от приведений (полезно, когда вокруг много новых типов).
Тиббе
8

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

Текст, который я использовал для изучения STG, вполне доступен: Внедрение Ленивых Функциональных Языков на Стандартном Оборудовании: G-машина Spineless Tagless от Simon Peyton-Jones. Большая часть статьи посвящена деталям реализации, но я рекомендую раздел 4, в частности, в качестве пояснительного объяснения языка STG, который дает мотивы для некоторых нелогичных проектных решений и обеспечивает переводы знакомых примеров, таких как map.

acfoltzer
источник
STG - намного более низкий уровень, чем Core. Конвейер компиляции выглядит так: Haskell -> Core -> STG -> C-- -> Машинный код
Akangka
3

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

Роман Чепляка
источник