内容简介
本书涵盖数电、体系结构、汇编语言、编译器、操作系统等计算机核心课程的基础内容,结合项目实践能够对整个计算机学科建立宏观的理解,并能完成制作一个基本计算机系统的任务。
目录
目 录
译者序
前言
第一部分 硬件
I.1 Hello,World之下 2
I.2 从与非门到俄罗斯方块 3
I.3 抽象与实现 4
I.4 设计方法 5
I.5 前方之路 6
第1章 布尔逻辑 7
1.1 布尔代数 7
1.1.1 布尔函数 8
1.1.2 真值表和布尔表达式 8
1.2 门 9
1.3 硬件构造 10
1.3.1 硬件描述语言 11
1.3.2 硬件模拟 13
1.4 规范 14
1.4.1 与非门 14
1.4.2 基本逻辑门 14
1.4.3 基本门的多位版本 15
1.4.4 基本门的多路版本 16
1.5 实现 17
1.5.1 行为模拟 17
1.5.2 硬件实现 18
1.5.3 内置芯片 19
1.6 实验 19
1.7 总结与讨论 20
第2章 布尔运算 21
2.1 算术运算 21
2.2 二进制数 21
2.3 二进制加法 22
2.4 有符号二进制数 23
2.5 规范 24
2.5.1 加法器 24
2.5.2 算术逻辑单元 25
2.6 实现 28
2.7 实验 29
2.8 总结与讨论 29
第3章 存储 31
3.1 存储设备 31
3.2 时序逻辑 32
3.2.1 时间很重要 32
3.2.2 触发器 34
3.2.3 组合与时序逻辑 34
3.3 规范 35
3.3.1 数据触发器 36
3.3.2 寄存器 36
3.3.3 RAM 37
3.3.4 计数器 38
3.4 实现 38
3.4.1 数据触发器 38
3.4.2 寄存器 38
3.4.3 RAM 39
3.4.4 计数器 40
3.5 实验 40
3.6 总结与讨论 41
第4章 机器语言 42
4.1 机器语言概述 42
4.1.1 硬件单元 42
4.1.2 语言 43
4.1.3 指令 44
4.2 Hack的机器语言 45
4.2.1 背景 45
4.2.2 程序示例 48
4.2.3 Hack语言规范 49
4.2.4 符号 50
4.2.5 输入/输出处理 52
4.2.6 语法约定和文件格式 52
4.3 Hack编程 53
4.4 实验 55
4.5 总结与讨论 57
第5章 计算机体系结构 58
5.1 计算机体系结构基础 58
5.1.1 存储程序的概念 58
5.1.2 冯·诺依曼体系结构 59
5.1.3 存储器 59
5.1.4 中央处理单元 60
5.1.5 输入和输出 61
5.2 Hack硬件平台规范 62
5.2.1 概述 62
5.2.2 中央处理单元 62
5.2.3 指令存储器 63
5.2.4 输入/输出 63
5.2.5 数据存储器 65
5.2.6 计算机 66
5.3 实现 66
5.3.1 中央处理单元 66
5.3.2 内存 68
5.3.3 计算机 68
5.4 实验 69
5.5 总结与讨论 70
第6章 汇编器 72
6.1 背景 72
6.2 Hack机器语言规范 73
6.2.1 程序 74
6.2.2 符号 74
6.2.3 语法约定 75
6.3 汇编到二进制的翻译 76
6.3.1 处理指令 76
6.3.2 处理符号 76
6.4 实现 77
6.4.1 实现一个基本的汇编器 77
6.4.2 完成汇编器 79
6.5 实验 79
6.6 总结与讨论 81
第二部分 软件
II.1 Jack编程初探 85
II.2 程序的编译 87
第7章 虚拟机Ⅰ:处理 89
7.1 虚拟机范式 90
7.2 栈机器 91
7.2.1 入栈和出栈 91
7.2.2 栈上的算术运算 92
7.2.3 虚拟内存段 94
7.3 虚拟机规范:第一部分 94
7.4 实现 95
7.4.1 Hack平台上的标准虚拟机
映射:第一部分 96
7.4.2 虚拟机模拟器 98
7.4.3 有关虚拟机实现的设计建议 99
7.5 实验 101
7.6 总结与讨论 102
第8章 虚拟机Ⅱ:控制 105
8.1 高级魔法 105
8.2 分支 106
8.3 函数 108
8.4 虚拟机规范:第二部分 113
8.4.1 分支命令 113
8.4.2 函数命令 113
8.4.3 虚拟机程序 113
8.5 实现 114
8.5.1 函数调用和返回 114
8.5.2 Hack平台上的标准虚拟机
映射:第二部分 115
8.5.3 有关虚拟机实现的设计建议 117
8.6 实验 118
8.7 总结与讨论 120
第9章 高级语言 122
9.1 例子 122
9.2 Jack语言规范 126
9.2.1 语法元素 126
9.2.2 程序结构 127
9.2.3 数据类型 128
9.2.4 变量 130
9.2.5 语句 130
9.2.6 表达式 130
9.2.7
前言/序言
前 言
不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之。学至于行之而止矣。
—荀子(公元前313—公元前238)
人们普遍认为,21世纪的聪明人应该熟悉BANG背后的基本思想,BANG是比特(Bit)、原子(Atom)、神经元(Neuron)和基因(Gene)的缩写。尽管在利用科学手段揭示BANG的基本运行系统方面,已经取得了显著成功,但我们很可能永远不能完全理解原子、神经元和基因实际上是如何工作的。然而,比特以及计算系统整体构成了一个令人欣慰的例外:尽管它们的复杂性令人惊叹,但人们完全可以理解现代计算机系统的工作原理以及构建方式。因此,当我们心怀敬畏地凝视着周围的BANG时,令人愉悦的是,至少在这个“四重奏”中,有一个领域可以被人类完全理解。
事实上,在计算机发展的早期,任何好奇的探索者都可以对机器如何工作有整体的理解。硬件和软件之间的交互简单、透明,人们很容易对计算机的运行形成一幅连贯图景。然而,随着数字技术变得越来越复杂,这种清晰度几乎消失了:计算机科学领域中最基本的思想和技术(这个领域的本质)现在隐藏在层层叠叠的晦涩界面和封闭实现之下。这种复杂性的必然结果是专业化:对专门的应用计算机科学的研究成为许多专业化课程的追求,每个课程都只涵盖该领域的一个方面。
我们之所以写这本书,是因为我们发现许多计算机科学专业的学生“只见树木不见森林”。通常,计算机专业的学习者被要求学习编程、理论和工程等一系列课程,而没有机会停下来欣赏这门学科优美的整体图景。而在这门学科的整体图景中,硬件、软件和应用系统通过一系列抽象、界面和基于约定的实现紧密关联。
如果不能看清这一错综复杂的图景,许多学习者和专业人士会感到不安—他们并没有完全理解计算机内部发生了什么。这是令人遗憾的,因为计算机是21世纪最重要的机器。
我们认为,理解计算机的最佳方法是从零开始构建一台计算机。基于这个理念,我们提出了以下的想法:先描述一个简单但功能足够强大的计算机系统,并请学习者从头开始为其构建硬件平台和软件层次结构。并且,在构建过程中,我们要采取正确而有效的方法,因为从零构建一台通用计算机是一项巨大的工程。
因此,我们找到了一个独特的教育的契机,不仅要构建这台计算机,还要以动手实践的方式展示如何有效地规划和管理大规模的硬件和软件开发项目。此外,我们希望通过严谨的逻辑和模块化规划,帮助读者体验从零构建一个复杂而有用的系统这一令人激动与兴奋的过程。
这项努力的结果就是现在这门称为“从与非门到俄罗斯方块”的课程。这是一个动手实践的旅程,学生从最基本的逻辑门(与非门)开始,经历十二个实验之后,最终得到一个能够运行俄罗斯方块游戏以及任何能想到的其他程序的通用计算机系统。在经历过多次设计、构建、重新设计和重新构建该计算机系统后,我们撰写了这本书,并希望让任何学习者都可以做同样的事情。我们还建设了 www.nand2tetris.org 网站,向任何想学习或教授“从与非门到俄罗斯方块”课程的人免费提供所有实验材料和软件工具。
我们很高兴地看到,这些工作的反响非常强烈。如今,“从与非门到俄罗斯方块”这门课程在世界各地的许多大学、高中、编程训练营、在线平台和黑客俱乐部中开设。这本书和我们的在线课程非常受欢迎,成千上万的学习者(从高中生到谷歌工程师)经常发布评论,称“从与非门到俄罗斯方块”课程是他们迄今为止获得的最佳教育经历。正如理查德·费曼曾经说过的:“我不能理解一个我不能创造的东西。”这门课程就是让学习者通过创造来理解。显然,人们对这种创造者的心态充满激情。
自本书第1版出版以来,我们收到了许多问题、评论和建议。由于我们主要通过更新在线资料来解决这些问题,因此网站版本和书籍之间出现了差距。此外,我们觉得,书籍的多个章节由于在组织结构和表达清晰上的优势,对读者有更大帮助。因此,在多次拖延书籍的修订之后,我们终于决定动手编写第2版,就是现在的这本书。前言的其余部分会描述这个新版本的内容,并且将其与上一版进行对比。
范围
本书通过一系列硬件和软件的构建任务向学习者介绍了大量的计算机科学领域的知识。特别地,在动手实验中讨论了以下主题:
●硬件:布尔运算,组合逻辑,时序逻辑,逻辑门、多路选择器、触发器、寄存器、RAM 单元、计数器的设计与实现,硬件描述语言(Hardware Description Language, HDL),芯片模拟、验证和测试。
●架构:ALU/CPU 的设计和实现、时钟和周期、寻址模式、取指和执行逻辑、指令集、基于内存映射的输入/输出。
●低级语言:一个简单的机器语言(包括二进制版和符号版)的设计与实现、指令集、汇编编程、汇编器。
●虚拟机: