当用C语言编写时,编译器理论上会将您的人类可读代码转换为机器代码 - 相对依赖于硬件的原子指令。每个CPU架构似乎都有一个指令集,它以某种硬连线的方式为CPU实现,但似乎不同的CPU可以用不同的方式实现相同的ISA,比如x86。
这是否意味着ISA本质上充当硬件的抽象层? x86说:这些是我提供的标准指令 - 你不需要知道硬件是如何做到的,只要知道它有,你可以通过向我发送以下机器代码来使用它们吗?
因此,如果我构建一个新的CPU并且我以遵循x86标准的方式实现我的CPU,我不需要编写特定于我的硬件的编译器,但是从C编译的任何编译器到x86 ISA对我的新CPU来说已经足够了吗?
答案 0 :(得分:1)
编译器理论上采用您的人类可读代码和 将其转换为机器代码
我想说这就是编译器的作用。这不是理论上的。
如果符合指令集的规范,则可以自由选择硬件实现。
指令集可能有一些简单的指令,如ADD,SUBTRACT,只要CPU执行位精确指令,您就不应该关心实现。实际上,这是通过增加加法器实现的复杂性以允许更快的时钟速度来提高性能的地方。
答案 1 :(得分:1)
是的,x86架构已有详细记录,并形成一个抽象层。但是,如果优化编译器了解负载使用延迟,加载存储单元的数量,计算单元的数量和类型,高速缓存大小和高速缓存行,则可以做得更好;内部寄存器的数量,一些处理器对指令流进行更多的重新排序等;这些都是特定于实现的。
例如,较旧的处理器可能只有一个整数乘法单元,较新的处理器可能只有两个(一个真正的老一个可能没有,我曾经做过一个,但不是x86)。他们的类型可能也不同。这些差异改变了优化/代码生成中速度 - 空间权衡之间的平衡,因此一种知道可以使用不同指令序列的策略。例如,使用乘法指令乘以大常量可能是最短的,但可能比几个移位和添加操作更慢或更快,具体取决于底层实现。因此,编译器有一些选择,因为它可以跟踪它所编写的代码的很多状态,所以它可以使用相当复杂的决策策略。
另一种常见的优化策略是交错两个或更多个不同的计算;这样可以使处理器更加忙碌。为此,通常会增加所需的寄存器数量,甚至可能需要更多指令,并且可能更快更长或不再依赖于底层实现。