索引 / 001 ZH-CN
The Elements of Computing Systems: Building a Modern Computer from First Principles(计算机系统要素:从零开始构建现代计算机) cover

计算机科学

计算机科学

The Elements of Computing Systems: Building a Modern Computer from First Principles(计算机系统要素:从零开始构建现代计算机)

Noam Nisan; Shimon Schocken

英文原名: The Elements of Computing Systems: Building a Modern Computer from First Principles

一本以项目为主线的计算机原理入门书:读者从最基本的逻辑门出发,一步步构建一台完整的通用计算机,最后完成编译器和简单的操作系统。每一层都借助配套的软件工具和模拟器完成,不需要任何实体硬件。

需要的基础: 有一定的高级语言编程经验;不要求电子学或硬件背景。

难度等级
入门
学术层次
本科
computer architecturedigital logicassembly languagevirtual machinescompilers教科书

01 / 导读

导读

引用

Nisan, N., & Schocken, S. (2021). The Elements of Computing Systems: Building a Modern Computer from First Principles (2nd ed.). MIT Press.

章节概要

第二版约344页,通过12个各自配有一个项目的章节,带领读者搭建一套简单而完整的计算机系统:先是硬件平台,再是建立在其上的软件层级。这段被称为“从Nand到俄罗斯方块”(Nand to Tetris)的旅程,从最基本的逻辑门Nand出发,终点是一台能够运行俄罗斯方块或任何其他程序的通用计算机。据出版社介绍,这一版做了大幅修订:全书分为第一部分“硬件”和第二部分“软件”,各含六个项目;所有章节和项目都经过重写,强调把抽象与实现分开;并新增了内容充实的附录,集中讨论技术和理论问题。所有项目都使用作者的Nand to Tetris网站上的免费软件工具完成,包括硬件模拟器、CPU仿真器和VM仿真器,因此不需要任何实体硬件。Google Books以简短形式列出各章标题,网站上的项目页面则指明了哪两章讲虚拟机、哪两章讲编译器。

第1章:Boolean Logic(布尔逻辑)

以Nand门作为唯一的基本元件,读者搭建出各种基本逻辑门(Not、And、Or、Xor、多路选择器和多路分配器)及其16位和多路版本,它们是后来构造CPU和RAM的积木。

第2章:Boolean Arithmetic(布尔算术)

实现二进制算术的门电路:半加器和全加器、16位加法器和增量器,最后是Hack计算机的算术逻辑单元(ALU)——在这一系列芯片中,它是唯一为该体系结构所特有的。

第3章:Memory(存储器)

门电路如何随时间保存比特,以及如何对存储寄存器寻址。以数据触发器为基本元件,读者依次搭建1位寄存器、16位寄存器、由8个到16K个寄存器组成的RAM,以及程序计数器。

第4章:Machine Language(机器语言)

从程序员的角度描述计算机:建成后的硬件将要执行的Hack机器语言及其符号化的汇编形式。在项目中,读者编写并在提供的CPU仿真器上测试两个底层汇编程序(其中一个做乘法)。

第5章:Computer Architecture(计算机体系结构)

把前几章的ALU和RAM组装成Hack CPU、完整的存储地址空间和顶层的Computer芯片:一台能运行用第4章机器语言编写的程序的通用计算机。

第6章:Assembler(汇编器)

第一个软件项目:把符号化的Hack汇编翻译成二进制机器码的程序。本章结束第一部分;第二部分“软件”从下一页开始,并有自己的引言。

第7–8章:Processing(处理);Control(控制)

讲虚拟机的两章。本书仿照Java和.NET平台,定义一种基于栈的VM语言,并让读者编写把VM代码翻译成Hack汇编的翻译器。第7章(项目7“VM I:栈运算”)涵盖VM规范、算术和逻辑命令、针对八个内存段的内存访问命令,以及VM到Hack平台的映射;第8章(项目8“VM II:程序控制”)把翻译器扩展到分支和函数调用。

第9章:High-Level Language(高级语言)

介绍Jack,一种简单的、类似Java的基于对象的语言。在配套项目中,读者利用Jack操作系统提供的服务,用Jack编写一个小游戏或交互程序,以便在编译它之前先熟悉这门语言。

第10–11章:Syntax Analysis(语法分析);Code Generation(代码生成)

讲编译器的两章(项目10和11,“编译器I”和“编译器II”)。Jack编译器分为两层:第7–8章构建了它的后端,这两章构建前端。第10章开发词法分析器和遵循Jack文法的语法分析器,通过生成XML输出来测试;第11章篇幅超过三十页,是全书最长的一章,它加入符号表,并把语法分析器改造为输出VM代码的代码生成器。

第12章:Operating System(操作系统)

把操作系统看作弥合硬件与应用软件之间鸿沟的一组服务。读者用Jack本身实现Jack操作系统的八个类(Math、Memory、Array、String、Output、Screen、Keyboard和Sys);项目页面指出,这会涉及一系列应用计算机科学中的经典算法。

第13章:More Fun to Go(乐趣还在后头)

四页的收尾章节。

附录

约四十页的附录集中介绍支撑各项目的技术和理论问题。

