繁体   English   中英

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

[英]How does a compiler “know” how to translate code into processor specific assembly?

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

从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的编译器时,编译器如何知道要生成哪个特定于处理器的汇编代码? 编译器是否附带各种特定于处理器的汇编程序?

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

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

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

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

对于实际的计算,比如添加两个数字,只有硬件很重要,而且你确实会在Windows和Linux下获得相同的机器代码。

有趣的“胶水”由平台库提供,例如标准C库,它提供“在标准输出上打印字符”的功能。 函数调用代码也完全由硬件决定(虽然Windows和Linux之间存在一些不同的约定,例如放置函数参数的位置,但这些仅仅是约定)。 特定于平台的“肉”是由这些库的实现提供的。 例如, printf是如何实现的 不同的代码是在Linux和Windows产生的,但差异不是那种指令,而是你如何跟操作系统。

同样,这主要是常规问题,并且在同一硬件上针对不同操作系统的程序的实际机器代码没有显着差异。 区别仅在于您如何让操作系统代表您执行某些操作,例如输入/输出,给您记忆,告诉您时间等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM