Как Функциональный язык отличается с точки зрения реализации языка

Любой моноширинный шрифт, действительно. Я честно не нахожу, что это имеет значение слишком много мимо этого.

13
задан Svante 7 December 2009 в 09:13
поделиться

6 ответов

Реализации языков функционального программирования используют широкий спектр методов реализации. Прекрасным введением в реализацию Scheme (диалект Лиспа) является эта книга: Lisp in Small Pieces Кристиана Квиннека.

5
ответ дан 2 December 2019 в 00:03
поделиться

Код, полученный на основе функциональных языков, использует многие функции, которые вы видите в той или иной степени в нефункциональных языках. Сборка мусора вошла в обиход. Оптимизация хвостового вызова выполняется в GCC и VC ++ .

Замыкания, однако, являются отличительной чертой функционального программирования. Вы не видите одно без другого. Если вы определяете «функциональные языки» для ссылки только на чистые функциональные языки, эти два не являются синонимами, поскольку вы обнаруживаете замыкания в императивных языках, поддерживающих функциональное программирование (например, Javascript и Scheme (что технически обязательно, хотя функциональная парадигма - это то, что в основном используемый)). Замыкания могут быть реализованы с помощью стека спагетти для стека вызовов или путем копирования локальных переменных при выходе из кадра стека, или выделив локальные переменные в куче и позволив сборщику мусора позаботиться о них.

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

Композиция функций может полагаться на анонимную функцию. Когда компилятор встречает оператор композиции функции f. g , он создает анонимную функцию, которая вызывает два аргумента f и g , передавая результат одного в качестве аргумента другому.

Могут быть реализованы монады. в объектно-ориентированных языках они просто не так необходимы, как в чисто функциональных языках. Монады ввода / вывода не подходят

8
ответ дан 2 December 2019 в 00:03
поделиться

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

Функциональные языки часто используют рекурсию. Так что любая реализация должна попытаться оптимизировать этот случай. Например, идентифицируйте хвостовую рекурсию и преобразуйте в цикл внутренне (таким образом сохраняя накладные расходы на вызов функций, такие как сохранение / восстановление стека). ( http://en.wikipedia.org/wiki/Tail_recursion )

1
ответ дан 2 December 2019 в 00:03
поделиться

Самое большое различие, которое приходит на ум, состоит в том, что функциональные языки, как правило, проектируются так, что исходный код обезуглероживается до математически простого и мощного промежуточного языка. Этот язык обычно содержит лямбда-выражения, вызовы функций, if / else, типы машин, что-то вроде let , и не намного больше. Преобразованный код является глубоко вложенным, подробным и нечитаемым человеком. Синтаксис поверхности отбрасывается.

Компилятор для такого языка, как этот, должен выполнить некоторую встраивание и несколько оптимизаций закрытия, чтобы получить достойный код. (Мне эти базовые оптимизации закрытия кажутся нетривиальными - анализ избегания и т. Д. - но это может быть просто незнание.)

1
ответ дан 2 December 2019 в 00:03
поделиться

Реализация функционального языка программирования, такого как Haskell, часто сильно отличается от реализации императивных языков. Вы можете прочитать об одном из способов сделать это здесь . Несмотря на то, что статье несколько лет, я считаю, что идеи все еще используются.

1
ответ дан 2 December 2019 в 00:03
поделиться

Все работает на одном процессоре (и, следовательно, в одних и тех же инструкциях по сборке), поэтому, пока вы углубляетесь, все внутри остается одинаковым.

0
ответ дан 2 December 2019 в 00:03
поделиться