编译器如何"知道"如何将代码转换为特定于处理器的程序集?

Byt*_*ter 7 compiler-construction assembly processor processor-architecture

答案者已经知道的东西,但在这里,无论如何都要显示我的思考过程:

从HLL到机器代码,这里发生了大量的事件(有连接器和其他东西,但是现在让我们忽略它):

HLL - >编译器 - >汇编程序---->机器代码

根据我购买的硬件,它可能有不同的处理器(Intel,SPARC,ARM等).汇编语言是特定于处理器的.因此,当代码来自Compiler - > Assembler时,生成的汇编代码是特定于处理器的.

切入点:

例如:我的硬件上有Windows操作系统.而且,我得到'用于Windows 7 64位的C编译器'.而且我在同一硬件上也有Ubuntu,我得到'Ubuntu 64位的C编译器'.

  1. 我可以在具有不同处理器架构的不同硬件上使用相同的OS,或者在相同硬件上使用不同的OS(如上例所示).当我下载C编译器时,为什么编译器被列为特定于操作系统?而不是处理器特定?由于编译器的重点是将HLL转换为Assembly,这是特定于处理器体系结构而不是特定于操作系统.

  2. 假设1.事情是如何完成的,当我下载适用于Windows 7和Ubuntu的编译器时,编译器如何知道要生成哪个特定于处理器的汇编代码?编译器是否附带各种特定于处理器的汇编程序?

小智 5

有几个因素影响到这一点.对于台式机,实际上只有两种架构在使用:32位是x86(有各种扩展),64位是x86-64.因此,许多软件可以忽略这个问题,只指定"位数".对于Windows RT/8之前的Windows,尤其如此,它甚至不支持任何其他体系结构.

虽然编译器必须了解处理器体系结构,但几乎所有有趣的程序都必须以某种方式与操作系统交互.即使您的代码不与操作系统交互,编译器也必须知道要用于二进制文件的文件格式,要链接的库,等等.运行时库也是特定于操作系统的,通常与编译器捆绑在一起.

至于编译器如何知道要生成什么样的指令:您下载的二进制文件是专门为一个体系结构定制的(无论您是否提到它的页面)并且无法为其他体系结构生成代码,或者确实有几个后端汇编.

也就是说,我没有看到很多编译器声明" <language>编译器<operating system>".编写器编写者在指定指令集时通常更为迂腐,分销商也是如此.只有windows家伙对此非常草率,因为直到大约一年前它才是有用的信息.