Чтение GHC Core
Ядро является промежуточным языком GHC. Чтение Core может помочь вам лучше понять производительность вашей программы. Кто-то попросил у меня документацию или учебные пособия по чтению Core, но я не мог найти много.
Какая документация доступна для чтения GHC Core?
Вот что я нашел до сих пор:
4 ответа
GHC Core - это язык System FC, на который переведен весь Haskell. (Приблизительная) грамматика для ядра определяется как:
Ядро тесно связано с более простой и известной Системой F. Все преобразования, которые GHC выполняет на уровне ядра, являются рефакторингами этого представления ядра с сохранением типов для повышения производительности. И, не очень хорошо известно, вы можете писать прямо в Core для программы GHC.
GHC Core вписывается в конвейер компилятора (как это было в 2002 году, sans-LLVM и CMM):
Основными документами, которые необходимо узнать о GHC Core, являются:
- Внешнее представление для основного языка GHC, Толмач, 2001
- ghc / compiler / CoreSyn, само определение GHC
- Секреты компилятора Glasgow Haskell, Peyton Jones and Marlow, 1999. Ядро описано в разделе 2.3, включая подробности аннотаций анализа происшествий.
- Оптимизатор на основе преобразований для Haskell, Peyton Jones and Santos, 1998. Core описан в S3, включая обсуждение полиморфизма и эксплуатационных чтений Core.
Связанный материал, который может помочь пониманию:
- Выход GHC -fext-core
- Я потратил много времени на изучение Core, читая источник GHC. Некоторые из них описаны в моей дипломной диссертации 2002 года, со страницы 16.
- Использование инструмента ghc-core для генерации Core в формате, который мне нравится.
Ядро в свою очередь переводится в код STG, который выглядит примерно так:
Смешные имена в Core закодированы в "Z-кодировке":
Типы и виды сердечника GHC (из статьи Толмача):
Наконец, праймеры GHC регулярно появляются в выводе GHC Core, когда вы оптимизировали свой Haskell до основных инструкций, о которых GHC знает. Набор примопов дается как набор основных функций в предварительно обработанном файле.
Совет: если вас не интересуют аннотации типов и принуждения, используйте -ddump-simpl
вместе с -dsuppress-all
вариант. Вывод Core должен быть намного более читабельным.
Хотя это не совсем основной язык GHC, как упоминает Дон, язык STG очень похож. Недавно я прошел через проверку безопасности типов на языке STG language +, а потом обнаружил, что могу легко понять Core.
Текст, который я использовал для изучения STG, вполне доступен: Внедрение Ленивых Функциональных Языков на Стандартном Оборудовании: G-машина Spineless Tagless от Саймона Пейтона-Джонса. Большая часть статьи посвящена деталям реализации, но я рекомендую раздел 4, в частности, в качестве пояснительного объяснения языка STG, который дает мотивы для некоторых нелогичных проектных решений и обеспечивает переводы знакомых примеров, таких как map
,
"Внешнее представление для основного языка GHC" - это документ, который можно найти в установке ghc (share/doc/ghc/core.pdf
) или в интернете.