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