Некоторые языки функционального программирования синтаксически ориентированы на лучшую производительность? - PullRequest
5 голосов
/ 25 мая 2009

Я слышу о многократном увеличении производительности при использовании определенных языков (RoR). Я также слышал о том, что некоторые виртуальные машины более оптимальны, чем другие (GHC?). Третьи пытаются оптимизировать язык по своему выбору, улучшая базовую архитектуру (Unladen Swallow)

Однако, читая статью («SSA - это функциональное программирование»), у меня возник вопрос о том, может ли определенный язык в силу своего синтаксиса (когда-нибудь) быть языком с наилучшей производительностью.

Полагаю, я спрашиваю о том, является ли тот или иной синтаксис ТЕОРЕТИЧЕСКИ лучшим средством для получения лучшего машинного кода. Я был бы очень заинтересован в лежащей в основе теории для любых мнений - я обсуждал это с некоторыми друзьями, и мы обсуждали идеи об информационном содержании определенного синтаксиса.

Пожалуйста, обратите внимание, что я говорю о языках, которые имеют хотя бы первоклассные функции - без ASM, пожалуйста.

Ответы [ 4 ]

3 голосов
/ 25 мая 2009

Из записи в блоге о c vs. ocaml :

Интерпретатор байт-кода Objective-Caml был быстрее, чем тщательно оптимизированная вручную программа C! Зачем? Поскольку компилятор OCaml может распознать, что массивы полностью независимы, ему не нужно беспокоиться об одной итерации цикла, наступающей на значения, используемые другой. Компилятор C не смог применить много полезных оптимизаций, потому что не мог быть уверен, что они верны.

Хотя дело не в синтаксисе.

3 голосов
/ 25 мая 2009

Это очень субъективно

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

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

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

Возможно, вам следует сосредоточиться на том, как обобщенная виртуальная машина или среда может обеспечить наилучшую производительность для широкого спектра семантики. Например, если вы перенесли синтаксис Erlang в JVM, может ли виртуальная машина распознать , что язык был с одним назначением и одновременным без требования блокировок? Может ли это оптимизировать для этого? Виртуальные машины без стека являются хорошим примером попыток сделать эффективную обобщенную среду зависимой от требуемой семантики.

На самом деле вопрос заключается в следующем: может ли среда быть оптимизирована для класса или ограниченного набора семантики, если среда по определению является общей?

Я бы порекомендовал немного узнать о компиляторах (и где синтаксис перестает иметь значение), а затем посмотреть на что-то вроде LLVM, а затем снова задать себе вопрос. Что касается того, насколько функциональные языки больше подходят для производительности, зависит от среды, в которой выполняется перевод (многоядерное, распределенное, небольшое встроенное устройство).

2 голосов
/ 26 мая 2009

Нет. Все функциональные языки, которые стремятся к производительности, переводятся на базовый язык , который напоминает лямбда-исчисление. Базовые языки для разных компиляторов больше похожи друг на друга, чем на оригинальный синтаксис. И любой синтаксис будет скомпилирован в основной язык, из которого он может перейти к нативному коду. Поэтому в компиляторе с собственным кодом , конкретный синтаксис никогда не повлияет на производительность .

Если вы говорите о высокоскоростном однопроходном компиляторе байт-кода, таком как Lua (Lua полностью поддерживает функции первого класса, подобные Scheme), тогда ответ может быть другим - если компилятор предназначен для быстрой компиляции, а не для хорошего кода, вы можете делать что-то с конкретным синтаксисом, повышающим производительность. Один пример может иметь оператор case или switch вместо вложенного if s.

0 голосов
/ 25 мая 2009

Ну, GHC по крайней мере компилирует код на Haskell в C, а затем компилирует его, так что он не может быть быстрее, чем тот же алгоритм, написанный на C, верно? В лучшем случае это может быть столь же эффективно, и это только с хорошим оптимизирующим компилятором. Код, сгенерированный из преобразования Haskell-> C, очень негибкий, большие блоки кода повторяются для каждой инструкции, так что это может быть еще хуже.

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

...