我想知道 LLVM 是像 Java 或 .Net 那样的典型虚拟机,还是只是运行时环境,就像普通的 C++ 运行时一样?
1 回答
这两者都不是。
LLVM 曾经代表“低级虚拟机”,但这绝不意味着 Java 或 .NET 意义上的完整虚拟机,并且“LLVM”此后不再是缩写。
LLVM 的核心部分是 LLVM IR。
IR 代表内部表示,这是编译器中使用的术语,指的是前端和后端之间使用的程序表示。IR 允许将解析语言的细节与代码生成的细节分离。在传统的编译器设计中,理想的前端和后端组件可以自由混合,这样 N 个前端和 M 个后端将允许您创建 NxM 编译器。
LLVM 的 IR 不同于传统的内部表示;而不是基于抽象语法树 LLVM IR 是一种汇编语言,或类似于 Java 和 .NET 的字节码。这就是“虚拟机”的用武之地。但是 LLVM IR 并不像 .NET 和 JVM 那样强制执行高级语义,例如数组边界检查。此外,LLVM IR 可以进行 JIT 编译,但通常它会静态编译为本机代码,就像任何传统编译器的后端对 IR 所做的一样。
LLVM 已经发展为围绕核心编译器基础架构的许多组件命名的伞式项目。最初 LLVM 是 IR 和对其进行操作的工具(优化、代码生成),但已经发展到包含更多内容,包括一些针对 LLVM IR 的前端、用于解析和生成程序集的机器代码框架、通用目标文件处理、调试器,链接器...
如果您有兴趣,每年都会举办一次 LLVM 会议,涵盖 LLVM 中发生的事情和使用 LLVM 的项目,他们会记录并发布演示文稿: http: //llvm.org/devmtg/。今年将在下周举行。