核心概念

第一部分:硬件(第1–6章)

  • Nand作为通用门:其他所有逻辑门,进而整台计算机,都可以由Nand门构建。
  • 组合逻辑与时序逻辑:输出只取决于当前输入的芯片,以及能跨时钟周期保持状态的芯片。
  • 算术逻辑单元:对二进制数计算算术和逻辑函数的芯片。
  • 机器语言与存储程序计算机:保存在存储器中、由CPU执行的指令。
  • 汇编器:把符号化汇编语言翻译成二进制机器码的翻译程序。

第二部分:软件(第7–13章)

  • 虚拟机:介于高级语言和机器码之间、基于栈的中间抽象。
  • 栈运算与内存段:VM如何在栈上计算并为变量寻址。
  • 语法分析:按照文法解析源代码。
  • 代码生成:把解析后的程序翻译成更低层的代码。
  • 操作系统服务:让高级语言能够访问存储器和输入输出的库例程。
  • 抽象与实现:本版所强调的原则,即把每一层的接口与其构建方式分开来规定。

评析

优点

  • 由读者亲手搭建的一套连贯系统。 12章各有一个项目,其成果供后续章节使用,因此学生体会到的是门电路、CPU、汇编器、VM、编译器和操作系统如何组合在一起,而不是在不同课程中分别学习它们。出版社列举的、可以通过这种方式学到的领域包括硬件、体系结构、操作系统、程序设计语言、编译器、数据结构与算法以及软件工程。
  • 免费而完整的工具。 作者网站为每个项目提供模拟器、仿真器、测试脚本和比对文件;正如项目7的页面所示,每个项目都附有精确的规范和分阶段的测试。在非营利场合,这一切都是免费且开源的;网站称,Nand to Tetris课程已在400多所大学、中学和编程训练营中开设。
  • 抽象与实现分离。 出版社表示,第二版的每一章都为把抽象与实现分开而重写;项目页面也体现了这一点:每个项目都规定了一份契约(芯片接口、VM规范与映射、API),学生的实现必须满足它并据此测试。
  • 结构灵活。 由于全书分成各含六个项目的两部分,课程可以只讲硬件部分或只讲软件部分。网站还提供一份典型课程的详细教学大纲,并介绍了提供结业证书的付费Coursera课程。

局限

  • 刻意简化的机器。 Hack计算机是为教学而设计的;本书不涉及流水线、高速缓存、性能测量或真实的指令集,这些是标准体系结构教材的内容。
  • 软件部分要求高。 第二部分的项目(汇编器、VM翻译器、编译器和操作系统)要求读者用自选语言具备相当的编程能力,并投入大量时间;讲代码生成的第11章是全书最长的一章。
  • 免费资料存在版本差异。 网站说明,部分项目页面链接的书籍章节主要来自第一版,其章节结构和标题有所不同(例如第一版第3章题为“Sequential Logic”,第二版则为“Memory”)。把免费章节与第二版结合使用的读者,需要确认自己用的是哪个版本。

在课程中的定位

对于初学者而言,本书是计算机体系结构课程中注重动手的核心。查尔斯·佩措尔德的 Code 覆盖相近的内容——从开关和门电路到一台能运行的CPU——但以叙事方式展开、没有习题;它可以作为第一部分的平缓铺垫,或在项目显得抽象时作为参照。哈里斯夫妇的 Digital Design and Computer Architecture, RISC-V Edition 把硬件部分推进得更远,引入硬件描述语言、真实的指令集和流水线处理器,是读完第1–5章后很自然的下一步。

布莱恩特和奥哈拉伦的 Computer Systems: A Programmer's Perspective 从程序员的角度审视真实机器(机器代码、存储器、链接、进程),与第二部分互为补充。亨尼西和帕特森的 Computer Architecture: A Quantitative Approach 以及沈和利帕斯蒂的 Modern Processor Design 讨论现代处理器的性能技术,需要先修计算机组成课程;应在读完本书之后再读,而不是用它们代替本书。

如何使用本书

本书适合修读计算机系统或计算机组成课程的一二年级学生、想了解高级代码之下究竟是什么的自学者,以及开设实验课程的教师。不需要电子学背景。第二部分要求读者用自选的语言编写汇编器、VM翻译器和编译器,因此需要具备某种高级语言的编程经验。

  • 按顺序完成。 每个项目都依赖前一个项目。先读章节,再用提供的工具实现项目,在继续之前运行提供的测试。
  • 只学硬件: 第1–6章构成一门包含六个项目、涵盖硬件和汇编器的完整课程。
  • 只学软件: 第二部分可以单独学习;提供的工具和书中的规范可以代替硬件。
  • 为第10–11章留足时间。 编译器是工作量最大的单项任务。
  • 附录: 根据项目需要查阅。

从Nand to Tetris网站下载工具和项目文件,并严格按照项目页面的建议使用分阶段测试:先对小部件做单元测试,再测试整体。如果使用网站链接的免费第一版章节,在动手实现之前要先与第二版的规范进行对照。保留每个项目中自己编写的代码,因为后面的项目要以它为基础。