在选择与LLVM一起使用的函数式编程语言时,有哪些权衡取舍?

时间:2009-11-20 23:40:44

标签: haskell functional-programming ocaml llvm

让我们假设C ++不是一种函数式编程语言。如果您想使用LLVM为后端编写编译器,并且您希望使用函数式编程语言及其与LLVM的绑定来完成您的工作,那么就我所知,您有两个选择:Obj​​ective Caml和Haskell。如果还有其他人,那么我也想知道这些。

我不是要求主观意见,所以请不要给它subjective标签。我想对此做出自己的想法,但我不确定我知道所有的权衡取舍。所以,StackOverflow来救援。有什么权衡取舍?

4 个答案:

答案 0 :(得分:14)

OCaml或Haskell都是不错的选择。为什么不查看每种语言的LLVM教程? OCaml的LLVM教程位于:http://llvm.org/docs/tutorial/OCamlLangImpl1.html

Haskell现在有更多的动力,但OCaml还有很多很好的解析库,包括PEG解析器生成器AurochsMenhir和GLR解析器生成器Dypgen。还可以在pcl上查看这个关于OCaml的monadic解析器组合库的演示文稿(比如Paskc for Haskell),在那里比较Haskell和OCaml的方法有一些很好的信息:http://osp.janestreet.com/files/pcl.pdf

有些人会说懒惰会让Haskell成为解析的边缘,但你也可以在OCaml中得到懒惰。

答案 1 :(得分:9)

Haskell对LLVM的绑定级别高于OCaml(Haskell提供了一些有趣的类型安全保证),而Haskell使用了更多的库(http://hackage.haskell.org上的1700个包),因此更容易将组件粘合在一起。

答案 2 :(得分:7)

本机绑定的可用性无需限制您选择的语言。除了使用绑定或直接生成IR文本之外,还有第三种选择:

您可以使用与语言无关的序列化格式(例如Google的协议缓冲区)作为从前端到后端的桥梁。毕竟,协议缓冲区只是伪装的AST。

你的前端,用函数式语言实现,然后做它最擅长的 - 解析,类型检查,desugaring,核心到核心的转换等 - 而C ++后端从你的前端获取IR使用LLVM的功能完整的原生C ++ API来降低从您的语言IR到LLVM IR。这使得处理LLVM的“高级”功能(如调试元数据)变得更加容易。

我正在使用此策略与hprotoc以及协议缓冲区的关联Haskell绑定,并且非常对结果感到满意。使用合适的工具可以说很多!

答案 3 :(得分:6)

OCaml是唯一具有bindings in the LLVM distro itself的函数式语言和llvm.org上的文档,例如Kaleidoscope tutorial。如果在构建和安装LLVM时安装了OCaml,那么它将自动为OCaml构建和安装LLVM绑定。此外,这些OCaml绑定已in use for years,因此它们成熟且可靠。

我一直在使用标准LLVM绑定在OCaml中开发HLVM,并发现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,描述了如何从OCaml中使用LLVM,从基本表达式评估到高级主题(如并行和垃圾收集)。您可能也喜欢这个mini example