创建LLVM的原因是什么?

时间:2009-09-14 11:03:53

标签: compiler-construction llvm compiler-theory

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

编辑: 我找到了this有趣的项目。

3 个答案:

答案 0 :(得分:26)

LLVM和“常规编译器”之间存在一些区别,我将其假设为“gcc”:

  • LLVM专为整个程序分析(也称为链接时分析)而设计,因此它可以选择将代码编译为“bitcode”,这是一种可以在以后重新分析的格式。
  • 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)导致了这些问题)。

答案 1 :(得分:5)

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

答案 2 :(得分:2)

我根本不是开发者,但是:即使gpl强迫NeXt在80年代发布它的ObjC运行时,苹果为另一个编译器(GPL与否)提供资金的主要原因是它与IDE集成的意愿。事实证明,GCC在这个领域有太大的惯性,GCC不够模块化,无法重用代码部分(xcode“修复它”功能)。 这就是我从读物中理解的内容