2009-11-20 3 views
27

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

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

+19

«Предположим на данный момент, что C++ не является функциональным языком программирования». Это никогда не было. –

+20

Это была шутка. –

+0

dons comments ниже приводит меня к этому сообщению в блоге о привязках Haskell LLVM, в котором содержится много чего я хотел знать со стороны Haskell: http://augustss.blogspot.com/2009/01/llvm-llvmlow -level-virtual-machine-is.html –

ответ

13

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

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

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

+2

Есть ли учебник Haskell/LLVM где-нибудь? –

+0

О, и комбинатор монадического парсера в моей библиотеке OCNAE Cf является моим предпочтительным решением для синтаксического анализа в OCaml. Я посмотрел на Парсека и был разочарован. Если я поеду с Haskell, я, скорее всего, заберу свою библиотеку Cf, прежде чем я сделаю что-нибудь еще. –

+3

@james http://augustss.blogspot.com/ имеет длинную серию сообщений о связях LLVM, включая примеры. Существует несколько других пользователей привязок LLVM (прототип бэкэнда GHC и компилятор лямбда-исчисления, http://blog.finiteimprobability.com/2009/11/17/a-compiler-for-lambda-calculus-to-llvm- Часть 1/ –

9

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

+0

«... некоторые интересные гарантии безопасности ...» Хотелось бы узнать больше об этом. –

+0

http: /augustss.blogspot.com/2009/01/llvm-llvm-low-level-virtual-machine-is.html имеет обзор. –

6

OCaml - это единственный функциональный язык с bindings in the LLVM distro itself и документация на llvm.org, например Kaleidoscope tutorial. Если у вас установлен OCaml при сборке и установке LLVM, он автоматически создаст и установит привязки LLVM для OCaml. Более того, эти привязки OCaml были in use for years, поэтому они являются зрелыми и надежными.

Я разрабатываю HLVM в OCaml, используя стандартные привязки LLVM и обнаружил, что OCaml + LLVM является чрезвычайно мощной комбинацией. HLVM предоставляет кортежи, массивы, союзы, TCO всех хвостовых вызовов, общую печать, FFI-C, компиляцию JIT и параллельную сборку мусора с VM, весом менее 2kLOC кода OCaml, для чего потребовалось всего несколько человеко-недель для разработки с нуля , HLVM's numerical performance already far exceeds that of today's fastest open source FPLs including OCaml itself. Я опубликовал articles in the OCaml Journal, описывающий, как LLVM можно использовать из OCaml для всего: от оценки базовых выражений до продвинутых тем, таких как параллелизм и сбор мусора. Вам также может понравиться это mini example.

+0

Но OCaml - не единственный функциональный язык с привязками к LLVM. Haskell может быть скомпилирован в LLVM (http://www.cs.uu.nl/wiki/bin/view/Stc/CompilingHaskellToLLVM). Связи OCaml просто отправляются в качестве примера. – sastanin

+1

@jetxee: Нет, привязки OCaml не просто отправляются как Например, они используются в промышленных проектах на основе LLVM для Реальные проблемы. AFAIK, привязки Haskell являются неполными, незрелыми, и с ними никогда не было никакого значения. Компилятор Haskell-> LLVM, который вы цитируете, фактически использует текстовый интерфейс вместо бинарных привязок для генерации LLVM IR. –

+1

Связи LLVM используются в коммерческих целях в программном обеспечении, которое Леннарт написал для своего работодателя - на самом деле, в качестве слоя генерации кода для функционального языка программирования. Я уверен, что они очень надежны, хотя, возможно, им не хватает некоторых эзотерических функций. –

7

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

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

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

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

+0

Ничего себе. Это идея, которая никогда не приходила мне в голову. Теперь, когда я столкнулся с этим, я не уверен, что чувствую себя в безопасности, полагая, что знаю, что вы имеете в виду, когда говорите «есть много чего сказать об использовании [этой стратегии]». Не могли бы вы уточнить? –

+0

Джеймс, я не уверен на 100%, о чем вы просите о разработке ... Но последнее предложение было всего лишь общим замечанием о том, что некоторые задания лучше всего решать с использованием нескольких инструментов, и нет ничего плохого в этом. Я думаю, что иногда люди забывают, что использование нескольких языков является работоспособным! –

 Смежные вопросы

  • Нет связанных вопросов^_^