# A.1 引言
<!-- source: p0669 -->

本附录集中讨论**指令集体系结构**，也就是程序员或编译器作者能够看到的计算机部分。对本书读者而言，这些内容大多应当是复习；将其收录于此，是为了提供背景知识。

本附录介绍指令集设计者可选择的多种设计方案，重点讨论四个方面。首先，对指令集的不同方案进行分类，并定性评价各种方法的优缺点。其次，给出并分析一些基本不依赖特定指令集的测量结果。再次，讨论语言与编译器，以及它们对指令集体系结构的影响。最后，“融会贯通”一节展示这些思想如何体现在典型的 RISC 体系结构——RISC-V 指令集中。附录以指令集设计中的谬误与陷阱收尾。

为进一步说明这些原理，并与 RISC-V 对照，附录 K 还介绍四种其他通用 RISC 体系结构（MIPS、Power ISA、SPARC 和 Armv8）、四种嵌入式 RISC 处理器（ARM Thumb2、RISC-V Compressed、microMIPS），以及三种较早的体系结构（80x86、IBM 360/370 和 VAX）。[^embedded-count] 在讨论体系结构分类之前，需要先说明指令集测量的一些问题。

本附录将考察多种体系结构测量结果。显然，结果取决于所测量的程序和使用的编译器。不能将这些结果视为绝对值；换用不同编译器或另一组程序，可能得到不同数据。我们认为，本附录中的测量能够合理地反映一类典型应用的情况。许多结果只使用少量基准程序，以便清楚展示数据和程序之间的差异。设计新计算机的体系结构时，应当在决策前分析规模大得多的程序集合。这里给出的通常是**动态**测量：某个事件的频率，按它在被测程序执行过程中实际发生的次数加权。

开始讨论一般原理之前，先回顾第 1 章的三类应用。桌面计算强调整数和浮点数据类型程序的性能，很少关注程序大小。例如，五代 SPEC 基准测试都从未报告代码大小。当今服务器主要用于数据库、文件服务、Web 应用，以及面向大量用户的一些分时应用。因此，浮点性能的重要性远低于整数和字符串性能；但几乎每一种服务器处理器仍然包含浮点指令。个人移动设备和嵌入式应用重视成本与能耗，因而代码大小非常重要：更少的存储器既更便宜，也更省电。为降低芯片成本，某些指令类别（例如浮点指令）可能是可选的；还可能采用专为节省存储空间而设计的压缩指令集版本。

<!-- source: p0670 -->

尽管如此，这三类应用的指令集仍非常相似。事实上，与这里重点介绍的 RISC-V 类似的体系结构，已经成功用于桌面、服务器和嵌入式应用。

一种与 RISC 十分不同、却同样成功的体系结构是 80x86（见附录 K）。令人意外的是，它的成功未必否定 RISC 指令集的优点。与 PC 软件保持二进制兼容的商业重要性，加上Moore 定律提供的大量晶体管，促使 Intel 在外部支持 80x86 指令集，同时在内部采用 RISC 指令集。近期的 80x86 微处理器，包括过去十年制造的全部 Intel Core 微处理器，都通过硬件将 80x86 指令转换成类似 RISC 的指令，然后在芯片内部执行转换后的操作。这样既向程序员维持了 80x86 体系结构的表象，又允许计算机设计者实现具有高性能的 RISC 风格处理器。不过，80x86 这样的复杂指令集仍存在严重缺点；我们将在结束语中进一步讨论。

有了这些背景，下面开始探讨指令集体系结构的分类。

[^embedded-count]: 译注：原文称“四种”，但括号内实际只列出三个名称。
