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

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
мНет описания правки
Строка 1:
'''Дефункционализация''' - в [[язык программирования|программировании]] означает преобразование программы на этапе компиляции заменяющее [[функция высшего порядка|функции высшего порядка]] на вызов одной-единственной функции применения (apply). Эта техника впервые была описана Джоном С. Рейнольдом ({{en|John C. Reynolds}}) в его работе 1972 года, "Определяющие интерпретаторы для языков высшего порядка" ({{en|Definitional Interpreters for Higher-Order Programming Languages}}). Рейнольд отметил, что так как любая конкретная программа содержит конечное количество функциональных абстракций, то любая из этих абстракций может быть заменена уникальным идентификатором. Каждое применение функции в такой программе заменяется вызовом функции apply с идентификатором функции в качестве первого параметра, которая и выполняет связанные с заданным идентификатором операции над оставшимися аргументами.
 
Одним из затруднений для этой идеи состоит в том, что функциональная абстракция может ссылаться на [[свободная переменная|свободные переменные]]. В такой ситуации до выполнения ''дефункционализации'' должен быть выполнен [[лямда-лифтинг]] (конвертация свободных переменных в [[Замыкание_(программирование)|замыкание]]), Таким образом, чтобы любая свободная переменная функциональной абстракции передавалась в качестве аргумента в функцию apply. Кроме того, если замывание поддерживается в качестве [[объект первого класса|значения первого класса]], то необходимо обеспечить создание новых структур данных для представления захваченных значений.