Я читал книгу «Функциональное программирование для реального мира». Началось со сравнения императивного и функционального языков программирования. И там указывалось, как «значения» и «выражения» в функциональном программировании отличаются от «переменных» и «функций» императивного программирования. Из обсуждения я разработал идею, что -
Функциональные языки программирования имеют больше возможностей для оптимизации времени компиляции, чем их императивные аналоги.
Это правда?
То, что в принципе есть больше возможностей для оптимизации времени компиляции для функциональных языков, чем для их императивных аналогов, вероятно, верно.
Тем не менее, более интересно то, реализованы ли они в современных компиляторах и насколько важны эти оптимизации на практике (т. Е. Конечная производительность идиоматического кода «реальной жизни») в производственной среде с априорно предсказуемыми настройками компилятора).
напр., представления на Haskell для печально известной игры «Тесты компьютерного языка» (как бы плохо это ни было - но это не так, как сейчас, - что-то значительно лучше) создают впечатление, что значительное количество времени было потрачено на ручная оптимизация, которая столкнулась с утверждением о «возможной оптимизации компилятора из-за
insert some property about FP languages here
», заставляет думать, что оптимизации (в настоящее время, по крайней мере) скорее теоретическая возможность, чем актуальная реальность.Я был бы рад, однако, чтобы быть доказанным неправильно в этом пункте.
источник
В функциональном стиле поток значений через программу очень и очень заметен (как для компилятора, так и для программиста). Это дает компилятору много возможностей для решения, где хранить значения, как долго их хранить и так далее.
На императивном языке компилятор обещает программисту модель, в которой большинство переменных соответствуют фактическим местам в памяти, которые остаются в течение определенного времени жизни. Потенциально, любой оператор может читать (или записывать!) Любое из этих мест, поэтому компилятор может только заменить ячейки памяти выделением регистров, объединить две переменные в одно место хранения или выполнить аналогичные оптимизации после тщательного анализа того, где иначе в программе на эту переменную можно ссылаться.
Теперь есть две оговорки:
Но, чтобы ответить на общий вопрос, да, функциональная парадигма дает компилятору большую свободу в оптимизации, которой он не имеет в императивных условиях.
источник
main
функция преобразования состояния, а не то, что использует само состояние.