《Code》—— 从手电筒到计算机
大纲向
《Code: The Hidden Language of Computer Hardware and Software》书名挺长,但是本好书。要是大学时期的老师按照书里的思路展开计算机专业部分的课程,我也不至于学了两年编程还是囫囵吞枣,只能邯郸学步。书里顺带还涉及了信号系统、数字电路等计算机外的部分内容,简直不能更适合当做信息工程或通信工程专业学生的课外读物。相比国内大学教材居高临下式的填鸭式讲法,我看到的几本国外教材(计算机程序的构造和解释、Gilbert Strang的线性代数)由浅入深、循循善诱的展开方式友好了许多。《Code》这本书虽然严格来说不算教材,只是计算机原理入门,但也相当适合和微机原理有缘分的人买来看看。浅显的文笔不会阻碍你深刻认识到计算机工作原理。
全书1-10章对于计算机相关专业学生来说,很易理解,读起来很快。但从11章起到17章自动操作,内容突然有深度起来,读起来颇有思维体操的感觉。在18章了解芯片历史,短暂歇口气后,从19章到22章,你将完整了解到操作系统是怎么建立起来的。在此基础上,最后3章里介绍编程语言时,就一点也不突兀,很好理解了。
作者序
- 内存和外存的区别体现了实际需求和可观性能的矛盾,简单说就是我们目前找不到同时具备两种存储所有优点(既快又持久)的存储媒介
至亲密友
- 编码就是交流
- 2个不同事物通过组合,可以表示所有信息
编码与组合
- 摩尔斯电码
布莱叶盲文和二进制码
- 布莱叶盲文用6个位置的凸点有无编码表示字符
手电筒的剖析
- 电压、电流、电阻、欧姆定律、功率
- 开关的两种状态
绕过拐角的通信
- 电路的串联、并联
- 电路的尺寸极限
电报机和继电器
- 利用电磁现象的电报机和继电器
数字和计数
- 十进制的来源
- 其他进制和二进制
二进制数
- 二进制是最简单的数字系统
- 利用冗余可以消除信息里噪音的影响
- 通用产品代码(条形码)的编码方式
- 奇偶校验
- 模校验字符
- 正反可读
逻辑与开关
- 布尔代数的来源
- 布尔代数的集合解释
- 布尔代数的电路表示
门
自此章起,终于开始进入数字电路到计算机的领域,逻辑门是其中最基础的单元
- 串并联和与或门
- 与或非门的继电器表示
- 与非门和或非门的继电器表示
- 德摩根律
二进制加法器
- 二进制表示下的加法
- 或门(结果输出)+ 与非门(进位输出)
- 半加器和全加器(考虑了进位输入的半加器)
- 8个全加器构成的8位加法器
- 行波进位
如何实现减法
- 补码和反码:用来将减法转化为加法
- 有符号数和无符号数
- 有符号数首位1表示负数
反馈与触发器
- 反馈是更复杂电路的基础
- 振荡器:单纯取反后反馈到输入端的电路
- 周期和频率
- 更复杂的反馈可以构成记忆电路状态的触发器
- RS触发器,可以记忆置位和复位的值
- D型触发器,在保持位为1时,才会保存数据端输入
- D型触发器构成的8位锁存器
- 电平触发和边沿触发
- 边沿触发的D型触发器
- 分频器和8位行波计数器
字节和十六进制
- 字节的来源
- 8位的长度刚好可以表示大多数书面语言的基本字符,对于象形文字,用2个字节也够了
- 字节的十六进制表示
- 十六进制和二进制的转换
存储器结构
- 8-1选择器和3-8译码器
- 8×1RAM:结合了选择器和译码器的8位锁存器
- 译码器和选择器的选择信号相同,这个信号也可以叫做地址
- 8×1RAM里各比特相互独立
- 将2个8×1RAM用共享地址的方式连接到同一个地址/数据/写操作端上,可以得到8×2RAM
- 将2个8×1RAM组合1个2-1选择器和一个1-2译码器,可以得到一个16×1RAM
- RAM的存储容量是2地址输入端个数
- KB、MB、TB、PB、EB
- 64K×8RAM需要2个字节表示的地址
- RAM需要恒定的电流来维持数据
自动操作
- 振荡器 + 16位计数器 + 64K×8RAM + 8位加法器构成的自动累加器
- 代码和数据的区分
- 单独用一块64K×8RAM存储代码,代码指导机器如何操作
- 操作码和操作数
- 第3个字节:操作数的存储地址
- 避免了顺序存储的问题
- 新的寻址方式:Jump指令
- 从指定地址开始寻址指令
- 计算机区分于计算器的基础:条件跳转指令
- 零转移/进位转移/非零转移/无进位转移
- 算术逻辑单元,ALU
- 助记符表示下的机器码
- MOV/LOD/STO/ADD/SUB/ADC/SBB/JMP/...
- 汇编语言、手动汇编
从算盘到芯片
- 算盘
- 对数表、对数尺
- 机械计算器
- 自动织布机与打孔的金属卡片
- 巴贝奇的差分机和解析机
- 赫尔曼·霍尔瑞斯的制表机
- 再次基础上,他成立了IBM
- 从MARK I到13000个继电器的MARK II
- Grace Murray Hopper发现的第一个“bug”
- 真空管的发明
- 图灵的贡献
- 图灵机,可计算性
- 图灵测试法
- ENIAC,此时仍在使用十进制数
- 冯诺依曼和他的EDVAC
- 二进制数
- 存储代码和数据的存储器
- 程序计数器寻址
- 允许条件跳转
- 香农和信息论
- 维纳和控制论
- UNIVAC
- 晶体管的发明和半导体
- NPN晶体管
- 集成电路(IC),又叫芯片
- TTL(晶体管-晶体管逻辑,响应快功率高)和CMOS(互补金属氧化物半导体,响应慢功率低)
- 摩尔定律
- Intel 4004,第一块计算机芯片,或者说微处理器
- Intel 4040,Intel 8008
两种典型的微处理器
- Intel 8008的改进:Intel 8080和Motorola 6800
- Intel 8080
- 振动器输入
- 电源输出
- 接地
- 寻址信号
- 控制信号
- 数据信号
- 汇编里的助记符只是方便我们使用,处理器只能读取字节
- 8080中设置更方便处理器读取信息的寄存器
- 直接寻址和间接寻址
- 栈和程序计数器
- Call命令和子程序
- 内存映像I/O和中断
- Motorola 6800
- little-endian(Intel方式)和big-endian(Motorola方式)
- 高低位字节存储方式在Intel和Motorola芯片里不同,Intel是低字节在前,Motorola则是高字节在前
- 命名来源于《吉列佛游记》里关于吃鸡蛋前先敲碎哪个头的讨论
- 8080被应用在第一台家用电脑Altair 8800上
- Apple II应用了6800的MOS技术改进版6502
- IBM在IBM PC(IBM 5150)里使用了8088芯片,8088芯片的内部结构和8086类似,和8080的操作吗不兼容
- x86系列微处理器包括1982年发布的186和286芯片。之后又发布了32位的386和后续的486以及Intel Pentium系列微处理器,尽管指令集不断扩展,但都支持8086起的所有处理器操作码
- Macintosh采用了Motorola的68000微处理器,并从1994年起使用RISC(精简指令集计算机)微处理器体系的PowerPC微处理器
- 流水线技术(pipelining)和Cache(高速缓冲存储器)
ASCII码和字符转换
- Baudot码/Murray编码
- 转义
- ASCII码
- 7位编码
- 控制字符
- BCD编码
- 8位的ASCII码
- 中日韩字符编码
- 2字节的Unicode编码
- 支持象形文字
总线
- 总线信号
- 地址信号
- 数据输入信号
- 数据输出信号
- 控制信号
- MCA总线/PCI总线
- SRAM、DRAM
- 电子射线管(CRT)
- 水平回归、垂直回归
- 隔行扫描
- 分辨率
- 键盘实现
- 磁带
- 软盘和磁盘
- 磁道和扇区
- 直接内存访问技术(DMA)
操作系统
- PROM、EPROM
- 文件系统
- CP/M
- 引导系统
- API
- QDOS -> MS-DOS
- 层次文件系统
- UNIX和UNIX思想
- GNU
- 多任务
- 内存管理
定点数和浮点数
- 定点:小数点的位置总在数的某个特定位置
- 浮点:基于科学计数法
- 4个字节的单精度
- 8个字节的双精度
- IEEE标准浮点数
- 精度问题
- 数字协同处理器
高级语言和低级语言
- 第一个编写汇编器的人需要手工对程序汇编。之后新的汇编器可以在已有的计算机上编写,利用已有的汇编器进行汇编,这种方式也叫交叉汇编。
- 编译器(程序 -> 机器码)
- FORTRAN,科学计算语言
- ALGOL,高级语言的鼻祖
- for循环
- if语句
- 块、变量声明
- 数组
- 计算机科学又像工程,又像艺术
- COBOL,第一个成功为商业系统使用的程序设计语言
- BASIC
- 解释型语言,边读边执行
- Pascal、Turbo Pascal
- Ada
- C,BCPL(Basic CPL)的后继者
- LISP、APL
- 面向对象程序设计语言
图形化革命
- 用户界面
- SAGE
- 光笔
- 鼠标
- Xerox,PARC,Alto工程
- 图形界面和图形对象
- Macintosh和Mac系统
- Windows系统
- 面向对象语言
- SmallTalk语言
- C++
- Java
- 集成开发环境(IDE)
- 文本信息编码
- RTF
- PostScript
- 计算机图形
- 矢量 -> CAD(计算机辅助设计)
- 光栅 -> 位图
- CCD(电荷耦合器)
- 光感度不同对应不同的像素值阵列(模拟信号 -> 数字信号)
- 数码相机、CD、DVD、VCD
- 数据压缩
- 无损压缩
- 游程长度编码(RLE)
- GIF和LZW压缩
- 有损压缩
- JPEG
- OCR
- 无损压缩
- 脉冲编码调制技术(PCM)
- ADC(模拟数字转换器)和DAC(数字模拟转换器)
- 采样率和奈奎斯特采样定律
- 语言识别
- MIDI合成器
- MPEG
- 调制和解调
- Internet
- WWW
- HTTP
- CGI
- JavaScript
--END--