Недавно я углубился в функциональное программирование, особенно в Haskell и F #, а тем более в предыдущую. После некоторых поисков я не смог найти сравнительного сравнения наиболее известных функциональных языков (Scala, F # и т. Д.).
Я знаю, что это не обязательно справедливо по отношению к некоторым языкам (Scala приходит на ум), учитывая, что они являются гибридами, но я просто хочу знать, какие из них превосходят какие по каким операциям и в целом.
CPython
противPyPy
быстро приходит в голову.Ответы:
Согласно игре « Great Benchmarks Game» , ATS быстрее, чем остальные, с Haskell, Scala и одним из вариантов Common Lisp в жесткой схватке за скорость, близкую к этому. После этого Ocaml и F # находятся примерно в одной категории скорости, а Racket и Clojure отстают ...
Тем не менее, почти ничего из этого вообще ничего не значит. Это все вопрос проблемы, машины, компилятора, методов кодирования, а в некоторых случаях просто удачи. Вообще говоря, языки с прямым машинным кодированием, такие как Haskell, будут превосходить языки, скомпилированные в VM, такие как F #, и значительно превосходят чисто интерпретируемые языки. Также обычно статически типизированные языки быстрее, чем динамически типизированные, благодаря статическому анализу, позволяющему вычислять все операции над типами при компиляции, а не во время выполнения. Опять же, это общие правила, всегда будут исключения. «Парадигмы» имеют мало общего с этим.
источник
Следует также отметить, что вы не можете измерить / количественно оценить производительность языка программирования . Лучшее, что вы можете сделать, - это измерить производительность конкретной реализации языка на конкретных платформах, запуская определенные программы.
Поэтому, когда вы спрашиваете о «самом быстром функциональном языке», то, что вы действительно спрашиваете о лучших из текущих реализаций языка (ов).
Комментарий @ igouy поднимает вопрос о том, что существуют другие показатели производительности для языковой реализации; например, время компиляции. Но это не меняет того факта, что время выполнения прикладной программы является (косвенной) мерой реализации языка, а не мерой самого языка.
Рассмотрим Java для примера. Предположим, я пишу однопоточный бенчмарк, используя исключительно языковые возможности классической (Java 1.0) Java. Если я буду компилировать и запускать с использованием JDK 1.0, я получу низкую производительность (потому что JDK 1.0 не имел собственного компилятора кода). Если я перейду с JDK 1.1 на ... JDK 1.7, я, скорее всего, получу прогрессивно лучшие результаты. Но это не из - за изменений в Java язык ... потому что мой тест использует тот же язык подмножество. Скорее ускорение происходит из-за улучшений в компиляторах, системе времени выполнения и / или реализации библиотек классов. Это все вопросы реализации .
Другой момент заключается в том, что эти различия в реализации могут быть действительно значительными (например, порядки величин) для одного и того же языка. Поэтому тот факт, что лучшая реализация для языка X быстрее, чем лучшая (или единственная) реализация языка Y, не обязательно говорит вам многое о самом языке.
источник
Если вы смотрите на языки только по скорости исполнения, вам не хватает некоторых важных моментов. Скорость - это хорошо, но это не единственное.
Haskell использует очень надежную систему типов для создания программ, которые с большей вероятностью будут свободны от ошибок и надежны.
Erlang использует свою встроенную систему мониторинга, чтобы позволить вам создавать системы отказов, которые могут дать вам огромный уровень надежности перед лицом различных типов отказов. Кроме того, Erlang может дать вам уровень параллелизма, который трудно сопоставить на других языках.
По правде говоря, я бы посчитал, что скорость исполнения в наши дни довольно далеко в списке того, что я бы рассмотрел в большинстве случаев. (Хорошо, если бы я делал массивные числовые вычисления, я бы, вероятно, хотел бы использовать фортран для скорости, но в противном случае это просто недостаточно важно, чтобы иметь значение)
источник