编译器和指令集

时间:2017-12-12 10:38:17

标签: c compiler-construction cpu instruction-set

  

" C是一种基本的目的语言,不依赖于特定的系统"   C编程语言,BRIAN W KERNIGHAN& DENNIS M. RITCHIE

然而,使用正确的编译器,我们可以制作一个在每台Windows机器上运行的.exe,这反过来意味着在每台Windows上运行。

所以我的问题是:每个x86-64 CPU(Intel或AMD)都使用相同的指令集吗? (是的,我可以进行比较......)如果没有,那么我必须假设编译器检测到我们正在运行的CPU并在编译期间使用正确的指令集。

我完全错了吗?

我几乎不知道我在谈论什么,所以请耐心等待。 只是一个男人试图在引擎盖下看。

谢谢

1 个答案:

答案 0 :(得分:5)

英特尔制造了许多不同的处理器型号,这些型号共享“x86-64”系列的核心指令集(以及没有的其他处理器型号)。即使在具有共享核心指令的处理器中,也存在变化。较新的模型可能有旧模型没有的指令,指令集的某些部分可能在某些模型上而不在其他模型上。

有些指令甚至在不同的处理器上表现不同。

编译程序时,编译器会“指定”特定的指令子集组合。这意味着这些子集中的指令可供编译器在生成代码时使用。在编译特定程序时,编译器可能会也可能不会使用任何特定指令或子集,具体取决于其需要或选择。结果程序适用于具有目标指令的处理器模型,而不适用于其他模型(除非编译器没有使用任何不在这些模型上的指令,即使它可能有)。

通常,编译器目标的默认设置是您运行的处理器模型或现代处理器模型常见的一些典型指令子集选择。还可以根据您为编译器提供的其他设置来选择目标,例如要求它定位特定版本的操作系统。但是,您可以通过编译器开关来告诉它为完全不同的目标进行编译,即使对于完全不同的体系结构,例如在英特尔处理器上运行时编译ARM处理器。

软件也是计算机系统的一部分,因此编译器生成的可执行文件也可能依赖于某些软件库在运行时可用或某些操作系统功能可用。