Чтение GHC Core


193

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

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

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



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 должен быть намного более читабельным.


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

8

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.