LLVM:中间字节码与二进制

LLVM: intermediate bytecode vs binary

我对 LLVM 的一个方面感到困惑:

对于它支持的所有语言,它是否支持编译为中间代码和直接二进制?

例如,如果我用 C 编写一些东西,LLVM(或 Clang?)可以编译为二进制(如 GCC)或中间代码吗?

或者只有部分语言可以转中级?我想不用说这个中间体需要某种类型的 LLVM 运行时?不过,我从来没有真正听说过运行时。

LLVM 是一个用于操作 LLVM IR(您提到的 "bytecode")并将其降低为特定于目标的二进制文件(例如 x86 机器代码)的框架。 Clang 是 C/C++(和 Objective C)的前端,可将这些源语言翻译成 LLVM IR。

考虑到这一点,回答您的问题:

For all the languages it supports, does it support compiling both to the intermediate code AND to straight binary?

LLVM 可以将 IR(中间代码)编译为二进制(或汇编文本)。

For instance, if I write something in C, can LLVM (or Clang?) compile to either binary (like GCC) or intermediate code?

是的。 Clang 可以直接将您的代码编译为二进制文件(使用 LLVM 作为后端),或者如果您需要,只需发出 LLVM IR。

Or can only some languages be converted to intermediate? I guess it goes without saying that this intermediate requires some type of LLVM runtime?

理论上,一旦拥有 LLVM IR,LLVM 库就可以将其转换为二进制。某些语言需要运行时(例如 Java 或 Python),因此从这些语言到 LLVM IR 的任何编译器都必须以某种方式提供运行时。 LLVM 有一些支持连接到这样的运行时(例如 - GC 挂钩)但不携带 "runtime of its own"。与 LLVM 相关的唯一 "runtime" 项目是 compiler-rt,它提供了一些 language/compiler 内置函数和内在函数的快速实现。主要用于C/C++/Objective C。它不是 LLVM 的正式部分,但基于 Clang 的完整工具链经常使用它。