Каковы компромиссы при выборе языка функционального программирования для использования с LLVM?

Предположим пока, что C ++ не является функциональным языком программирования. Если вы хотите написать компилятор, использующий LLVM для бэкенда, и вы хотите использовать функциональный язык программирования и его привязки к LLVM для выполнения своей работы, у вас есть два варианта, насколько мне известно: Objective Caml и Haskell. Если есть другие, то я тоже хотел бы знать о них.

Я не прошу субъективных мнений, поэтому, пожалуйста, не ставьте этому тегу subjective. Я хочу принять собственное мнение по этому поводу, но я не уверен, что знаю, каковы все компромиссы. Итак, на помощь приходит StackOverflow. Какие компромиссы?


person james woodyatt    schedule 20.11.2009    source источник
comment
Предположим пока, что C ++ не является функциональным языком программирования. Это никогда не было.   -  person R. Martinho Fernandes    schedule 21.11.2009
comment
Это была шутка.   -  person james woodyatt    schedule 21.11.2009
comment
Комментарии dons ниже приводят меня к этому сообщению в блоге о привязках Haskell LLVM, в котором рассказывается многое из того, что я хотел узнать со стороны Haskell: augustss.blogspot.com/2009/01/   -  person james woodyatt    schedule 26.11.2009
comment
Итак, одна из вещей, которые я заметил сейчас, когда я углубляюсь в этот вопрос, заключается в том, что привязки OCaml и Ada, которые распространяются с LLVM, в основном являются просто тонкими оболочками над подмножеством языка C LLVM. Привязки Haskell, написанные моим другом Брайаном О'Салливаном, обогащены очень специфичным для Haskell API поверх оболочек FFI для подмножества языка C LLVM.   -  person james woodyatt    schedule 27.12.2009
comment
Увы, в расширенном API Haskell чего-то не хватает (начиная с версии 0.7.0.0), например: структурные типы (!). С другой стороны, привязки OCaml связаны с LLVM, но это, похоже, ничего не говорит о качестве их синхронизации с основным LLVM API. Я обнаружил ошибки, которые, как я ожидал, отловят модульные тесты. К сожалению нет.   -  person james woodyatt    schedule 27.12.2009
comment
Конечно, conal.net/blog/posts/the-c -language-is-чисто-функциональный   -  person dubiousjim    schedule 23.12.2011
comment
Есть какие-нибудь взгляды на 2020 год? Изменило ли что-нибудь в приведенных ниже ответах / комментариях ситуацию в настоящее время?   -  person    schedule 11.03.2020


Ответы (4)


Либо OCaml, либо Haskell были бы хорошим выбором. Почему бы не ознакомиться с руководствами по LLVM для каждого языка? Учебное пособие по LLVM для OCaml находится здесь: http://llvm.org/docs/tutorial/OCamlLangImpl1.html

В наши дни Haskell набирает обороты, но есть много хороших библиотек синтаксического анализа для OCaml, включая генератор синтаксического анализатора PEG Aurochs, Menhir и генератор парсера GLR Dypgen. Также ознакомьтесь с этой презентацией на pcl, библиотеки монадического комбинатора синтаксического анализатора для OCaml (например, Parsec для Haskell), там есть полезная информация, сравнивающая подходы Haskell и OCaml: http://osp.janestreet.com/files/pcl.pdf

Некоторые скажут, что лень дает Haskell преимущество в синтаксическом анализе, но вы также можете получить лень в OCaml.

