代码之家  ›  专栏  ›  技术社区  ›  james woodyatt

当选择一种用于LLVM的函数式编程语言时,权衡是什么?

  •  30
  • james woodyatt  · 技术社区  · 16 年前

    让我们假设C++不是一个函数式编程语言。如果您想使用llvm编写一个编译器作为后端,并且想使用一种函数式编程语言及其到llvm的绑定来完成您的工作,那么就我所知,您有两个选择:目标caml和haskell。如果还有其他的,我也想知道。

    我不是在征求主观意见,所以请不要给这个 subjective 标签。我想自己决定这个问题,但我不确定我是否知道所有的权衡。所以,StackOverflow来营救。什么是权衡?

    4 回复  |  直到 15 年前
        1
  •  14
  •   aneccodeal    16 年前

    OCAML或HASKELL是一个不错的选择。为什么不查看每种语言的llvm教程呢?OCAML的LLVM教程如下: http://llvm.org/docs/tutorial/OCamlLangImpl1.html

    haskell现在有了更大的发展势头,但是有很多很好的OCAML解析库,包括peg解析器生成器。 Aurochs , Menhir 和GLR解析器生成器 Dypgen .还可以在PCL上查看此演示文稿,这是一个用于OCAML的单语法分析器组合器库(如用于Haskell的Parsec),其中比较了Haskell和OCAML的方法有一些很好的信息: http://osp.janestreet.com/files/pcl.pdf

    有些人会说,懒惰在解析方面给了haskell优势,但您也可以在ocaml中得到懒惰。

        2
  •  9
  •   Don Stewart    16 年前

    haskell与ocaml相比,对llvm的绑定级别更高(haskell的绑定提供了一些有趣的类型安全保证),而且haskell要使用的库(1700个包 http://hackage.haskell.org )使组件更容易粘合在一起。

        3
  •  7
  •   Ben Karel    15 年前

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

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

    你的前端,用函数语言实现,然后做它最擅长的——解析、类型检查、解析度、核心到核心转换等等。C++后端从你的前端获取IR,并使用LLVM的特性,通过定义本机C++ API完成从你的语言IR到LLVM IR的降低。这使得处理LLVM的“高级”特性(如调试元数据)变得更加容易。

    我用这个策略 hprotoc 和协议缓冲区的相关haskell绑定,以及AM 非常 对结果满意。使用正确的工具完成这项工作有很多话要说!

        4
  •  6
  •   J D    16 年前

    OCAML是唯一一种 bindings in the LLVM distro itself 以及有关llvm.org的文档,如 Kaleidoscope tutorial . 如果在构建和安装llvm时安装了ocaml,那么它也将自动为ocaml构建和安装llvm绑定。此外,这些ocaml绑定 in use for years 所以他们成熟可靠。

    我一直在发展 HLVM 在使用标准llvm绑定的ocaml中,发现ocaml+llvm是一个非常强大的组合。HLVM提供了元组、数组、联合、所有尾调用的TCO、通用打印、FFI到C、JIT编译和并行垃圾收集,其中一个虚拟机的权重低于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 .

    推荐文章