神秘是我们能体验的最美好的事物,它是所有真正的艺术和科学的源泉。—阿尔伯特·爱因斯坦,《我的信仰》,1930关于本书在学习计算机科学与工程时,除了掌握计算的基本原理外,还应该了解该领域的最新进展。计算领域中各个方向的读者都应学习计算机系统的组成理论,因为这是决定计算机系统的功能、性能甚至成功的关键。要推动现代计算机技术的发展,需要对硬件和软件都有深入理解的专业人士。硬件和软件在多个层次上的相互影响成为理解计算基本原理的框架。无论你的主要兴趣是硬件还是软件,是计算机科学还是电气工程,计算机组成与设计的基本思想都是相同的。因此,本书着重展示硬件与软件的关系,并重点介绍当今计算机中的基础概念。处理器已经由单核发展为多核,且近年来更强调领域专用体系结构,该趋势印证了本书自第1版就提出的观点。过去,程序员可以忽略这一发展趋势,并希望计算机体系结构专家、编译器设计者和芯片工程师能够帮助他们,让程序不做任何修改就可以更快、更高效地在新型处理器上运行。但是,这样的时代已经一去不复返了。我们认为,至少在下一个十年里,大多数程序员只有理解硬件/软件接口,才能编写出在现代计算机上高效运行的程序。本书适合以下读者阅读:在汇编语言或逻辑设计方面只有少许经验,需要理解计算机组成的基本原理的读者;具有汇编语言或逻辑设计的基础,需要学习如何设计计算机,或者要进一步理解计算机系统如何工作的读者。与本书相关的另一本书有些读者可能已经熟悉我们的另一本书—《计算机体系结构:量化研究方法》,该书已广为流传,经常以作者姓名命名,称为“Hennessy and Patterson”(本书则常称为“Patterson and Hennessy”)。该书的目的是用坚实的工程基础和量化的性价比权衡来描述计算机体系结构的原理。该书基于商用系统,将案例与测量方法相结合,帮助读者理解实际的设计。该书的目标是通过量化分析方法讲解计算机体系结构,而不是仅仅对相关知识进行描述。因此,该书主要面向希望深入理解计算机系统的计算机专业人士。本书的大多数读者并不一定要成为计算机体系结构的设计者。软件设计人员对系统中基本硬件技术的理解,将显著影响未来软件系统的性能和能效。因此,编译器设计者、操作系统设计者、数据库程序员以及其他大多数软件工程师对本书所述的原理都应当有充分的了解。同样,硬件设计者也必须清楚自己的工作对软件的影响。所以,本书的内容绝不仅仅是“Hennessy and Patterson”的子集,而是进行了大量的扩展和修订,以满足不同读者的需求。我们对再版“Hennessy and Patterson”时删除大量介绍性材料的效果感到满意,与第1版相比,这两本书的内容重叠度已大大降低。第6版的变化相比于前5版之间的变化,自本书第5版出版至今,计算机体系结构技术和商业模式发生了更大的变化。摩尔定律放缓:Gordon Moore预测单芯片上集成的晶体管数量每18~24个月翻一番,但是半导体加工工艺按照此趋势发展了50年之后,该预测将不再有效。虽然半导体加工工艺仍然在进步,但进步速度比以前慢了很多,且越来越不可预测。领域专用体系结构(DSA)的出现:由于摩尔定律的放缓以及Dennard按比例缩小定律的终结,通用处理器的性能每年只有百分之几的提升。另外,Amdahl定律限制了单芯片上处理器核数目增加所能够带来的收益。2020年,DSA被公认为最有发展前途的技术。与通用处理器能够运行所有的应用程序不同,DSA能够更高效地运行特定领域的程序。微体系结构是安全攻击的直接对象:Spectre(幽灵)能够针对“推测乱序执行”和“硬件多线程”进行时间旁路攻击。这些并不属于任何一类可被修复的bug,从而为处理器设计提出了根本性的挑战。开放指令集和开源实现:开源软件给计算机体系结构领域带来了机遇和影响。任何组织机构都能够在不签署版权协议的情况下,使用RISC-V等开放指令集设计自己的处理器,并可以将设计实现进行开源。开源的设计实现既可被共享并自由下载,也可以作为有知识产权的RISC-V以供使用。开源软件和硬件对于大学的研究、教学很有益处,可以帮助学生理解理论知识并提升产业技术能力。信息技术产业的再次整合(re-virticalization):云计算使得不超过6家公司便可为所有用户提供计算基础设施,与20世纪六七十年代的IBM非常类似,这些公司决定软件栈和硬件的部署。上述变化导致这些大型公司开发自己的DSA和RISC-V芯片,并将其部署到自己的云中。本书第6版反映了这些变化,更新了所有的实例和图。针对用书教师提出的需求,我们对教学方法也做了进一步改进,这些改进的灵感来自给我的孙子辅导数学课时使用的教科书。在详细介绍第6版的修订情况之前,首先看下表。该表给出了本书的主要内容,并为关注硬件和关注软件的两种读者分别进行了导读。章/附录节关注软件关注硬件 第1章 计算机抽象及相关技术 1.1~1.12 1.13(历史) 第2章 指令:计算机的语言 2.1~2.14 2.15(编译器和Java) 2.16~2.22 2.2