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

Hesitating между C/С++, OCaml и F # для моего компилятора

Я хочу начать работу над небольшим компилятором и построить его. Я колеблюсь между несколькими языками.

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

Итак, сейчас у меня есть следующие варианты:

  • Использовать привязки OCaml и LLVM. Эффективный LLVM поставляется с привязками OCaml, но опыт кодирования с OCaml (IDE, поддержка) не самый лучший.

  • Используйте C/С++ и привязки LLVM. Самый очевидный способ, который я бы сказал, но я хотел бы использовать функциональный язык, поскольку этот вопрос для меня новый, и я хочу узнать что-то новое.

  • Используйте F # - я был влюблен в этот язык, но никаких официальных привязок LLVM нет. Поэтому, я думаю, я мог бы сделать то же самое, используя System.Reflection.Emit. Хотя кажется, что здесь есть инициатива для привязки F # для LLVM - https://github.com/keithshep/llvm-fs

Я бы с удовольствием подумал об этом.

4b9b3361

Ответ 1

Метапрограммирование - это настоящая слабая точка С++. Большая часть ваших усилий будет потрачена, пытаясь управлять деревьями. Основным преимуществом OCaml и F # в этом контексте является сопоставление шаблонов по типам профсоюзов (и не функциональное программирование) именно потому, что это упрощает манипулирование деревьями. Исторически OCaml и F # принадлежали к семейству языков ML и были специально разработаны для этого домена приложения.

Я использовал LLVM через свои привязки OCaml для записи HLVM, который включает как автономную, так и JIT-компиляцию в собственный код, мультив с поддержкой мультикана сбор, интерфейс внешних функций, оптимизация хвостового вызова и многие другие функции. Опыт был очень приятным. Моим единственным советом было бы отслеживать, какие функции LLVM проверены и экспериментальны, потому что вы не хотите зависеть от каких-либо экспериментальных (например, поддержки GC, когда я писал HLVM).

Вы можете легко использовать System.Reflection.Emit для генерации CIL из F #, но вы, очевидно, не сможете использовать ваш LLVM-бэкэнд, сделав это, хотя вы, конечно, получаете сборщика мусора бесплатно. Связи .NET с LLVM - это опция. Я не знаком с теми, которые вы цитируете, но писать привязки к API LLVM C относительно просто. Однако я не уверен, насколько хорошо поддерживается LLVM на платформе Windows.

Что касается OCaml vs F #, у обоих есть преимущества и недостатки, но я бы сказал, что общая разница в этом контексте относительно невелика. Функции записи для печати значений больших типов объединения из-за отсутствия общей печати утомительны в OCaml, хотя это можно автоматизировать с использованием некоторых сторонних макросов. F # предоставляет общую печать, но не содержит некоторых полезных функций, таких как полиморфные варианты и объекты с структурной типизацией.