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

jam*_*att 33 ocaml haskell functional-programming llvm

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

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

ane*_*eal 14

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

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

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

  • @james http://augustss.blogspot.com/在LLVM绑定上有很多帖子,包括示例.LLVM绑定的其他几个用户(原型GHC后端和lambda演算编译器,http://blog.finiteimprobability.com/2009/11/17/a-compiler-for-lambda-calculus-to-llvm-第1部分/ (3认同)
  • 某处有Haskell/LLVM教程吗? (2认同)

Don*_*art 10

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


Ben*_*rel 7

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

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

你的前端以函数式语言实现,然后做它最擅长的 - 解析,类型检查,desugaring,核心到核心的转换等 - 而C++后端从你的前端获取IR并使用LLVM的功能 - 完全定义的本机C++ API,可以从您的语言IR降级到LLVM IR.这使得处理LLVM的"高级"功能(如调试元数据)变得更加容易.

我正在使用此策略hprotoc并将Haskell绑定与协议缓冲区相关联,并对结果非常满意.使用正确的工具来完成工作还有很多东西要说!


Jon*_*rop 6

OCaml是LLVM发行版中唯一具有绑定功能的语言,也是 llvm.org上的文档,例如Kaleidoscope教程.如果在构建和安装LLVM时安装了OCaml,那么它将自动为OCaml构建和安装LLVM绑定.此外,这些OCaml结合已经使用多年,因此它们成熟且可靠.

我一直在使用标准的LLVM绑定在OCaml中开发HLVM,并发现OCaml + LLVM是一个非常强大的组合.HLVM提供元组,数组,联合,所有尾调用的TCO,通用打印,FFI到C,JIT编译和并行垃圾收集,其中VM的重量低于2kLOC的OCaml代码,从头开始只需几个人工作周.HLVM的数值性能已远远超过当今最快的开源FPL,包括OCaml本身.我在OCaml期刊上发表了文章,描述了如何从OCaml中使用LLVM,从基本表达式评估到高级主题(如并行和垃圾收集).你可能也喜欢这个迷你的例子.

  • LLVM绑定在Lennart为雇主编写的软件中商业使用-实际上,它是功能编程语言的代码生成层。我可以肯定它们非常强大,尽管它们确实可能缺少一些深奥的功能。 (2认同)