Как работает компилятор Haskell?

Где я могу получить документ /doc/what, который описывает, как работает компилятор Haskell? Я прочитал довольно много документов GHC, но остановился после получения головной боли. Таким образом, что-то, что не требует PhD, чтобы понять это и не написано в стиле You're-to-be-known-known-with-it, было бы предпочтительнее. Это не проблема, если она действительно длинная и занимает некоторое время, чтобы ее понять.

PS: Самое интересное было бы о GHC, но все в порядке.

Ответ 1

Вы можете получить ответ от устья лошади! Саймон Пейтон Джонс (GHC wizard) написал книгу, объясняющую, как реализовать языки функционального программирования. Он доступен бесплатно онлайн, так как теперь он выходит из печати: http://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/

Конечно, GHC продвинулась с момента написания книги, но она по-прежнему очень актуальна.

Ответ 2

Вы ищете подробности о компиляции отложенных вычислений? Существует книга Саймона Пейтона-Джонса, упомянутая Максом Болингброком, а также книга, в которой подробно рассказывается о чистой реализации:

http://wiki.clean.cs.ru.nl/Functional_Programming_and_Parallel_Graph_Rewriting

Если у вас есть университетская принадлежность и вы хотите что-то меньшее, вы можете попытаться получить эти книги (Henderson & Diller, безусловно, уже не в печати):

Антони Диллер "Языки функций компиляции" ISBN 0 471 92027 4

Питер Хендерсон "Применение и внедрение функционального программирования" ISBN 0-13-331579-7

AJT Davie "Введение в системы функционального программирования с использованием Haskell" ISBN 0 521 27724 8

У Diller есть полный компилятор для ленивого языка (реализован в Pascal) через сокращение комбинатора. Это была техника реализации, изобретенная Дэвидом Тернером для SASL. У Хендерсона есть много частей компилятора для LISPkit, миниатюрного, ленивого варианта Lisp. Дэви подробно описывает механизм компиляции ленивого языка, например, описание STG, которое намного короче, чем книга Саймона Пейтона-Джонса (STG - это SPJ абстрактной машины, используемая для Haskell).

Разработчики Clean имеют достаточно информации о внедрении SAPL (Simple Applicative Language), если вы посмотрите их список публикаций:

https://clean.cs.ru.nl/Publications

Наконец, есть целый ряд документов, документирующих аспекты UHC (и EHC) Utrecht Haskell Compiler. Я думаю, что большая часть информации о том, как организован компилятор (с помощью грамматик атрибутов и "Shuffle") и как реализованы системы типов (в EHC существуют разные уровни типов систем), а не о том, как внутренняя "компиляция" работает.

Ответ 3

К сожалению, я подозреваю, что то, что вы ищете, не существует. Теория компилятора и формальная теория языка являются достаточно сложными темами в области компьютерных наук, а Хаскелл отнюдь не является отправной точкой.

Во-первых, вы должны, вероятно, получить хорошее заземление:

Я бы заподозрил, что что-либо, объясняющее что-либо о внутренностях Haskell, потребует значительно лучшего понимания вышеупомянутых тем, чем сказать, C будет.

Я до сих пор принимал один курс по этому вопросу, поэтому у меня нет официальной литературы, рекомендую, но я уверен, что существует много хороших источников.

Ответ 4

Составители - огромный объект, и здесь невозможно полностью объяснить их. Но вот обзор для общего компилятора. Надеюсь, это даст вам некоторое понимание, которое может сделать чтение вещей конкретно о GHC немного легче понять.

Компиляторы обычно работают с помощью ряда преобразований в 2 части, интерфейсные и внешние.

Первое преобразование превращает обычный текст в нечто более легкое, чтобы пройти. Обычно это разделяется на две части:

Лексический анализ или токенизация - акт преобразования простого текста в маленькие фрагменты (обычно это операторы, идентификаторы, литералы и т.д.).

Синтаксический анализ или анализ - превращение этих маленьких кусков в древовидную структуру. (обычно AST, абстрактное дерево синтаксиса)

Следующий этап - семантический анализ. На этом этапе компилятор обычно добавляет информацию в AST (например, информацию о типе) и создает таблицу символов. Это завершает интерфейс.

Следующее преобразование преобразует AST в IR, промежуточное представление. Обычно это форма SSA, одно статическое присваивание.

Затем это оптимизируется с помощью Constant Propagation, Dead code analysis, Vectorisation и т.д.

Последнее преобразование - генерация кода. Преобразование IR в машинный код. Это может быть очень сложно. Это также иногда называют понижением.

Для получения дополнительной информации я рекомендую эту страницу в Википедии.

Ответ 6

Одна из лучших статей на эту тему, которую я прочитал: