Синтаксически адаптированы ли некоторые языки функционального программирования для повышения производительности?

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

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

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

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


person Sandeep    schedule 25.05.2009    source источник


Ответы (4)


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

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

person Norman Ramsey    schedule 26.05.2009

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

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

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

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

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

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

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

person Aiden Bell    schedule 25.05.2009
comment
Я не полностью согласен, но я понимаю вашу точку зрения. Например, взгляните на этот документ (citeseerx.ist. psu.edu/viewdoc/summary?doi=10.1.1.45.4503), который ограничивает синтаксис языка, чтобы можно было применить определенные оптимизации. Я полностью понимаю ваш акцент на семантике, но меня не беспокоит реализация синтаксиса A на виртуальной машине B. Допустим, была одна святая виртуальная машина, и у вас были синтаксис-A, синтаксис-B ... синтаксис-N. Какой синтаксис теоретически может довести базовую виртуальную машину до пика? Что касается среды - я ищу одноядерные, настольные приложения. - person Sandeep; 25.05.2009
comment
Думаю, вы упускаете мою точку зрения. Представьте на секунду, что процессор (x86) - это Holy-vm, какой язык может быть скомпилирован в наиболее эффективный машинный код? А теперь представьте, что Holy-vm - это процессор Cell, что теперь? Учитывая, что этой «священной виртуальной машины» не существует, а все среды созданы для того, чтобы хорошо выполнять определенные задачи, вопрос, imho, спорный. Но я готов признать, что, возможно, сам упускаю главное. - person Aiden Bell; 25.05.2009
comment
Цитированная вами статья, похоже, посвящена эффективному переводу синтаксиса в форму SSA. В данном случае речь идет о наилучшем синтаксисе для перевода в эту форму. Я мог бы разработать промежуточную форму на основе бесстековой машины, а затем подумать, какой синтаксис лучше всего подходит для этого. Синтаксис и семантика зависят от контекста. Однозначного ответа нет, если вы не укажете целевую архитектуру и языковую цель. - person Aiden Bell; 25.05.2009

Из записи блога о c и ocaml:

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

Однако дело не столько в синтаксисе.

person miku    schedule 25.05.2009
comment
Очень красивый пример. Но спецификация C99 добавила новое ключевое слово restrict, которое позволяет компилятору C предполагать, что массивы полностью независимы, так что компилятор C99 может генерировать код так же быстро или быстрее, чем OCaml. Здесь прекрасное объяснение: cellperformance.beyond3d.com/ статьи / 2006/05 / - person steveha; 10.11.2009

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

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

person Blindy    schedule 25.05.2009
comment
GHC компилируется только через C на архитектурах, для которых еще не написан генератор машинного кода, или если вы используете флаг -fvia-C. haskell.org/ghc/docs/latest/html/ users_guide / - person Nathan Shively-Sanders; 25.05.2009
comment
Оказывается, вы правы, но взято с той же страницы, которую вы связали, -fasm Использовать генератор собственного кода GHC, а не компилировать через C. Это будет компилироваться быстрее (в два раза быстрее), но может создавать код, который немного медленнее, чем компиляция через C. -fasm по умолчанию .. Последняя часть, кажется, подразумевает, что ghc все еще медленнее, даже если скомпилирован изначально. Я думаю, что моя исходная точка остается в силе. - person Blindy; 25.05.2009
comment
Тот факт, что компилятор компилируется в язык, не означает, что он не может быть быстрее, чем базовый язык. Например, компилятор более высокого уровня может сгенерировать C, который не может создать ни один человек. Это помимо оптимизации более высокого уровня, которая просто не видна в C. - person MichaelGG; 25.05.2009