18

LLVM 和常规编译器有什么区别?
它是否更具动态性,因此可用于将通常非常动态的语言(即 Javascript)编译成静态二进制代码?创建一个背后的原则是什么?
我知道编译器的 Dragon Book,但是 LLVM 有这样的东西吗?

编辑:我发现了这个有趣的项目。

4

3 回答 3

26

LLVM 和“常规编译器”之间有一些区别,我假设它的意思是“gcc”:

  • LLVM 专为整个程序分析(也称为链接时间分析)而设计,因此它可以选择将代码编译为“位码”,这是一种以后可以重新分析的格式。
  • LLVM 提供了一个即时编译器 (JIT),以便它可以在程序运行时重新分析程序,就像 JVM 一样。
  • LLVM 设计得非常好:
    • 它的组件是模块化的并且分离良好,
    • 它的中间表示有 3 种格式(文本、二进制和内存中表示),它们是等效的,
    • 它的中间表示使用SSA形式,
    • 它的中间表示具有类型系统。

至于 Javascript 和其他动态语言,我们从动态语言社区中看到了很多对 LLVM 的兴趣,Python 和 Ruby 实现正在尝试。但是,这些并不是试图成为静态编译器。他们专注于使用 JIT。特别是,他们正在使用“混合模式解释器”优化长时间运行的可执行文件,它们最初解释程序,然后在运行时使用 LLVM 编译它们。我还没有看到使用 LLVM 的 javascript 引擎,但可能有一个。它只是不会创建静态可执行文件,除非在不寻常的情况下,或用于 Javascript 的缩减版本。

至于创建 LLVM 的原因,它是作为Vikram Adve研究小组终身编译(即 JIT 和链接时间优化)工作的一部分开始的。在获得博士学位后,Chris Lattner 搬到了 Apple,这极大地推动了该项目(可能是因为它是 BSD 许可的,这导致他们过去使用 gcc,即 GPL 时出现问题)。

于 2009-09-14T19:19:11.050 回答
5

没什么,它是一个常规的编译器。创建它的主要原因是为编译器研究创建一个平台。因此,它被设计成非常模块化的,这样您就可以在编译器中处理您的研究的那部分工作,而不必担心编译器的其他部分。没有龙编译器,就像没有 LLVM 书一样(你在龙书或任何其他编译器书中读到的任何理论都应该直接适用)。事实上,虽然我有一段时间没有关注 LLVM,但他们的文档非常糟糕。

于 2009-09-14T11:14:29.703 回答
2

我根本不是开发人员,但是:即使 gpl 迫使 NeXt 在 80 年代发布其 ObjC 运行时,Apple 资助另一个编译器(GPL 或非 GPL)的主要原因是它与 IDE 集成的意愿。GCC 被证明在这方面有太多的惯性,而且 GCC 的模块化程度不足以支持代码部分的重用(xcode“修复它”功能)。这就是我从阅读中了解到的

于 2011-08-01T17:08:27.593 回答