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

Где я могу найти бумагу / документ / что-то еще, в котором описывается, как на самом деле работает компилятор Haskell? Я прочитал довольно много документов GHC, но остановился, когда у меня заболела голова. Таким образом, предпочтительнее будет то, что не требует наличия докторской степени и написано не в стиле «вы уже знакомы с этим». Это не проблема, если это действительно долго и нужно время, чтобы понять это.

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


person fuz    schedule 08.12.2010    source источник
comment
Отличный вопрос. Особо хотелось бы узнать, используется ли CPS преобразование по схеме или нет. Я твердо верю, что это способ реализации функциональных языков, но, возможно, я упускаю из виду трудности.   -  person Alexandre C.    schedule 08.12.2010
comment
Если вы хотите понять, что такое CPS, отличное чтение лямбда-идеального документа goto от автора схемы.   -  person Alexandre C.    schedule 08.12.2010
comment
Не совсем то, о чем вы просите, но я бы порекомендовал для начала поискать компиляторы, отличные от GHC. Исходный код JHC очень удобен для чтения, а код UHC содержит много хорошей теоретической документации; любой из них будет проще, чем GHC.   -  person John L    schedule 08.12.2010
comment
@John: Хороший момент, я уже пробовал, но обнаружил, что вы полностью потерялись, как только вы действительно не понимаете, что пытается сделать программист.   -  person fuz    schedule 08.12.2010
comment
@Alexandre C. Где его взять?   -  person fuz    schedule 08.12.2010
comment
@FUZxxi: ты даже гугл не пробовал?   -  person Alexandre C.    schedule 08.12.2010
comment
@Alexandre C: Что касается самого вопроса, я это сделал. Но не за ваш комментарий. Я, наверное, должен это сделать.   -  person fuz    schedule 09.12.2010
comment
На вопрос был дан ответ, но без комментариев. Чтобы прояснить ситуацию: нет, @AlexandreC, преобразование CPS не используется, вместо этого используется лямбда-лифтинг для преобразования программы в набор суперкомбинаторов, чтобы сделать возможным сокращение скомпилированного графа. Можно утверждать, что существует эквивалентность между CPS и STG. И сегодня Scheme считается императивным языком. Никакой предварительной докторской степени не требуется, но полный ответ на вопрос требует больше работы, чем докторской степени (хотя и не оригинальной).   -  person migle    schedule 27.11.2015
comment
Одна из лучших статей по этой теме, которую я прочитал, это: «Глазгоский компилятор Haskell» Саймона Марлоу и Саймона Пейтон-Джонса. Архитектура приложений с открытым исходным кодом. aosabook.org/en/ghc.html   -  person The_Ghost    schedule 13.06.2019


Ответы (6)


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

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

person Max Bolingbroke    schedule 08.12.2010
comment
И не забудьте статью stg - Реализация ленивых функциональных языков на стандартном оборудовании: research.microsoft.com/apps/pubs/default.aspx?id=67083 - person sclv; 09.12.2010
comment
И видео, размещенные на вики-странице разработчиков GHC. - person Simon Michael; 09.12.2010

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

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

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

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

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

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

person stephen tetley    schedule 08.12.2010

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

Компиляторы обычно работают с серией преобразований в 2-х частях: интерфейсной и внутренней.

Первое преобразование - превращение простого текста в нечто более легкое для восприятия. Само это обычно делится на 2 части:

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

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

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

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

Затем это оптимизируется с помощью постоянного распространения, анализа мертвого кода, векторизации и т. Д.

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

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

person dan_waterworth    schedule 08.12.2010
comment
Спасибо за ваш комментарий. Обратите внимание, что я специально попросил Haskell, где эти шаги немного сложнее, например. Haskell позволяет использовать новые операторы с произвольным приоритетом, которые превращают синтаксический анализ в догадки, вывод типов и классы, которые, IMHO, делают анализ происходящего довольно сложным и большой набор оптимизаций, чтобы избавиться от лени. Но спасибо за четкий ответ! - person fuz; 08.12.2010

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

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

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

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

person Jamie Wong    schedule 08.12.2010
comment
Я полагаю, вы правы. Просто я хочу понять, что там происходит. ИМХО легче понять, что делает ваша программа, если вы действительно знаете, как она компилируется. - person fuz; 08.12.2010
comment
Ваш ответ не очень полезен. Haskell так отличается от основных языков. - person Wei Hu; 08.12.2010
comment
@FUZxxl, мне симпатична ваша точка зрения; с процедурными языками это очень часто бывает, и особенно с чем-то вроде C. Однако с Haskell расстояние от языка до машины намного больше, поэтому вы тратите гораздо больше времени на размышления в терминах языковой модели. Единственный раз, когда это неправда, - это когда думаешь о производительности. Однако понимание всего компилятора не так много. Узнайте о преобразователях, анализе строгости и промежуточном коде, создаваемом GHC. - person Paul Johnson; 09.12.2010
comment
@Paul Johnson Разве thunks, анализ строгости и промежуточный код не являются одними из основных частей компилятора? Наверное, мне следовало бы спросить об этом, а не обо всем самом чудовище. - person fuz; 09.12.2010
comment
Я имею в виду, что вам нужно изучать концепции, а не алгоритмы. Похоже, способ понять квадратные корни - это понять, что sqrt (x) ^ 2 = x, а не читать о Ньютоне-Рафсоне. - person Paul Johnson; 20.12.2010

В Википедии есть хороший - читаемый - обзор внутреннего устройства GHC (аналогичный объяснению @dan_waterworth, но характерный для Haskell и GHC):

http://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler#Architecture

person amindfv    schedule 18.05.2011

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

  • The Glasgow Haskell Compiler Саймона Марлоу и Саймона Пейтон-Джонса. Архитектура приложений с открытым исходным кодом.
person The_Ghost    schedule 13.06.2019
comment
На этом сайте не приветствуются ответы, содержащие только ссылки. Если вы просто хотите указать на ресурс, сделайте комментарий. - person fuz; 13.06.2019
comment
Хорошо, извините! Просто хотел помочь хорошей статьей по этому вопросу. Я только что добавил комментарий с содержанием этого ответа. - person The_Ghost; 13.06.2019
comment
Прохладный! Спасибо за сотрудничество. - person fuz; 13.06.2019