LLVM:中间字节码与二进制

时间:2015-05-16 20:14:10

标签: clang llvm

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

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

例如,如果我用C语言编写内容,LLVM(或Clang?)可以编译为二进制(如GCC)还是中间代码?

或者只能将某些语言转换为中级语言?我想不用说这个中间件需要某种类型的LLVM运行时?不过,我从未真正听过运行时的声音。

1 个答案:

答案 0 :(得分:3)

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

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

  

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

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

  

例如,如果我用C语言编写内容,可以编译LLVM(或Clang?)   二进制(如GCC)还是中间代码?

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

  

或者只能将某些语言转换为中级语言?我猜   不言而喻,这个中间体需要某种类型的LLVM   运行

理论上,一旦你有LLVM IR,LLVM库就可以将它转换为二进制文件。有些语言需要运行时(比如Java或Python),因此从这些语言到LLVM IR的任何编译器都必须以这种或那种方式提供运行时。 LLVM有一些支持连接到这样的运行时(例如 - GC钩子),但没有自己的"运行时#34;。唯一的"运行时"与LLVM相关的项目是compiler-rt,它提供了一些语言/编译器内置函数和内在函数的快速实现。它主要用于C / C ++ / Objective C.虽然基于Clang的完整工具链经常使用它,但它并不是LLVM的正式组成部分。