Skip to content

15213课程目标(中文版)

原文节选自 https://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15213-m23/www/ 的course syllabus

本课程的目标是通过介绍所有计算机系统背后共同的基本概念,让你成为更好的程序员。我们希望你了解,当程序运行的时候,究竟都发生了什么事情。这样,当事情不对劲的时候(这样的问题迟早会出现),你就有心智能力来解决问题。

大部分情况你都用高级语言来写程序,那为什么要理解底层的计算机系统?在计算机科学中,我们大多数时间都采用一些抽象,在那些抽象提供的思维框架内思考。但任何一种抽象都会忽略一些东西,有时忽略的东西会变得至关重要。作为类比,牛顿力学会忽略相对论效应。对于低速运动(不超过0.1倍光速)的物体,牛顿力学的抽象是完美的。但更高的速度下就需要我们考虑更多的细节。

下面列举的一些"现实”,举出了你之前所学的抽象不再适用的一些场景:

  1. “Int”数据类型不是数学上的整数。“Float”数据类型不是数学上的实数。我们用有限位表示数字,这个局限的影响很大。有时我们不得不考虑二进制位如何表示整数和浮点数。
  2. 你必须懂点汇编语言。你可能从来不用汇编语言写程序,但有时程序的行为就是不能纯粹在高级语言的抽象层面解释。另外,熟悉机器层面的计算模型,才能理解一些bug的效果。
  3. 内存很重要。计算机内存不是无限的,必须好好分配和管理。内存引用出错的后果很严重。访问某个结构体时出错,可能导致逻辑上毫无关联的另一个结构体被修改。另外,缓存和虚拟内存提供了功能逻辑上无限的内存地址空间,但并不能提供“无限内存”的性能。
  4. 程序的性能不只是渐进复杂度。常数因子也很重要。有一套系统的方式来评估和优化程序的性能。
  5. 计算机不仅仅要执行指令。它们还需要完成数据的输入输出、通过网络和其他系统交互。 上完这门课,你会对这些“现实”的细节有更多的理解,为选修CMU的EECS专业更高阶的系统类课程做好准备。更重要的是,你会学到在你的职业生涯中都从中受益的知识和技能。

具体来说,我们设置了下列的学习目标,在完成这门课后,你应当有能力做这些事情:

  1. 解释常见的数据类型的二进制位表示(无符号表示,补码表示,浮点数表示)以及相关的算术运算和位运算的数学性质。
  2. 认识C语言表示的程序和汇编语言表示的程序的关系,包括表达式、控制流、函数和数据结构的实现
  3. 能通过程序的二进制表示,理解程序的基本意图,并应用这些能力来调试程序。
  4. 了解程序员通过不同的API和抽象与底层系统的交互,包括进程和线程、虚拟内存和网络的系统支持
  5. 分析有缺陷的系统运行带来的后果,例如糟糕的内存和CPU性能、崩溃以及安全漏洞。
  6. 应用标准的和自己定制的工具,来辅助程序开发,包括编译器、代码分析器、调试器、一致性检查和性能分析工具等。
  7. 应用上述的分析能力和使用工具能力,运用现代计算机系统的不同组件,编写可靠、高效的程序。
  8. 理解共享资源的多线程执行中可能发生的冲突,并能够用一些同步方式解决这些冲突。