创建LLVM的原因是什么?

the*_*row 18 compiler-construction compiler-theory llvm

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

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

Pau*_*gar 26

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

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

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

至于创建LLVM的原因,它最初是Vikram Adve研究小组关于终身编译(这意味着JIT和链接时优化)的工作的一部分.获得博士学位后,克里斯拉特纳搬到了苹果公司,该公司正在大力推进该项目(可能是因为它获得了BSD许可,这在过去使用gcc引起了问题,这是GPL).

  • @ mt3:我的理解是Apple想要创建gcc的扩展,它不想开源,但他们被迫在GPL下.我无法想象我在哪里学到了这一点(当然,当它发生的时候我不在身边),然而[本文](http://www.groklaw.net/article.php?story=20100806143457345)解决了类似的问题(搜索"LLVM"的成绩单). (4认同)

sto*_*tal 5

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