前言#

本文档是《CS102:计算机组成与系统》课程伴侣,章节规划大致和课程计划同步。大部分内容取材自《深入理解计算机系统》和《C 程序设计语言》两本教材,如有雷同,纯属故意。技术类书籍在没有掌握的情况下阅读,往往效率低下。通过课程、讲义或手册的形式,将一些核心的概念打磨清楚后再去看书,不仅可以节省大量宝贵的时间,还能真正领会字里行间的深意。所以,本书也可以作为上述两本教材的上手指南。

目标#

本课程的目标是让学生掌握

  • 以复杂的内存和指针方式编写 C 程序

  • 对地址空间以及 C 程序的编译/运行时行为,能够建立一个准确的模型

获得以下能力

  • 把 C 语言转换到 x86-64 汇编语言

  • 编写适配硬件算术局限性的程序

  • 识别程序瓶颈并提高运行时性能

  • 在 Linux 环境中开发程序

贯穿整个课程,最终会带你揭开计算机基础架构的奥秘。

关于课程#

计算机科学教学的前两年,重点是训练你的编程方法和抽象思维能力。在斯坦福大学成功的教学经验中,这两个任务分别由 CS106A 和 CS106B 两门课完成。在 StickMind 课程规划中,这两个任务由 CS101 课程完成,选用 C++ 编程语言。未来也可能会推出现代 C 语言版本的 CS101,敬请期待。

编程方法学的重点是将程序写对,能够利用逐步求精等基本策略,将稍大一些的程序进行分解。这类课程一般会设置一些小游戏或者文本处理,只要求程序能够正确运行即可。抽象思维的重点则是将程序写好,利用一些经典的数据结构和算法,你可以解决一些更为复杂的问题。这类课程不仅要求你把程序写对,更要求你能够高效地解决问题。

经过这些前置课程的训练,你基本能够掌握以下一些能力:

  • 了解 Python/C++/Java 基本语法

  • 会用递归思维解决问题

  • 理解数据抽象并能够实现经典的抽象数据类型(链表、栈、堆、集合、映射)

  • 理解并能够实现经典算法(搜索、排序、回溯、哈希)

作为一名程序员,你也应该具备良好的软件工程能力,能够编写组织良好、可读性强的代码。

本课程在计算机科学教学中充当了承上启下的作用。这类课程一般以“计算机组成原理”或“计算机系统基础”冠名。前者偏重硬件,会涉及到 CPU 的内部细节,甚至会要求你设计一个 CPU 模拟器;而后者则偏重软件,以软件开发者的视角抽象看待硬件,不会在硬件层面花费太多精力。本课程倾向于后者,继续提升你的编程技术,在广度和深度上拓展你的编程经验。

本课程将从 C 语言开始,逐步深入到底层汇编语言,一步步带你梳理计算机的运行机制。当完全理解计算机如何执行程序并操作数据时,你将会成为一名更高效的程序员,特别是在处理调试问题、性能优化、内存管理以及程序健壮性方面。只有理解程序是如何运行的,你才能更好地理解 Python/C++/Java 这些高级语言的底层执行逻辑,才能更快地学习其他编程语言进行开发。