person aneccodeal    schedule 21.11.2009
comment
Есть ли где-нибудь учебник по Haskell / LLVM? - person james woodyatt; 22.11.2009
comment
О, и комбинатор монадического синтаксического анализатора в моей библиотеке OCNAE Cf - мое предпочтительное решение синтаксического анализа в OCaml. Я посмотрел на Парсека и был разочарован. Если я выберу Haskell, я, вероятно, перенесу на него свою библиотеку Cf, прежде чем делать что-либо еще. - person james woodyatt; 22.11.2009
comment
На @james augustss.blogspot.com есть длинная серия сообщений о привязках LLVM, включая примеры. Есть несколько других пользователей привязок LLVM (прототип бэкэнда GHC и компилятор лямбда-исчисления, blog.finiteimprobability.com/2009/11/17/ - person Don Stewart; 22.11.2009
comment
@dons спасибо! вот какую информацию я надеялся получить! - person james woodyatt; 26.11.2009

У Haskell есть привязки к LLVM более высокого уровня, чем у OCaml (у Haskell есть некоторые интересные гарантии безопасности типов), а у Haskell гораздо больше библиотек для использования (1700 пакетов на http://hackage.haskell.org), что упрощает склеивание компонентов.

person Don Stewart    schedule 21.11.2009
comment
... некоторые интересные гарантии безопасности типов ... Я хотел бы узнать об этом больше. - person james woodyatt; 22.11.2009
comment
augustss.blogspot.com/2009/ 01 / есть обзор. - person Don Stewart; 22.11.2009

Доступность собственных привязок не должна ограничивать ваш выбор языка. Есть и третий вариант, помимо использования привязок или непосредственной генерации ИК-текста:

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

Ваш внешний интерфейс, реализованный на функциональном языке, затем выполняет то, что он лучше всего умеет, - синтаксический анализ, проверку типов, десугарирование, межъядерные преобразования и т. Д. - а бэкэнд C ++ берет IR от вашего внешнего интерфейса и использует функцию LLVM. -полный по определению собственный C ++ API для понижения с IR на вашем языке до LLVM IR. Это значительно упрощает работу с «расширенными» функциями LLVM, такими как отладочные метаданные.

Я использую эту стратегию с hprotoc и соответствующими привязками Haskell для буферов протокола, и я очень доволен результатами. Об использовании правильного инструмента для работы можно многое сказать!

person Ben Karel    schedule 08.02.2011
comment
Ух ты. Это идея, которая никогда бы мне в голову не пришла. Теперь, когда я столкнулся с этим, я не уверен, что чувствую себя в безопасности, предполагая, что я знаю, что вы имеете в виду, когда говорите, что есть много аргументов в пользу использования [этой стратегии]. Не могли бы вы уточнить? - person james woodyatt; 09.02.2011
comment
Джеймс, я не уверен на 100%, о чем вы просите уточнить ... Но самое последнее предложение было просто общим замечанием о том, что некоторые задачи лучше всего решать с использованием более чем одного инструмента, и в этом нет ничего плохого. Я думаю, что люди иногда забывают, что использовать более одного языка можно! - person Ben Karel; 09.02.2011

OCaml - единственный функциональный язык с привязками в самом дистрибутиве LLVM и документацию на llvm.org, такую ​​как учебник по калейдоскопу. Если при сборке и установке LLVM у вас установлен OCaml, он также автоматически построит и установит привязки LLVM для OCaml. Более того, эти привязки OCaml были в течение многих лет так что они зрелые и надежные.

Я разрабатывал HLVM в OCaml, используя стандартные привязки LLVM, и обнаружил, что OCaml + LLVM является чрезвычайно мощная комбинация. HLVM предоставляет кортежи, массивы, объединения, совокупную стоимость владения всех хвостовых вызовов, общую печать, FFI to C, JIT-компиляцию и параллельную сборку мусора с весом виртуальной машины менее 2kLOC кода OCaml, разработка которого с нуля заняла всего несколько человеко-недель. . Числовая производительность HLVM уже намного превосходит производительность самого быстрого на сегодняшний день открытого исходные FPL, включая сам OCaml. Я опубликовал статьи в OCaml Journal, в которых описывается, как LLVM можно использовать из OCaml для всего, начиная с от базовой оценки выражений до сложных тем, таких как параллелизм и сборка мусора. Вам также может понравиться этот мини-пример.

person J D    schedule 11.12.2009
comment
Но OCaml - не единственный функциональный язык с привязкой к LLVM. Haskell можно скомпилировать в LLVM (cs.uu.nl/wiki/bin / view / Stc / CompilingHaskellToLLVM). Привязки OCaml просто поставляются в качестве примера. - person sastanin; 28.12.2009
comment
@jetxee: Нет, привязки OCaml поставляются не только в качестве примера. Они используются в промышленных проектах на базе LLVM для решения реальных задач. AFAIK, привязки Haskell являются неполными, незрелыми, и с ними никогда не делалось ничего значимого. Компилятор Haskell- ›LLVM, который вы цитируете, фактически использует текстовый интерфейс вместо двоичных привязок для генерации LLVM IR. - person J D; 29.12.2009
comment
Привязки LLVM коммерчески используются в программном обеспечении, которое Леннарт написал для своего работодателя - фактически, как уровень генерации кода для функционального языка программирования. Я уверен, что они очень надежны, хотя в них действительно могут отсутствовать некоторые эзотерические особенности. - person Max Bolingbroke; 11.02.2011
comment
@Max: Интересно. Вы знаете, какую из привязок LLVM использовал Леннарт? - person J D; 11.02.2011
comment
Те, в которые он внес свой вклад, я думаю, это канонические привязки Haskell к LLVM. См. hackage.haskell.org/package/llvm. - person Max Bolingbroke; 14.02.2011