Большая часть технической информации об архитектуре и подходе системы GHC находится в их вики. Я буду ссылаться на ключевые части и некоторые связанные документы, о которых люди могут не знать.
Какие типичные оптимизации применяются?
Ключевой документ по этому вопросу: Оптимизатор на основе преобразования для Haskell ,
SL Peyton Jones and A Santos, 1998, в которой описывается модель, которую GHC использует для применения сохраняющих тип преобразований (рефакторингов) основного языка, похожего на Haskell, для улучшения использования времени и памяти. Этот процесс называется «упрощение».
Типичные вещи, которые выполняются в компиляторе Haskell, включают:
- Встраивание;
- снижение бета;
- Устранение мертвого кода;
- Преобразование условий: падеж, исключение падежа.
- распаковка;
- Возврат построенного продукта;
- Полная трансформация лени;
- Специализация;
- Это расширение;
- Лямбда-лифтинг;
- Анализ строгости.
А иногда:
- Статическое преобразование аргумента;
- Сборка / складка или слияние потоков;
- Устранение общего подвыражения;
- Специализация конструктора.
Вышеупомянутая статья является ключевым местом, чтобы начать понимать большинство из этих оптимизаций. Некоторые из более простых приведены в более ранней книге Реализация функциональных языков , Саймон Пейтон Джонс и Дэвид Лестер.
Каков порядок выполнения при наличии нескольких кандидатов для оценки
Предполагая, что вы используете однопроцессорный процессор, ответом будет "некоторый порядок, который компилятор выбирает статически на основе эвристики и модели спроса программы". Если вы используете спекулятивную оценку с помощью искр, тогда «какой-то недетерминированный, не по порядку шаблон выполнения».
В общем, чтобы увидеть порядок выполнения, посмотрите на ядро, например, с помощью. инструмент ghc-core . введение в Core находится в главе RWH по оптимизации.
Как изображены громоотводы?
Thunks представлены в виде данных, выделенных кучей, с указателем кода.
См. расположение объектов кучи .
В частности, см. , как изображены громоотводы .
Как используются стек и куча?
Как определено конструкцией G-машины Spineless Tagless G , в частности, со многими модификациями с момента выпуска этой бумаги. В широком смысле, модель исполнения:
- (в штучной упаковке) объекты размещаются в глобальной куче;
- каждый объект потока имеет стек , состоящий из фреймов с таким же расположением, как у объектов кучи;
- когда вы делаете вызов функции, вы помещаете значения в стек и переходите к функции;
- если код должен быть выделен, например конструктор, эти данные помещаются в кучу.
Чтобы глубже понять модель использования стека, см. «Push / Enter против Eval / Apply» .
Что такое CAF?
A «Постоянная аппликационная форма». Например. константа верхнего уровня в вашей программе, выделенная на время выполнения вашей программы. Поскольку они размещаются статически, они должны обрабатываться специально сборщиком мусора .
Список литературы и дальнейшее чтение :