Давайте сделаем различие между семантикой Haskell и реализацией GHC.Главным образом потому, что мы используем другие термины для языковой семантики, чем для ассемблера, но также потому, что некоторые другие компиляторы могут делать что-то не так, как GHC.
Каждая программа на Haskell определяет main
, что является выражением типа IO ()
.Я не люблю называть это «лямбда-выражением», потому что тип показывает, что это не функция.Определение main
является некоторым вложенным деревом вызовов функций.Даже последовательные строки в блоке do
определяются как вызовы функций (>>)
и (>>=)
.
GHC использует эвристику, чтобы решить, что встроить, чтобы получить наилучшую производительность во время выполнения.Обычно это встроенные небольшие выражения, которые не являются рекурсивными.Я считаю, что система времени выполнения поддерживает стек вызовов функций, которые в настоящее время оцениваются, мало чем отличается от времени выполнения компиляции вызовов функций в Си или других императивных языках.
GHC предоставляет множество опций для печати промежуточных этапов компиляции .Я не уверен, что вы найдете интересным.Ядро - это представление самого низкого уровня, похожее на Haskell.Cmm (также называемый C--) - это представление высшего уровня, похожее на сборку.