Обобщение / компиляция кода haskell в лямбду - PullRequest
0 голосов
/ 05 октября 2018

Я почти на 90% уверен, что заголовок этого вопроса неправильный, однако я понятия не имею, какой будет правильный заголовок (я с удовольствием отредактирую заголовок, если появятся предложения!).

Читая о Haskell и основных принципах языка, вы всегда обнаруживаете, что это язык "основанный на лямбда-выражениях".Я помню, как где-то читал, что это означает, что в конце, функция main просто «обрабатывается» в одну большую лямбду, все становится встроенным, в основном весь ваш код становится одним огромным лямбда-выражением.

Мои вопросы:

  1. Верно ли то, что я сказал выше?

  2. Если ответ на вопрос 1 - «да»msgstr "есть ли ... декомпилятор / частичный компилятор / препроцессор?Я знаю о этом , который позволяет вам видеть ассемблерный код за такими языками, как C / ++ и Haskell, но есть ли что-нибудь, что я мог бы использовать для изучения сгенерированного лямбда-выражения?

Этот вопрос задается с чисто образовательной точки зрения и не предназначен для поиска решения конкретной проблемы.Я просто хочу узнать больше о языке, который я нахожу чрезвычайно увлекательным.

1 Ответ

0 голосов
/ 05 октября 2018

Давайте сделаем различие между семантикой Haskell и реализацией GHC.Главным образом потому, что мы используем другие термины для языковой семантики, чем для ассемблера, но также потому, что некоторые другие компиляторы могут делать что-то не так, как GHC.

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

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

GHC предоставляет множество опций для печати промежуточных этапов компиляции .Я не уверен, что вы найдете интересным.Ядро - это представление самого низкого уровня, похожее на Haskell.Cmm (также называемый C--) - это представление высшего уровня, похожее на сборку.

...