Crash Course Computer Science【计算机科学速成课】(1)
感谢速成课!感谢 Carrie Anne!感谢中文翻译组!~
原视频
Crash Course Computer Science
https://github.com/1c7/crash-course-computer-science-chinese
第 1 集:计算机早期历史
- 算盘 → 步进计算器 → 差分机 → 分析机 → 打孔卡片制表机
- 最早的计算设备是算盘,大约公元前 2500 年发明于”美索不达米亚”.
- 在接下来 4000 年,人类发明了各种巧妙的计算设备 比如星盘,让船只可以在海上计算纬度 或计算尺,帮助计算乘法和除法.
- 最早使用 “计算机” 一词的文献是1613 年的一本书,作者 Richard Braithwait 然而指的不是机器,而是一种职业,指负责计算的人.
- 1800 年后Computer逐渐开始从指代职业变成指代机器.
- 机器里有名的是:步进计算器,第一个可以做加减乘除的机器,沿用了 3 个世纪.
- 炮弹为了精准,要计算弹道,二战是查表来做,但每次改设计了就需要做一张新表.
- Charles Babbage 提出了 “差分机“, 一个更复杂的机器,能近似多项式,在构造差分机期间,想出了分析机, 分析机是通用计算机 ,它可以做很多事情,不只是一种特定运算.
- Ada Lovelace 给分析机写了假想程序,因此成为了第一位程序员
- 美国政府在 1890 年的人口普查中面临着严重的问题,预计要 13 年完成,Herman Hollerith 的打孔卡片制表机大大提升了效率,使人口普查在短短两年半内完成.
- Hollerith 成立了制表机器公司,这家公司后来在 1924 年与其它机械制造商合并成为了 “国际商业机器公司“,简称 IBM.
第 2 集:电子计算机
- 继电器 → 真空管 → 晶体管
- 20世纪的发展要求更强的计算能力,柜子大小的计算机发展到房间大小 ,最大的机电计算机之一是哈佛 Mark 1 号,IBM 1944 年做的,大脑是”继电器“,给”曼哈顿计划”跑模拟.
- 1940 年代一个好的继电器 1 秒能翻转 50 次,哈佛马克一号1 秒能做 3 次加法或减法运算,一次乘法要花 6 秒,除法要花 15 秒
- 除了速度慢,另一个限制是齿轮磨损,随着继电器数量增加,故障概率也会增加,同时这些巨大,黑色,温暖的机器也会吸引昆虫,1947年9月,哈佛马克2型的操作员从故障继电器中,拔出一只死虫这就是术语 “bug“(虫子)的来源.
- 1904 年,热电子管出现,世界上第一个真空管。改进为三极真空管后变成和继电器的功能一样,并且真空管内没有会动的组件,更少的磨损,每秒可以开闭数千次.
- “巨人1号” 计算机在英国,布莱切利园,首次大规模使用真空管,用于破解纳粹通信,被认为是第一个可编程的电子计算机但编程麻烦,还要配置.
- 1946 年,宾夕法尼亚大学的 ENIAC 是第一个通用可编程计算机,每秒可执行 5000 次十位数加减法.
- 1947 年,贝尔实验室做出了晶体管,晶体管有诸多好处,每秒可以切换上百万次,并且能工作几十年,IBM 很快全面转向晶体管
- 很多晶体管和半导体的开发在”圣克拉拉谷”,在加州位于”旧金山”和”圣荷西”之间,而生产半导体最常见的材料是硅,所以这个地区被称为 “硅谷“
- William Shockley 搬了过去,创立了肖克利半导体 → 仙童半导体 → 英特尔
第 3 集:布尔逻辑和逻辑门
- 3个基本操作:NOT,AND,OR以及XOR 异或,异为真,同为假

