Compiler construction 新硬件的编译器修改

Compiler construction 新硬件的编译器修改,compiler-construction,instruction-set,Compiler Construction,Instruction Set,当用C语言编写时,理论上编译器会将人类可读的代码转换为机器代码——相对依赖于硬件的原子指令。每个CPU体系结构似乎都有一个指令集,该指令集是以某种硬接线方式为CPU实现的,但似乎不同的CPU可以以不同的方式实现相同的ISA,比如x86 这是否意味着ISA本质上是硬件的抽象层?x86说:这些是我提供的标准指令-你不需要知道硬件是如何工作的,只需要知道它是如何工作的,你可以通过向我发送以下机器代码来使用它们 因此,如果我要构造一个新的CPU,并以一种遵循x86标准的方式实现我的CPU,我就不需要编写

当用C语言编写时,理论上编译器会将人类可读的代码转换为机器代码——相对依赖于硬件的原子指令。每个CPU体系结构似乎都有一个指令集,该指令集是以某种硬接线方式为CPU实现的,但似乎不同的CPU可以以不同的方式实现相同的ISA,比如x86

这是否意味着ISA本质上是硬件的抽象层?x86说:这些是我提供的标准指令-你不需要知道硬件是如何工作的,只需要知道它是如何工作的,你可以通过向我发送以下机器代码来使用它们

因此,如果我要构造一个新的CPU,并以一种遵循x86标准的方式实现我的CPU,我就不需要编写特定于我的硬件的编译器,但是任何从C编译到x86 ISA的编译器都足以满足我的新CPU

从理论上讲,编译器会接受人类可读的代码和 把它翻译成机器代码

我想说编译器就是这么做的。这不是理论上的

如果符合指令集的规范,则可以自由选择硬件实现


指令集可能有一些简单的指令,如加法、减法,只要CPU执行位精度指令,您就不必关心实现。事实上,这就是通过增加加法器实现的复杂性以允许更快的时钟速度来提高性能的地方

是的,x86体系结构有很好的文档记录,并形成了一个抽象层。然而,如果一个优化编译器能够理解负载使用延迟、负载存储单元的数量、计算单元的数量和类型、缓存大小和缓存线,那么它可以做得更好;内部寄存器的数量,一些处理器对指令流进行更多的重新排序,等等。;这些都是特定于实现的

例如,较旧的处理器可能只有一个整数乘法单元,较新的处理器可能有两个整数乘法单元(一个非常旧的处理器可能没有整数乘法单元,我曾使用过一个,但不是x86)。它们的类型也可能不同。这些差异改变了优化/代码生成中速度-空间权衡之间的平衡,因此需要一种策略,知道哪种可能使用不同的指令序列。例如,使用乘法指令时,乘以一个大常数可能是最短的,但可能比几个移位和加法操作慢或快,具体取决于底层实现。因此,编译器可以做出一些选择,并且由于它可以跟踪所编写代码的许多状态,因此可以使用相当复杂的决策策略


另一种常见的优化策略是交错两个或多个不同的计算;这样可以使处理器更忙。这样做通常会增加所需的寄存器数量,甚至可能需要更多的指令,并且可能更快更长,或者不再依赖于底层实现

答案是“是”和“是”。你的最后一句话与你的第二句话相矛盾。编译器当然关心。矛盾是什么?您将收到一条固定指令(位模式),例如ADD。硬件对加法进行解码并执行加法运算,但它不涉及硬件实现的加法器体系结构。