Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

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