1

当使用诸如 C 之类的语言编写时,编译器理论上会获取您的人类可读代码并将其转换为机器代码 - 相对依赖于硬件的原子指令。每个 CPU 架构似乎都有一个指令集,它以某种硬连线方式为 CPU 实现,但似乎不同的 CPU 可以以不同的方式实现相同的 ISA,比如 x86。

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

因此,如果我要构建一个新的 CPU 并且我以遵循 x86 标准的方式实现我的 CPU,我不需要编写特定于我的硬件的编译器,而是任何从 C 编译到 x86 的编译器ISA 对我的新 CPU 是否足够?

4

2 回答 2

1

编译器理论上会获取您的人类可读代码并将其转换为机器代码

我会说这就是编译器所做的。这不是理论上的。

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

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

于 2013-01-11T22:52:58.743 回答
1

是的,x86 架构有据可查,并形成了一个抽象层。但是,如果优化编译器了解加载使用延迟、加载存储单元的数量、计算单元的数量和类型、缓存大小和缓存行,则它可以做得更好;内部寄存器的数量,一些处理器对指令流进行更多的重新排序等;这些东西是特定于实现的。

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

Another common optimization strategy is to interleave two or more different computations; this so as to keep the processor more busy. To do this often increases the number of registers needed, and may even require more instructions, and could be quicker yet longer or not depending again on the underlying implementation.

于 2013-01-11T22:53:12.463 回答