《Code》—— 从手电筒到计算机

大纲向

《Code: The Hidden Language of Computer Hardware and Software》书名挺长,但是本好书。要是大学时期的老师按照书里的思路展开计算机专业部分的课程,我也不至于学了两年编程还是囫囵吞枣,只能邯郸学步。书里顺带还涉及了信号系统、数字电路等计算机外的部分内容,简直不能更适合当做信息工程或通信工程专业学生的课外读物。相比国内大学教材居高临下式的填鸭式讲法,我看到的几本国外教材(计算机程序的构造和解释、Gilbert Strang的线性代数)由浅入深、循循善诱的展开方式友好了许多。《Code》这本书虽然严格来说不算教材,只是计算机原理入门,但也相当适合和微机原理有缘分的人买来看看。浅显的文笔不会阻碍你深刻认识到计算机工作原理。

全书1-10章对于计算机相关专业学生来说,很易理解,读起来很快。但从11章起到17章自动操作,内容突然有深度起来,读起来颇有思维体操的感觉。在18章了解芯片历史,短暂歇口气后,从19章到22章,你将完整了解到操作系统是怎么建立起来的。在此基础上,最后3章里介绍编程语言时,就一点也不突兀,很好理解了。

作者序

  • 内存和外存的区别体现了实际需求和可观性能的矛盾,简单说就是我们目前找不到同时具备两种存储所有优点(既快又持久)的存储媒介

至亲密友

  • 编码就是交流
  • 2个不同事物通过组合,可以表示所有信息

编码与组合

  • 摩尔斯电码

布莱叶盲文和二进制码

手电筒的剖析

  • 电压、电流、电阻、欧姆定律、功率
  • 开关的两种状态

绕过拐角的通信

  • 电路的串联、并联
  • 电路的尺寸极限

电报机和继电器

  • 利用电磁现象的电报机和继电器

数字和计数

  • 十进制的来源
  • 其他进制和二进制

二进制数

  • 二进制是最简单的数字系统
  • 利用冗余可以消除信息里噪音的影响
  • 通用产品代码(条形码)的编码方式
    • 奇偶校验
    • 模校验字符
    • 正反可读

逻辑与开关

  • 布尔代数的来源
  • 布尔代数的集合解释
  • 布尔代数的电路表示

自此章起,终于开始进入数字电路到计算机的领域,逻辑门是其中最基础的单元

  • 串并联和与或门
  • 与或非门的继电器表示
  • 与非门和或非门的继电器表示
  • 德摩根律

二进制加法器

  • 二进制表示下的加法
    • 或门(结果输出)+ 与非门(进位输出)
  • 半加器和全加器(考虑了进位输入的半加器)
  • 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--