Существует ли стандартизированный способ преобразования функционального кода в императивный код? - PullRequest
2 голосов
/ 30 ноября 2011

Я пишу небольшой инструмент для генерации проверок php из кода javascript, и я хотел бы знать, знает ли кто-нибудь о стандартном способе преобразования функционального кода в императивный код? Дефункционализация на работе это довольно хорошо объясняет дефункционализацию.

Lambdalifting и defunctionalization несколько ответили на вопрос, но что касается структур данных, мы все еще анализируем списки, как будто они все связаны списки.Будет ли способ преобразования связанных списков функциональных языков в другие высокоуровневые структуры данных, такие как векторы c ++ или Java-массивы?

Ответы [ 4 ]

3 голосов
/ 30 ноября 2011

Вот несколько дополнений к списку @Artyom:

  • вы можете конвертировать хвостовую рекурсию в циклы и присваивания
  • линейные типы могут использоваться для введения назначений, например y = f x можно заменить на x := f x, если x является линейным и имеет тот же тип, что и y
  • возможны, по крайней мере, два вида нефункционализации: нефункционализация по Рейнольдсу при замене приложения высокого порядка переключателем, заполненным приложениями первого порядка, и встраивание (однако рекурсивные функции не всегда можно встроить)
2 голосов
/ 30 ноября 2011

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

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

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

Добавлено:

Будет ли способ преобразования связанных списков функциональных языков в другие высокоуровневые структуры данных, такие как векторы c ++ или Java-массивы?

Да.Связанные списки представлены с помощью указателей в C ++ (структура «узел» с двумя полями: одно для «полезной нагрузки», другое для «следующего» указателя; пустой список затем представляется как указатель NULL, но иногда люди предпочитают использовать специальные«дозорные ценности»).Обратите внимание: если код на исходном языке не основан на представлении односвязных списков (в реализации на исходном языке), вы также можете реализовать операции «cons» / «nil», используя вектор на целевом языке (неконечно, если это соответствует вашим потребностям, хотя).Идея здесь состоит в том, чтобы дать альтернативные реализации для знакомых операций.

1 голос
/ 30 ноября 2011

Зависит от того, что вам нужно. Обычный ответ - «такого инструмента нет», потому что результат не будет пригодным для использования. Однако посмотрите на это с этой точки зрения:

Набор инструкций ассемблера в компьютере определяет императивный компьютер. Следовательно, компилятор должен сделать такой перевод. Однако я предполагаю, что вы не хотите иметь ассемблерный код, а что-то более читабельное.

Обычно такие виды тяжелых программных преобразований выполняются вручную, если кто-то заинтересован в результате, или автоматически, если результат никогда не будет рассматриваться человеком.

1 голос
/ 30 ноября 2011

Нет, нет.

Причина в том, что не существует таких конкретных и четко определенных вещей, как functional code или imperative code.

Такие преобразования существуют только для конкретных экземпляров.вашей абстракции: например, есть преобразования из кода на Haskell в байт-код LLVM, из кода F # в байт-код CLI или из кода Frege в код Java.

(я сомневаюсь, что есть один из Javascript в PHP)*

...