The Elements of Computing Systems

总体观点
《The Elements of Computing Systems: Building a Modern Computer from First Principles》(计算机系统要素:从零开始构建现代计算机,简称Nand2Tetris)是耶路撒冷希伯来大学教授诺姆·尼桑(Noam Nisan)与西蒙·肖肯(Shimon Schocken)于2005年出版的计算机科学教育神作。该书彻底打破了传统大学将数字电路、体系结构、编译原理与操作系统人为割裂的藩篱,构筑了一条贯穿硬件底层到高层软件的通天坦途。
全书以令人惊叹的极简抽象与优雅工程主义展开:上篇仅依靠唯一的逻辑基石——与非门(Nand Gate),指导读者通过HDL硬件描述语言依次搭建与门、或门、多路复用器、算术逻辑单元(ALU)、寄存器、内存RAM,最终组装出一台图灵完备的16位Hack计算机;下篇则从底层机器码出发,自制双遍扫描汇编器、基于栈架构的虚拟机(VM)、面向对象高级编程语言Jack的词法语法编译器,最后在自制精简操作系统OS上运行俄罗斯方块游戏。全书不仅让计算机底层的全部‘黑魔法’彻底透明化,更赋予每一位工程师俯瞰整个数字文明架构的无上掌控感。
核心观点
-
1. 从Nand到一切的优雅构造主义:单一基石原则
极其复杂的现代超大规模集成电路系统,在数理逻辑上完全可以由一种最原始的布尔逻辑门递归合成出来。
仅用Nand门先合成Not门,再合成And门、Or门,层层递进组合出全加器与支持18种算术逻辑运算的核心ALU芯片。 -
2. 组合逻辑与时序逻辑的时钟灵魂
组合逻辑只负责当下输入到输出的瞬时映射,唯有引入触发器DFF与系统时钟,计算机才拥有了记忆过去状态的‘时间维度’。
将数据反馈回路与DFF时钟沿结合,构建起能够存储1比特状态的Bit单元,进而递归拼装出16K内存与程序计数器PC。 -
3. 冯·诺依曼架构的本质:指令与数据的统一流动
将存储程序的ROM与读写数据的RAM通过统一总线连通CPU,打破了专用计算硬件的局限,开启了通用计算时代。
Hack CPU同时接入A寄存器(地址)与D寄存器(数据),一条16位指令的高位决定是直接执行算术计算还是进行程序跳转。 -
4. 虚拟机架构的两级编译解耦魔法
高级语言不直接生成机器码,而是先编译为通用的基于栈的中间字节码(VM代码),实现一次编写、到处运行的跨平台抽象。
Jack语言将‘x + g(2, y)’翻译为Push/Pop栈操作VM指令,VM转换器再将栈操作无缝翻译为特定目标硬件平台的Hack汇编。 -
5. 分层抽象的艺术:相信黑盒并勇敢穿越它
软件工程的核心在于在每一层只关注当前层的抽象契约,但在需要时又有能力向下穿透所有层级的坚实底气。
写高层游戏代码时只需调用‘Screen.drawPixel’系统API;而在底层,读者清楚知道这最终触发的是某颗内存电容电压的充放电翻转。
全书思维导图 · 知识脉络树
全书结构
-
硬件篇:从布尔逻辑到算术逻辑单元ALU
介绍硬件描述语言HDL,从单个Nand门出发自制所有基本逻辑门,随后设计加法器与图灵完备的Hack ALU。
编写全加器HDL代码,通过两个半加器和一个或门完成进位与本位计算,打通算术运算的底层基石。 -
时序篇:寄存器、RAM与Hack CPU组装
引入DFF触发器与时钟脉冲,搭建Bit、Register、RAM8至RAM16K内存,最终将ALU与寄存器连为一体组装CPU。
在CPU原理图中精巧布设A指令与C指令的多路选择器Mux16,使得指令解码与数据寻址在单周期内并发完成。 -
汇编篇:符号表与双遍扫描汇编器开发
定义Hack汇编助记符语法,用Python/Java等高级语言实现汇编器,解析标签(Label)与变量并输出01机器码文件。
第一遍扫描统计代码行数记录跳转标签物理ROM地址,第二遍扫描替换符号生成精确的16位二进制文本。 -
软件篇:栈虚拟机与Jack编译器前端开发
实现支持push/pop/add/call/return的基于栈虚拟机,编写词法分析器与递归下降语法分析器生成XML与VM中间代码。
处理函数调用时在内存调用栈上优雅压入返回地址、LCL指针与ARG指针,构筑工业级函数调用的运行期框架。 -
系统篇:精简操作系统实现与俄罗斯方块运行
用Jack语言手写Math、String、Memory、Output、Screen等底层操作系统类库,在自制计算机上跑通完整的交互游戏。
编写Memory.alloc通过空闲链表实现堆内存首次适应分配算法,在显示器内存映射区画出跳跃旋转的俄罗斯方块方块。