Дефункционализация: различия между версиями

done
м
(done)
{{редактирую|1=[[Служебная:Contributions/George Shuklin|George Shuklin]]|2=13 августа 2019 |3= 08:42 (UTC)|details=}}
{{переведённая статья|en|Defunctionalization|версия=882420854}}
'''Дефункционализация''' - в [[язык программирования|программировании]] означает преобразование программы на этапе компиляции заменяющее [[функция высшего порядка|функции высшего порядка]] на вызов одной-единственной функции применения (apply). Эта техника впервые была описана Джоном С. Рейнольдом ({{en|John C. Reynolds}}) в его работе 1972 года, "Определяющие интерпретаторы для языков высшего порядка" ({{en|Definitional Interpreters for Higher-Order Programming Languages}}). Рейнольд отметил, что так как любая конкретная программа содержит конечное количество функциональных абстракций, то любая из этих абстракций может быть заменена уникальным идентификатором. Каждое применение функции в такой программе заменяется вызовом функции apply с идентификатором функции в качестве первого параметра, которая и выполняет связанные с заданным идентфикаторомидентификатором операции над оставшимися аргументами.
 
Одним из затруднений для этой идеи состоит в том, что фунциональнаяфункциональная абстракция может ссылаться на [[свободная переменная|свободные переменные]]. В такой ситуации до выполнения ''дефункционализации'' должен быть выполнен [[лямда-лифтинг]] (конвертация свободных перменныхпеременных в [[Замыкание_(программирование)|замыкание]]), Таким образом, чтобы любая свободная перменнаяпеременная функциональной абстракции передавалась в качестве аргумента в функцию apply. Кроме того, если замывание поддерживается в качестве [[объект первого класса|значения первого класса]], то необходимо обеспечить создание новых структур данных для представления захваченных значений.
 
Вместо использования единственной функции apply для обработки всех случаев, могут использоваться различные методы [[Анализ_потока_управления|анализа потока управления]] (включая простейшее различение разных видов [[Арность|арности]] (числа аргументов) или [[сигнатура типа|сигнатур типов]]) для разделения apply на несколько специализированных функций. Альтернативно, язык программирования может поддерживать [[указатель на функцию|указатели на функции]], использование которых может быть более эффективным, чем подход с диспетчеризацией.
 
Помимо использования для компиляции функциональных языков высшего порядка, дефункционализация так же исследовалась как метод механистического преобразования [[интерпретатор]]а в [[абстрактная машина|абстрактную машину]]. Дефункционализация так же связана с техникой представления функций с помощью [[функциональный объект|функциональных объектов]] в [[объектно-ориентированное программирование|объектно-ориентированного программирования]] (как альтернатива использованию замыканий).
<!--
 
Besides its use as a compilation technique for higher-order [[functional languages]], defunctionalization has been studied (particularly by [[Olivier Danvy]] and collaborators) as a way of mechanically transforming [[Interpreter (computing)|interpreters]] into [[abstract machine]]s. Defunctionalization is also related to the technique from [[object-oriented programming]] of representing functions by [[function object]]s (as an alternative to closures).
-->
 
== Пример ==