Как работает компилятор Haskell?
-
10-10-2019 - |
Вопрос
Где я могу получить бумагу/док/что -то, что описывает, как на самом деле работает компилятор Haskell? Я прочитал довольно много документов GHC, но остановился после головной боли. Таким образом, что-то, что не требует доктора философии, чтобы понять это и не написано в стиле вас, будучи отключенным, будет предпочтительным. Это не проблема, если это действительно долго и занимает некоторое время, чтобы понять это.
PS: Самое интересное было бы что -то в GHC, но все в порядке.
Решение
Вы можете получить ответ от рта лошади! Саймон Пейтон Джонс (GHC Wizard) написал книгу, объясняющую, как реализовать языки функционального программирования. Он доступен бесплатно в Интернете, так как теперь он не в печати: http://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/
Конечно, GHC продолжил с тех пор, как книга была написана, но она все еще очень актуальна.
Другие советы
Вы ищете подробности о компиляции ленивой оценки? Есть книга Саймона Пейтона-Джонса, упомянутая Максом Болингброком, также книга «Детализация Чистота»-онлайн:
http://wiki.clean.cs.ru.nl/functional_programming_and_parallel_graph_rewriting
Если у вас есть университетская принадлежность и хотите что -то меньше, вы можете попытаться получить эти книги (Хендерсон и Диллер, безусловно, не в печати):
Антони Диллер «Языки функции компиляции» ISBN 0 471 92027 4
Питер Хендерсон "Приложение и реализация функционального программирования" ISBN 0-13-331579-7
AJT Davie "Введение в функциональные системы программирования с использованием Haskell" ISBN 0 521 27724 8
Диллер имеет полный компилятор для ленивого языка (реализован в Паскале) через сокращение комбинатора. Это была техника реализации, изобретенная Дэвидом Тернером для SASL. У Хендерсона есть много частей компилятора для Lispkit, миниатюрного, ленивого варианта LISP. Дэви подробно рассказывает о машине для составления ленивого языка, например, есть описание STG, что намного короче, чем книга Саймона Пейтона-Джонса (STG-это Abstract Machine SPJ, используемый для Haskell).
Чистые разработчики имеют немалую информацию об реализации SAPL (простой приемной язык), если вы просматриваете их список публикаций:
https://clean.cs.ru.nl/publications
Наконец, существует множество документов, документирующих аспекты компилятора Utrecht Haskell UHC (и EHC). Я думаю, что большая часть информации заключается в том, как организован компилятор (с грамматикой атрибутов и «перетасовки») и как реализованы типовые системы (существуют различные уровни системы типа в EHC), а не то, как «компиляция» со стороны работает.
К сожалению, я подозреваю, что то, что вы ищете, не существует. Теория компилятора и формальная теория языка являются достаточно сложными темами в информатике, и Хаскелл ни в коем случае не является отправной точкой.
Во -первых, вы, вероятно, должны получить хорошее заземление:
- Лексический анализ: http://en.wikipedia.org/wiki/lexical_analysis
- Расположение: http://en.wikipedia.org/wiki/parsing#programming_languages
- Контекст свободных (и других) грамматических систем (CFG, BNF)
- Генерация кода: http://en.wikipedia.org/wiki/code_generation_(compiler)
Я подозреваю, что все, что объясняет что -либо о внутренних органах Хаскелла, потребует значительно лучшего понимания вышеупомянутых тем, чем скажем, C.
До сих пор я прошел один курс по этому вопросу, поэтому у меня нет официальной литературы, но я уверен, что существует много хороших источников.
Компиляторы являются огромным предметом, и здесь было бы невозможно полностью объяснить их. Но вот обзор для общего компилятора. Надеемся, что это даст вам некоторое понимание, которое может облегчить чтение вещей о GHC немного легче понять.
Компиляторы, как правило, работают серией трансформаций в 2 частях, на переднем и заднем плане.
Первое преобразование превращает простой текст во что -то немного проще. Это само по себе обычно разделено на 2 части:
Лексический анализ или токенизация - Акт преобразования простого текста в небольшие куски (обычно операторы, идентификаторы, литералы и т. Д.).
Синтаксический анализ или анализ - превращение этих маленьких кусков в структуру дерева. (обычно AST, абстрактное синтаксическое дерево)
Следующий этап - семантический анализ. На этом этапе компилятор обычно добавляет информацию в AST (например, информацию типа) и создает таблицу символов. Это завершает фронт.
Следующее преобразование превращает AST в IR, промежуточное представление. Анкет Это обычно, в настоящее время форма SSA, одно статическое назначение.
Затем это оптимизируется посредством постоянного распространения, анализа мертвого кода, векторизации и т. Д.
Последнее преобразование - генерация кода. Преобразование ИК в машинный код. Это может быть очень сложным. Это также иногда называют снижением.
Для получения дополнительной информации я рекомендую Эта страница Википедии.
У Википедии есть хороший - читаемый - обзор внутренних органов ГС (аналогично объяснению @Dan_waterworth, но специфично для Haskell и GHC):
http://en.wikipedia.org/wiki/glasgow_haskell_compiler#architecture
Одна из лучших работ по этой теме, которую я прочитал:
- Компилятор Глазго Хаскелл Саймон Марлоу и Саймон Пейтон-Джонс. Архитектура приложений с открытым исходным кодом.