第 4 集:二进制
- 8 位能表示的最小数是 0,最大数是 255,1 bytes = 8 bits 存储单位MB GB TB 等,32 位能表示的最大数是 43 亿左右,64 位能表达最大数大约是 9.2×10 ^ 18,
- Instagram 照片很清晰,它们有上百万种颜色,因为如今都用 32 位颜色
- 大部分计算机用第一位表示正负,1 是负,0 是正,最常见的是 IEEE 754 标准表示浮点数,在 32 位浮点数中第 1 位表示数的符号——正或负,接下来 8 位存指数,剩下 23 位存有效位数
- 美国信息交换标准代码 - ASCII, 用来表示字符
.png)
- UNICODE 1992 年诞生,是字符编码标准, 解决 ASCII 不够表达所有语言的问题,最常见的 Unicode 是 16 位的,有超过一百万个位置
第 5 集:算数逻辑单元 - ALU
ALU 算术逻辑单元,有 2 个单元,1 个算术单元和 1 个逻辑单元
算术单元,负责计算机里的所有数字操作
- 半加器 (处理1个 bit,2个输入) 输出”总和”和”进位”
.png)
- 全加器 (处理1个 bit,3个输入)
.png)
- 半加器 (处理1个 bit,2个输入) 输出”总和”和”进位”
8 bit 加法 (1个半加器,7个全加器)
- 把这个全加器的进位连到下个全加器的输入,8位行波进位加法器
.png)
- 如果第 9 位有进位,代表着 2 个数字的和太大了,超过了 8 位这叫 “溢出“ (overflow)。著名的例子是,吃豆人用 8 位存当前关卡数,如果你玩到了第 256 关( 8 位 bit 最大表示 255),ALU 会溢出,造成一连串错误和乱码,使得该关卡无法进行,这个 bug 成了厉害吃豆人玩家的代表
- 缺点是每次进位都要一点时间但如今的量级是每秒几十亿次运算,所以会造成影响,所以,现代计算机用的加法电路有点不同,叫 “超前进位加法器”
- 乘法用多次加法来实现,除法用迭代减法实现
- 把这个全加器的进位连到下个全加器的输入,8位行波进位加法器
逻辑单元
- 能做简单的数值测试,检测数字是否为 0 的电路(一堆 OR 门最后加个 NOT 门)
工程师不想在用 ALU 时去想那些事情,ALU抽象成一个 V 符号
ALU 还会输出一堆Flag 标志(是否相等,是否小于,是否溢出等等)
第 6 集:寄存器和内存
本集重点是 Memory (存储 / 内存 两种含义)
- “随机存取存储器“,简称”RAM“,在断电时损失数据
- 存 1 位 “AND-OR 锁存器“(Gated Latch - 锁存器)
- 它有两个输入,”设置”输入, 把输出变成 1,”复位”输入, 把输出变成 0 ,如果”设置”和”复位”都是 0,电路会输出最后放入的内容
.png)
- 一根线来”启用”内存,这条线叫 “允许写入线”
.png)
- 它有两个输入,”设置”输入, 把输出变成 1,”复位”输入, 把输出变成 0 ,如果”设置”和”复位”都是 0,电路会输出最后放入的内容
- 存 8 位 (Register - 寄存器)
- 如果我们并排放 8 个锁存器,可以存 8 位信息,比如一个 8 bit 数字,一组这样的锁存器叫 “寄存器”,寄存器能存一个数字,这个数字有多少位,叫”位宽”,如今许多计算机都有 64 位宽的寄存器
.png)
- 为了减少线的数量,在矩阵中做成网格,要启用某个锁存器,就打开相应的行线和列线,只有行线和列线均为1, AND 门才输出 1
- 如果我们并排放 8 个锁存器,可以存 8 位信息,比如一个 8 bit 数字,一组这样的锁存器叫 “寄存器”,寄存器能存一个数字,这个数字有多少位,叫”位宽”,如今许多计算机都有 64 位宽的寄存器
- 16x16 的矩阵存 256 位,数据选择器/多路复用器 (Multiplexer) 解码 8 位地址,定位到单个锁存器,输入一个 8 位地址,4 位代表行, 4 位代表列
- 不断把内存打包到更大规模,随着内存地址增多,内存地址也必须增长,内存的一个重要特性是:可以随时访问任何位置,因此叫 “随机存取存储器” ,简称 RAM
第 7 集:中央处理器(CPU)
- RAM + 寄存器 + ALU 做个 CPU
- 一个寄存器追踪程序运行到哪里了,我们叫它 “指令地址寄存器”,存当前指令的内存地址
- 另一个寄存器存当前指令,叫 “指令寄存器”
- 进行”取指令→解码→执行“ 这个循环
- 时钟以精确的间隔 触发电信号控制单元会用这个信号,推进 CPU 的内部操作,确保一切按步骤进行,CPU “取指令→解码→执行” 的速度叫 “时钟速度“, 单位是赫兹
- 第一个单芯片 CPU 是 “英特尔 4004” 1971 年发布的 4 位CPU,时钟速度达到了 740 千赫兹 - 每秒 74 万次
- 一兆赫兹是 1 秒 1 百万个时钟周期,而看视频的电脑或手机,肯定有几千兆赫兹
- 超频,修改时钟速度,加快 CPU 的速度,提升性能,但超频太多会让 CPU 过热或产生乱码,因为信号跟不上时钟,而降频省电,这叫 “动态调整频率“
第 8 集:指令和程序
本集重点:一步步带你运行一遍程序
- ”指令集”
- LOAD_A,LOAD_B,SUB,JUMP,ADD,HALT 等指令
.png)
- JUMP 0 可以跳回开头,JUMP 在底层的实现方式是用指令后 4 位的值覆盖掉 “指令地址寄存器” 里的值
- 带条件跳转,JUMP NEGATIVE 只在 ALU 的 “负数标志” 为真时,即算术结果是负数才跳转,还有其他类型的 JUMP
- 真正现代 CPU 用更多指令集,位数更长。
- LOAD_A,LOAD_B,SUB,JUMP,ADD,HALT 等指令
- 1971年的英特尔 4004 处理器,有 46 个指令,如今英特尔酷睿 i7, 有上千条指令
第 9 集:高级 CPU 设计
- 早期是加快晶体管切换速度,来提升 CPU 速度,但这种提速方法最终会碰到瓶颈,处理器厂商发明各种新技术来提升性能,不但让简单指令运行更快也让它能进行更复杂的运算
- 现代处理器有专门电路来处理图形操作, 解码压缩视频, 加密文档 等等,给 CPU 专门的除法电路 + 其他电路来做复杂操作,比如游戏,视频解码
- 一条”从内存读数据”的指令可能要多个时钟周期,CPU 空等数据,解决延迟的方法之一是给 CPU 加缓存,提高数据存取速度,更快喂给 CPU
- 缓存和 RAM 不一致了,这种不一致必须记录下来,之后要同步,因此缓存里每块空间有一个特殊标记叫脏位 Dirty bit
- 另一种提升性能的方法叫流水线设计,并行处理 - parallelize,更进一步,动态排序有依赖关系的指令,最小化流水线的停工时间,乱序执行 - out-of-order execution
- 简单的流水线处理器,看到 JUMP 指令会停一会儿,等待条件值确定下来,一旦 JUMP 的结果出了,处理器就继续流水线,因为空等会造成延迟,所以高端处理器会用一些技巧
- 可以把 JUMP 想成是 “岔路口”,高端 CPU 会猜哪条路的可能性大一些,然后提前把指令放进流水线,这叫 “推测执行“
- 当 JUMP 的结果出了,如果 CPU 猜对了,流水线已经塞满正确指令,可以马上运行,如果 CPU 猜错了,就要清空流水线,为了尽可能减少清空流水线的次数,CPU 厂商开发了复杂的方法来猜测哪条分支更有可能,叫”分支预测“
- 现代 CPU 的正确率超过 90%
- 另一个提升性能的方法是同时运行多个指令流用多核处理器,如双核或四核处理器意思是一个 CPU 芯片里,有多个独立处理单元,很像是有多个独立 CPU,但因为它们整合紧密,可以共享一些资源,比如缓存,使得多核可以合作运算,但多核不够时,可以用多个 CPU,高端计算机,比如Youtube 服务器需要更多马力,让上百人能同时流畅观看,2个或4个CPU是最常见的,但有时人们有更高的性能要求所以造了超级计算机!
第 10 集:早期的编程方式
- 早期计算机如何编程
- 打孔纸卡 → 插线板 → 面板拨开关
- 程序和数据都存在一个地方,叫冯诺依曼架构 Von Neumann Architecture
- 冯诺依曼计算机的标志是,一个处理器(有算术逻辑单元)+数据寄存器+指令寄存器+指令地址寄存器+内存(负责存数据和指令)
- 第一款取得商业成功的家用计算机: Altair 8800 ,编程依然很困难,人们需要更友好更简单的方式编程
Crash Course Computer Science【计算机科学速成课】(1)
http://example.com/2025/02/22/Crash Course Computer Science【计算机科学速成课】(1)/