我的编译器在C/C++,OCaml和F#之间犹豫不决

Thi*_*ert 23 c c++ f# ocaml llvm

我想开始研究一个小编译器并构建它我在几种不同语言之间犹豫不决.

我的要求很简单,我希望能够发出LLVM-IR代码,因为我有一个LLVM后端,我想重用它来定位特定的平台.

所以现在我有以下选择:

  1. 使用OCaml和LLVM绑定 - 高效的LLVM附带OCaml绑定,但OCaml(IDE,支持)的编码经验并不是最好的.

  2. 使用C/C++和LLVM绑定 - 我会说最明显的方式,但我想使用一种函数式语言,因为这个主题对我来说是新的,我想学习一些新东西.

  3. 使用F# - 我感觉爱上了这种语言,但没有正式的LLVM绑定.所以我想我可以通过使用System.Reflection.Emit来做同样的事情.即使看起来这里有一个针对LLVM的F#绑定的举措 - https://github.com/keithshep/llvm-fs

我很乐意对此有所了解.

Jon*_*rop 27

元编程是C++的一个真正弱点.你的大部分努力将用于操纵树木.在这种情况下,OCaml和F#的核心优势是在联合类型(而不是函数编程)上进行模式匹配,因为这使得操作树更加容易.从历史上看,OCaml和F#来自ML系列语言,专门针对此应用领域进行了培育.

我通过其OCaml绑定使用LLVM来编写HLVM,其中包括对本机代码的独立和JIT编译,具有多核功能的垃圾收集,外部函数接口,尾调用优化和许多其他功能.经历非常愉快.我唯一的建议是跟踪哪些LLVM功能经过试验和测试,哪些是实验性的,因为您不想依赖任何实验(例如我编写HLVM时的GC支持).

您可以轻松地使用System.Reflection.Emit从F#生成CIL,但显然无法通过这样做来利用您的LLVM后端,当然,您可以免费获得垃圾收集器..NET绑定到LLVM是一种选择.我不熟悉你引用的那些,但是编写绑定到LLVM的C API相对简单.但是,我不确定LLVM在Windows平台上的支持程度如何.

关于OCaml vs F#,两者都有优点和缺点,但我认为在这种情况下总体差异相对较小.由于缺乏通用打印,编写大型联合类型值的函数在OCaml中很繁琐,尽管这可以使用某些第三方宏自动执行.F#提供通用打印,但缺少一些有用的功能,如多态变体和结构类型的对象.