LLVM和常规编译器之间有什么区别?
它是否更具动态性,因此可用于将通常非常动态的语言(即Javascript)编译成静态二进制代码?
创建一个原则背后的原则是什么?
我知道编译器的龙书,但LLVM有这样的东西吗?
编辑: 我找到了this有趣的项目。
答案 0 :(得分:26)
LLVM和“常规编译器”之间存在一些区别,我将其假设为“gcc”:
对于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“修复它”功能)。 这就是我从读物中理解的内容