LLVM IR 是一种机器无关语言吗?

Is LLVM IR a machine independent language?

我在看LLVM IR代码(C转)的时候,看到了这样一条指令:

%div = sdiv i32 %add, %32

这条指令的C代码可能是这样的:

a = c / b;

我们可以看到这条指令中有一个类型i32。这是因为变量的类型 a, b, cint。而我的电脑是x86.

现在,如果我有一台整数约为 8 位的机器,并且我编写了与上面相同的 C 代码,并在这台机器上将 C 转换为 LLVM IR,则 LLVM IR 指令可能是 %div = sdiv i8 %add, %32

这样对吗?如果是,我们怎么能说 LLVM IR 是一种机器独立语言

我想如果一段代码是机器无关的语言,那么这段代码可以运行在这个世界上的任何机器上,当代码是运行ning时,虚拟机器或其他东西将处理架构之间的差异。

是的,LLVM IR 是一种独立于机器的语言。

但是红外代码不能运行直接在真实硬件上。为了 运行 IR 代码,需要重新定位过程。在 'retarget' 期间,机器独立 IR 代码被转换为目标(x86、MIPS、aarch、8 位芯片等)的机器相关代码。

LLVM IR 是一种独立于机器的 语言 ,但这对于独立于机器的 程序 是不够的。程序需要的不仅仅是一种语言。 LLVM 有 类 调用 TargetMachine 和 DataLayout,例如,它们收集特定于目标的详细信息,例如结构在内存中的布局方式以及指向奇数地址的指针是否合法。您会经常看到使用与目标相关的数字的独立于机器的语言的代码。在这个平台上,代码添加了 4,在另一个平台上,代码添加了 8。

但在这两种情况下,语言相同,add 指令也相同,这简化了编译器维护人员的工作。

Is LLVM IR a machine independent language?

如果您编译用汇编语言(例如内联汇编)编写的源代码,则它不能与机器无关。

因此 LLVM 是机器独立的(对于大多数事情)并且 机器依赖(对于汇编语言)。

请注意,如果您查看 LLVM 参考资料(例如 http://web.cs.ucla.edu/classes/spring08/cs259/llvm-2.2/docs/LangRef.html#inlineasm ),您会发现汇编语言主要是 becomes/remains 纯文本(不是字节码,不是机器码)。它是依赖于机器的纯文本的内容(对于指令本身和约束等)。