Compilation 编译成LLVM字节码,然后编译成机器码对速度等有什么影响?

Compilation 编译成LLVM字节码,然后编译成机器码对速度等有什么影响?,compilation,llvm,cpu-architecture,Compilation,Llvm,Cpu Architecture,我这样问是因为,随着ARM设备上移动计算的日益普及,对向后兼容X86设备的持续需求,以及量子计算等具有完全不同体系结构的新技术,中间语言似乎是编译器开发人员的最佳选择。双重编译如何影响生成的机器代码的质量?LLVM设计用于从LLVM IR生成高性能代码;如果您正在编写一个新的编译器,那么与编写自己的代码生成器相比,使用IR可以以更少的工作量获得更好的性能。从某种意义上讲,您可以说“双重编译”实际上改进了生成的代码,因为LLVM具有用于LLVM IR的强大优化器 可能有兴趣。LLVM与您的语言一样

我这样问是因为,随着ARM设备上移动计算的日益普及,对向后兼容X86设备的持续需求,以及量子计算等具有完全不同体系结构的新技术,中间语言似乎是编译器开发人员的最佳选择。双重编译如何影响生成的机器代码的质量?

LLVM设计用于从LLVM IR生成高性能代码;如果您正在编写一个新的编译器,那么与编写自己的代码生成器相比,使用IR可以以更少的工作量获得更好的性能。从某种意义上讲,您可以说“双重编译”实际上改进了生成的代码,因为LLVM具有用于LLVM IR的强大优化器


可能有兴趣。

LLVM与您的语言一样独立于平台,也就是说,它可以独立于平台,但级别不足以独立地表示C语言


所以,只要您没有依赖于“指针大小”之类的东西的类型,那么您可能就可以了。“双重编译”很好,因为它意味着您可以在执行/装运/等时编译到您想要的处理器的确切硬件。缺点是您的语言需要独立于平台,或者需要用于各种不同平台的位代码。

所有编译器都使用低级内部表示(LIR)来执行低级优化。在GCC中,它被称为“GIMPLE”;在LLVM中,它被称为“LLVM IR”。换句话说,LLVM方法在这一点上与其他编译器没有什么不同

事实上,大多数前端进一步使用一些高级内部表示(HIR)来执行一些优化(特别是循环优化),这些优化在LIR级别应用起来要麻烦得多(或者由于信息丢失而无法实现)

因此,通常一个程序要经过3个“编译”步骤而不是2个:C->HIR->LIR->ASM

关于剩下的问题,正如其他人已经提到的,LIR并不意味着可以在不同的体系结构之间移植,而是在相同(或类似)体系结构的不同实例之间移植。原因有很多:

  • 经过预处理或对各种大小的代码求值等步骤后,C代码本质上不再具有可移植性

  • 根据目标应用程序的不同,需要进行不同的优化,其中一些优化在HIR级别执行(例如,内部Clang);在转换为LLVM IR后回滚将为时已晚

  • 无论如何,当您优化了C代码时,它通常高度依赖于目标


无论如何,如果您对可移植性感兴趣,还应该看看NVidia的PTX ISA。它是一个虚拟ISA通用的所有NVIdia的GPU,在安装时由GPU驱动程序编译成机器代码。

LLVM IR不是平台独立的中间表示形式。如果LLVM IR不是平台独立的,它的目的是什么?LLVM IR是平台独立的,因为IR中给定指令的含义在所有平台上都是相同的。它不是平台独立的,因为生成真实世界的IR通常需要将特定于平台的信息编码到IR中。另请参见。LLVM对于量子计算是无用的。量子算法与我们所习惯的非常不同,只对一小部分问题有用。@dlahoti,它的用途与GCC中的GIMPLE相同。它只是一个中间的表示,仅此而已。