我对LLVM的一个方面感到困惑:
对于它支持的所有语言,它是否支持编译中间代码和直接二进制文件?
例如,如果我用C语言编写内容,LLVM(或Clang?)可以编译为二进制(如GCC)还是中间代码?
或者只能将某些语言转换为中级语言?我想不用说这个中间件需要某种类型的LLVM运行时?不过,我从未真正听过运行时的声音。
答案 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的正式组成部分。