← 全部书单 / 主理人心愿精选

The Elements of Computing Systems

The Elements of Computing Systems封面
作者: Noam Nisan、Shimon Schocken
出版社: The MIT Press
出版年:
9.5
★★★★★
豆瓣评分 · 4,200 人评价
未标记阅读状态
麻省理工学院出版社出版的划时代计算机硬核自制圣经(Nand2Tetris课程教材)。两位顶尖计算机科学家带领读者从最基础的一个与非门(NAND)开始,逐层向上搭建ALU、CPU、汇编器、虚拟机、编译器,直到写出一个完整的俄罗斯方块操作系统。

总体观点

《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. 1. 从Nand到一切的优雅构造主义:单一基石原则

    极其复杂的现代超大规模集成电路系统,在数理逻辑上完全可以由一种最原始的布尔逻辑门递归合成出来。

    仅用Nand门先合成Not门,再合成And门、Or门,层层递进组合出全加器与支持18种算术逻辑运算的核心ALU芯片。
  2. 2. 组合逻辑与时序逻辑的时钟灵魂

    组合逻辑只负责当下输入到输出的瞬时映射,唯有引入触发器DFF与系统时钟,计算机才拥有了记忆过去状态的‘时间维度’。

    将数据反馈回路与DFF时钟沿结合,构建起能够存储1比特状态的Bit单元,进而递归拼装出16K内存与程序计数器PC。
  3. 3. 冯·诺依曼架构的本质:指令与数据的统一流动

    将存储程序的ROM与读写数据的RAM通过统一总线连通CPU,打破了专用计算硬件的局限,开启了通用计算时代。

    Hack CPU同时接入A寄存器(地址)与D寄存器(数据),一条16位指令的高位决定是直接执行算术计算还是进行程序跳转。
  4. 4. 虚拟机架构的两级编译解耦魔法

    高级语言不直接生成机器码,而是先编译为通用的基于栈的中间字节码(VM代码),实现一次编写、到处运行的跨平台抽象。

    Jack语言将‘x + g(2, y)’翻译为Push/Pop栈操作VM指令,VM转换器再将栈操作无缝翻译为特定目标硬件平台的Hack汇编。
  5. 5. 分层抽象的艺术:相信黑盒并勇敢穿越它

    软件工程的核心在于在每一层只关注当前层的抽象契约,但在需要时又有能力向下穿透所有层级的坚实底气。

    写高层游戏代码时只需调用‘Screen.drawPixel’系统API;而在底层,读者清楚知道这最终触发的是某颗内存电容电压的充放电翻转。
树状思维导图

全书思维导图 · 知识脉络树

💡 拖拽平移 · 滚轮缩放 · 点击分支圆点折叠/展开
已复制思维导图大纲到剪贴板!

全书结构

  1. 硬件篇:从布尔逻辑到算术逻辑单元ALU

    介绍硬件描述语言HDL,从单个Nand门出发自制所有基本逻辑门,随后设计加法器与图灵完备的Hack ALU。

    编写全加器HDL代码,通过两个半加器和一个或门完成进位与本位计算,打通算术运算的底层基石。
  2. 时序篇:寄存器、RAM与Hack CPU组装

    引入DFF触发器与时钟脉冲,搭建Bit、Register、RAM8至RAM16K内存,最终将ALU与寄存器连为一体组装CPU。

    在CPU原理图中精巧布设A指令与C指令的多路选择器Mux16,使得指令解码与数据寻址在单周期内并发完成。
  3. 汇编篇:符号表与双遍扫描汇编器开发

    定义Hack汇编助记符语法,用Python/Java等高级语言实现汇编器,解析标签(Label)与变量并输出01机器码文件。

    第一遍扫描统计代码行数记录跳转标签物理ROM地址,第二遍扫描替换符号生成精确的16位二进制文本。
  4. 软件篇:栈虚拟机与Jack编译器前端开发

    实现支持push/pop/add/call/return的基于栈虚拟机,编写词法分析器与递归下降语法分析器生成XML与VM中间代码。

    处理函数调用时在内存调用栈上优雅压入返回地址、LCL指针与ARG指针,构筑工业级函数调用的运行期框架。
  5. 系统篇:精简操作系统实现与俄罗斯方块运行

    用Jack语言手写Math、String、Memory、Output、Screen等底层操作系统类库,在自制计算机上跑通完整的交互游戏。

    编写Memory.alloc通过空闲链表实现堆内存首次适应分配算法,在显示器内存映射区画出跳跃旋转的俄罗斯方块方块。
返回 主理人心愿精选 目录

观点与结构均为转述总结,非原文摘录。封面图片来自豆瓣读书,仅作展示。

豆瓣评分与评价人数为逐本人工核实当天的数值。 · GitHub 仓库 · v1.0.0