Ответ 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 # предоставляет общую печать, но не содержит некоторых полезных функций, таких как полиморфные варианты и объекты с структурной типизацией.