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

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