本节书摘来自华章计算机《计算机系统:系统架构与操作系统的高度集成》一书中的第2章,第2.2节,作者:(美)拉姆阿堪德兰(Ramachandran, U.)(美)莱希(Leahy, W. D.)著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.2 如何设计指令集
计算机由计算的机器演化而来,在早期的计算机设计中,指令集的选择很大程度上由硬件能否实现这些指令来决定。这是因为当时的硬件非常昂贵,而程序都是直接用汇编语言写成的。因此,指令集的设计很大范围内是电子工程师的工作,因为他们对硬件实现的可行性有非常好的想法。然而,硬件成本降低了,程序设计也日趋成熟,高级语言被开发出来,因此问题从硬件实现的可行性转移到指令是否实际有用上来,即指令是否有利于用高级语言编写出高效而紧凑的程序。
事实证明,指令集负责安排处理器内部做什么,而计算机用户很少需要直接和指令集打交道。毫无疑问,当你在玩视频游戏的时候,你不会关心处理器正在执行什么指令。用汇编语言写程序比用高级语言写程序容易出错是共识。
从人工手写汇编语言程序到编译器将高级语言程序转换为机器代码的变化是指令集体系结构演化的主要原因。这个变化意味着我们将寻求一个简单的指令集使高级语言结构能够转化为高效代码。
这里有一点需要注意,指令集的优雅是非常重要的,体系结构领域在这个方向上做了大量工作。然而,与此同等重要甚至需要首先关注的是指令集实现的效能。具体来说,在努力实现更简单、更快的指令集的时候,指令集体系结构的规律性是一个非常值得考虑的因素。我们在第3章和第5章讨论实现细节的时候还会再提到这一点。
虽然每种高级语言都有其独特的语法和语义特性,但我们依然可以找出一组在大部分高级语言中都存在的基本功能。我们首先要做的就是找出这样一组功能。我们以编译这样的功能作为讨论和开发指令集的基本动机。正如我们在本章开头提到的那样,除了编译高级语言结构之外,指令集还受到许多其他因素的影响。我们将在2.11节讨论这些因素。