繁体   English   中英

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

[英]When choosing a functional programming language for use with LLVM, what are the trade-offs?

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

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

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中得到懒惰。

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

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

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

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

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

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,从基本表达式评估到高级主题(如并行和垃圾收集)。 你可能也喜欢这个迷你的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM