33

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

我不是在征求主观意见,所以请不要给这个subjective标签。我想对此做出自己的决定,但我不确定我是否知道所有的权衡取舍。所以,StackOverflow 来救场了。有哪些取舍?

4

4 回答 4

14

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

如今,Haskell 发展势头强劲,但也有很多优秀的 OCaml 解析库,包括 PEG 解析器生成器AurochsMenhir和 GLR 解析器生成器Dypgen。还可以查看有关 pcl 的演示文稿,一个用于 OCaml 的单子解析器组合库(例如用于 Haskell 的 Parsec),其中有一些很好的信息,比较了 Haskell 和 OCaml 的方法: http: //osp.janestreet.com/files/pcl.pdf

有人会说惰性使 Haskell 在解析方面具有优势,但您也可以在 OCaml 中获得惰性。

于 2009-11-21T03:05:37.593 回答
10

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

于 2009-11-21T19:25:23.510 回答
7

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

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

你的前端,用函数式语言实现,然后做它最擅长的事情——解析、类型检查、去糖、核心到核心的转换等——C++ 后端从你的前端获取 IR 并使用 LLVM 的特性-complete-by-definition 本机 C++ API 用于从您的语言 IR 降低到 LLVM IR。这使得处理 LLVM 的“高级”功能(例如调试元数据)变得更加容易。

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

于 2011-02-08T05:34:13.170 回答
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 Journal 上发表了文章,描述了如何从 OCaml 中将 LLVM 用于从基本表达式评估到并行性和垃圾收集等高级主题的所有内容。你可能也喜欢这个小例子

于 2009-12-11T21:34:44.770 回答