小土刀

【计算机系统要素】读书笔记

不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之;学至于行而止矣。


前言

不闻不若闻之,闻之不若见之,见之不若知之,知之不若行之;学至于行而止矣。

过去,凡是计算机专业人员都对计算机的工作原理和工作方式了如指掌。计算机体系中的硬件、软件、编译器以及操作系统之间的交互既简单又透明,因此要把握计算机系统大局观并非难事。然而随着现代计算机技术的日趋复杂,这种明晰性不复存在:计算机科学领域里面大多数基本思想和技术都被隐藏在众多抽象接口以及私有实现的层面之下。这种复杂性导致了无法避免的结果,即领域专业化;这使得多门计算机科学领域应运而生,每个领域只涵盖整个学科中的某一个方面。

很多计算机科学的学生识木而不知林,疲于埋头学习程序设计、各种理论以及工程知识,却失去了对计算机系统整体的把我和理解,未曾停下来欣赏计算机系统大局观的美景。这个大局观为我们展示的是:硬件系统和软件系统如何经由隐藏的抽象、接口以及基于各种约定的实现所编织起来的网,从而紧紧地关联在一起。由于没有从表及里地透彻领略这个繁复大局观的魅力,使很多学生和计算机从业人员产生了不安的感觉,因为他们并没有完全透彻理解和掌握计算机的内部工作原理。

涵盖主题有:

  • 硬件:逻辑门;布尔运算;multiplexor;flip-flop;寄存器;RAM;计数器;硬件描述语言;芯片的仿真及测试
  • 体系架构:ALU/CPU 的设计与实现;机器代码;汇编程序设计;取址模式;I/O 内存映像
  • 操作系统:内存管理;数学计算程序库;基本 I/O 驱动程序;屏幕管理;文件 I/O;对高级语言的支持
  • 程序设计语言:面向对象的设计和编程模式;抽象数据类型;作用域;语法与语义;引用机制
  • 编译器:词法分析;自顶向下的语法分析;符号表;基于堆栈的虚拟机;代码生成;数组和对象的实现
  • 数据结构和算法:堆栈;哈希表;链表;递归;算术算法;几何算法;运行效率
  • 软件工程:模块化设计;接口/实现范式;API 设计和文档;主动式测试;广义的程序设计概念;质量保证体系

本书遵循『先抽象再实现』的方式,每一章开头先有背景知识部分,用来描述相关概念和通用的硬件活着软件系统。接下来的规范详述部分提供了对系统抽象的明确描述,即它能提供何种服务。再接下来的实现部分继续讨论如何来实现抽象。之后的观点部分强调每章当中没有考虑却又值得注意的一些问题。每章的最后都是项目部分,提供了逐步进行构建的说明、测试程序和用于实际进行构建并进行单元测试的软件工具

学到三种知识:①计算机如何工作;②如何将复杂问题分解为易于管理的模块;③如何开发大规模硬件和软件系统。

编译 -> 硬件体系 -> 芯片组 -> 逻辑门 -> 原始门 -> 转换设备

我们所拥有的建立和使用抽象概念的能力。一般所谓抽象概念,是作为表达思想的方式,将事物本质性的东西从思维上独立出来,以求用概括的方式来把握事物。而在计算机科学领域里,我们将抽象的概念定义得非常具体,认为她是关于『事物要做什么』的概念,而不用考虑『如何来做』。这种功能性定义必须包含足够的信息以便使用该事物能够提供的服务。事物在实现中的所有内容(包括技巧、内部信息、精妙之处等),都对要使用该事物的客户隐藏起来,因为这些与客户并没有关系。对于所要进行的专业实践而言,我们就需要建立、使用并实现这种抽象。硬件和软件开发者都会定义抽象(也称为『接口』,interfaces)然后进行实现或留给其他人来实现。抽象通常是分层构建(一层构建在另一层之上),从而形成了越来越高层级的抽象能力。

设计良好的抽象是一门实践艺术,掌握这门艺术的最好方法就是学习很多例子。因此,本书基于『先抽象再实现』的范式来进行阐述。每一章都介绍了一个关键的硬件或软件抽象,以及实际实现该抽象的实践项目。抽象的模块化特性使得每一章的内容各自独立,读者只需关心两件事情:理解抽象,然后利用抽象服务和底层构建模块来实现它。

布尔逻辑与运算

每种数字设备都是基于一组用于存储和处理信息的芯片构建而成的。虽然这些芯片在外形上、构成上不尽相同,但是它们都是由相同的构造模块制造而成的:基本的逻辑门。

半加器、全加器、加法器、ALU

机器语言

机器语言是一种约定的形式,用来对底层程序进行编码,从而形成一系列机器指令。应用这些指令,程序员可以命令处理器执行算术和逻辑操作,在内存中进行存取操作,让数据在寄存器之间传递,验证布尔表达式的值,等等。高级语言的基本设计目标是通用性和较强的表达力;与高级语言相反,机器语言的设计目标是能直接运行在指定的硬件平台上,并且能对这个平台进行全面操控。当然,通用性、表达力和良好的结构仍然是必要的,但这些是仅相对于它所支持并直接运行于其上的硬件平台而言的。

机器语言是整个计算机体系中意义最深奥的接口——它也是硬件和软件相接的中间线。借由机器语言,程序员用符号指令表达的抽象思维被转换成执行在硅片上的物理操作。因此,既可以将机器语言看作编程工具,也可以将其看作硬件平台内不可分割的一部分。事实上,正如我们设计机器语言是为了使用给定的硬件平台一样,我们设计硬件平台是为了获取、解析并执行用给定机器语言编写而成的指令。

计算机体系结构

存储程序(stored program)的概念

  • 内存:数据内存;指令内存
  • 中央处理器:算术逻辑单元;寄存器;控制单元
  • 寄存器:数据寄存器;寻址寄存器;程序计数寄存器
  • 输入和输出

编译器

  • 语法分析:词法分析、上下文无关语法、语法分析树、递归下降算法
  • 代码生成:管理符号表;表示变量、对象和数组并生成相应代码;将流程控制命令翻译为底层指令

操作系统

本书所描述的 OS 服务包含了最小规模的操作系统,主要是①以一种对软件友好的方式封装了不同的硬件服务;②用不同的函数和抽象数据类型扩展了高级语言。在这个意义上的操作系统与语言的标准程序库的分界线就不是那么明显。事实上,某些现代语言(例如 Java)就趋向于将很多经典的操作系统服务连同很多语言扩展一期打包到其标准程序库中。

您的支持是对我创作最大的鼓励!

热评文章