LLVM 和常规编译器有什么区别?
它是否更加动态,因此可以用来编译通常非常动态的语言(即Javascript)转换为静态二进制代码?创建它背后的原则是什么?
我知道关于编译器的《龙书》,但是对于 LLVM 有这样的东西吗?

编辑:我已经发现 有趣的项目。

有帮助吗?

解决方案

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

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

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

至于创建 LLVM 的原因,它是作为 维克拉姆·阿德维的研究小组的工作 终生编译 (这意味着 JIT 和链接时优化)。获得博士学位后,Chris Lattner 转到 Apple,这极大地推动了该项目的发展(可能是因为它是 BSD 许可的,这在过去给他们带来了 gcc(即 GPL)问题)。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top