回答者已经知道的东西,但是在这里反正显示我的思考过程:
从HLL到机器代码,这里发生了一系列粗略的事件(有连接器和其他东西,但我们暂时忽略它):
HLL - >编译器 - >汇编程序---->机器代码
根据我购买的硬件,它可能有不同的处理器(Intel,SPARC,ARM等)。汇编语言是特定于处理器的。所以当代码来自Compiler - >汇编程序,生成的汇编代码是特定于处理器的。
重点:
例如:我的硬件上有Windows操作系统。而且,我得到'用于Windows 7 64位的C编译器'。而且我在同一硬件上也有Ubuntu,我得到'Ubuntu 64位的C编译器'。
我可以在具有不同处理器架构的不同硬件上使用相同的操作系统,或在同一硬件上使用不同的操作系统(如上例所示)。当我下载C编译器时,为什么编译器被列为特定于操作系统?而不是处理器特定?由于编译器的重点是将HLL转换为Assembly,这是特定于处理器体系结构且不特定于操作系统。
假设1.事情是如何完成的,当我下载适用于Windows 7和Ubuntu的编译器时,编译器如何知道要生成哪个特定于处理器的汇编代码?编译器是否附带各种特定于处理器的汇编程序?
答案 0 :(得分:5)
有几个因素可以解决这个问题。对于台式机,实际上只有两种架构在使用:32位是x86(有各种扩展),64位是x86-64。因此,许多软件可以忽略这个问题,只指定“位数”。对于Windows RT / 8之前的Windows,尤其如此,它甚至不试图支持任何其他架构。
虽然编译器必须了解处理器体系结构,但几乎所有有趣的程序都必须以某种方式与操作系统交互。即使您的代码不与操作系统交互,编译器也必须知道要用于二进制文件的文件格式,要链接的库,等等。运行时库也是特定于操作系统的,通常与编译器捆绑在一起。
关于编译器如何知道要生成什么类型的指令:您下载的二进制文件是专门为一个体系结构定制的(无论您是否提到它的页面)和都不能为其他体系结构生成代码,或者确实有几个后端编译。
那就是说,我没有看到很多编译器声明“<language>
编译器<operating system>
”。编写器编写者在指定指令集时通常更为迂腐,分销商也是如此。只有窗户家伙对此非常草率,因为直到大约一年前它才是有用的信息。
答案 1 :(得分:0)
对于实际计算,例如添加两个数字,只有硬件很重要,而且你确实会在Windows和Linux下获得相同的机器代码。
有趣的“胶水”由平台库提供,例如标准C库,提供“在标准输出上打印字符”的功能。函数调用代码也完全由硬件决定(尽管Windows和Linux之间存在一些不同的约定,例如放置函数参数的位置,但这些仅仅是约定)。有趣的特定于平台的“肉”由这些库的实现提供。例如,printf
如何实施?在Linux和Windows上生成了不同的代码,但不同之处在于 kind 指令,而在于您与操作系统的对话方式。
同样,这主要是约定问题,并且在同一硬件上针对不同操作系统的程序的实际机器代码没有显着差异。区别仅在于您如何让操作系统代表您执行某些操作,输入/输出,给您记忆,告诉您时间等等。