C语言学习笔记——历史知识

开始学 C 之前, 大多数教材都要先铺一堆计算机发展史. 问题是这部分内容在书里动辄写几十页, 而真正会出现在卷子上的可能就两三个空.

所以这篇笔记的写法是: 先按框架把该懂的讲清楚, 再把”书上写了一大堆但根本不考”的挑出来, 最后单独开一节写”书上没细讲但真题考过”的. 凡是我觉得不值得深究的, 则仅贴出应试所需背诵的结论

部分内容部分教材不作涉及可跳过

关于进制转换、存储容量计算这些偏计算的内容见后续笔记

0 综述

这章的知识点只有五块, 而且彼此是并列关系

1
2
3
4
5
6
7
8
C语言概念知识
├── 1 冯·诺依曼体系结构 ← 最常考, 必须记牢
│ └── 程序存储思想
├── 2 电子计算机发展历程 ← 只考"名称的先后顺序"
├── 3 程序设计语言的种类 ← 略懂即可
├── 4 C语言的优势 ← 选择题常出
└── 5 C语言的开发过程 ← 最常考, 必须记牢
└── 编辑 → 编译 → 链接 → 运行

按重要度排, 大概是这样:

板块 重要度 说明
冯·诺依曼体系结构 ★★★★★ 五大部件、程序存储思想, 几乎必考
C语言的开发过程 ★★★★★ 四步顺序 + 每步产物后缀, 几乎必考
C语言的优势 ★★★★ “下列属于C语言特点的是”, 高频, 但有印象即可, 几乎无相关填空
计算机发展历程 ★★★ 只考名称顺序, 不考年份
程序设计语言种类 ★★ 记住三分法和”能不能直接执行”

1 冯·诺依曼体系结构(★★★★★)

1.1 核心就一句话: 程序存储思想

冯·诺依曼最重要的贡献不是造了台机器, 而是提出了程序存储这个思想:

把程序和数据一起, 以二进制形式存放在存储器里, 让计算机自动按顺序取出并执行

这个架构的划时代性在于: 在它之前, 想换一个计算任务得重新接线; 有了这个思想, 换任务只要换一份程序. 这就是现代计算机的起点.

1.2 五大部件

计算机硬件由这五部分组成:

部件 作用 备注
运算器 算术运算、逻辑运算 和控制器合称 CPU
控制器 指挥各部件协调工作 和运算器合称 CPU
存储器 存放程序和数据 分内存、外存
输入设备 把信息送进计算机 键盘、鼠标
输出设备 把结果送出计算机 显示器、打印机

这五个部件的名称必须能默写. 注意考题会把”存储器”换成”内存”以起到迷惑效果, 内存更快更即时(也更贵), 外存存储更持久但读写速度会慢不少.

有关存储器的部分, 详见存储器与进制一章

如对于16GB + 1TB的电脑, 前者就是内存, 后者即为外存

2 电子计算机的发展历程(★(★★))

2.1 只记名称顺序

这段历史书上通常写得很长, 还配年份和代表机型. 年份和机型不用背, 只需要记住四个阶段的元器件名称按什么顺序演进:

阶段 主要元器件 特点
第一代 电子管 又大又热, 最早的那批
第二代 晶体管 比电子管小、省电
第三代 中小规模集成电路 一块芯片集成多个元件
第四代 大规模 / 超大规模集成电路 就是现在集成度更高的的计算机

记忆链条很短:

1
电子管 → 晶体管 → 中小规模集成电路 → 大规模集成电路

2.2 关于”计算机的诞生”

  • ENIAC 是世界上第一台电子数字计算机 ( 年, 美国宾夕法尼亚大学)
  • 但真正体现冯·诺依曼”程序存储”思想的是 EDVAC

3 程序设计语言的种类(★★(★))

这一节分清三个主要层次和”能不能直接被计算机执行”就行

语言层次 代表 计算机能否直接执行 现状
机器语言 二进制指令 能, 直接执行 几乎不直接用
汇编语言 符号化的指令 (如 ADD) 不能, 需汇编程序翻译 很少用, 作为保底
高级语言 C、C++、Java、Python 不能, 需编译或解释程序翻译 绝大情况下都会用
非过程化语言 聊天式指令 不能, 需先由计算机生成上述某种语言再进一步处理

三者的关系:

1
2
高级语言  ──编译/解释──┐
汇编语言 ──汇编──────┼──→ 机器语言 ──→ 计算机执行

3.1 高级语言的细分

3.1.1 按照编程用途/风格分类

高级语言按照编程用途/风格分类大体可以分为日常写代码用的语言和特定领域下才用的语言

前者包含两种: - 命令式语言: 较老, 结构较为直接, 程序运行的过程直接对应问题求解的过程, 如C, Pascal, Basic等(其中Pascal最老) - 面向对象语言: 较新, 结构更为紧凑, 封装性强(最显著的特点就是有类和继承的存在), 如Python, Java, C++, C#等

后者包含两种: - 逻辑式语言: 对算力要求相对较低, 描述事实和规则, 让计算机自己推理, 主要用于专家系统, 语义识别等场景, 如Prolog语言 - 函数式语言: 对算力要求较高, 使用 演算, 把计算看成函数求值, 输入数据并返回数据, 主要用于大型计算场景如Agent

3.1.2 按照程序设计方法分类

另外按照程序设计方法分类还需要了解结构化程序设计语言, 该类语言的程序只由三种基本结构组成(顺序, 选择, 循环), 以及代码尽量自上而下顺序编写, 由于定义上较为重合, 因此大部分命令式语言都是结构化程序设计语言, 较老的Pascal即是第一个结构化程序设计语言

4 C语言的优势

C语言的特点, 选择题里常以”下列叙述中, 属于(或不属于)C语言特点的是”出现. 需要掌握下面几条:

特点 含义
简洁、紧凑 关键字少, 书写灵活
运算符丰富 运算符种类多, 表达能力强
数据类型丰富 有整型、实型、字符型、指针、结构体等
结构化 只有顺序、选择、循环三种基本结构
可访问物理地址 指针和地址几乎算是C语言系列独有的触及底层硬件的功能了, 由于过于硬(nan)核(xue), Python, Java等新兴语言中均已移除
可移植性好(通用性强) 换个机器, 改少量代码甚至不改就能用
运行效率高 生成的可执行程序运行效率高

其中结构化这条最核心, 展开说就是:

C语言是结构化程序设计语言, 它的三种基本结构是 顺序、选择(分支)、循环. 在 C 里, 程序的模块化是靠函数实现的

要背的就上面6条标题词 + “3种基本结构” + “1个实现方式”. C语言的起源、和 B 语言的关系、发明者等基本不考

5 C语言的开发过程(★★★★★)

5.1 四步流程(重点)

这是整章最常考的地方, 尤其是每一步产生什么文件:

1
2
3
4
编辑         编译          链接         运行
│ │ │ │
源程序.c ──→ 目标文件.obj ──→ 可执行文件.exe ──→ 结果
(文本) (二进制) (二进制)

对应关系整理成表:

步骤 做什么 产物 后缀
编辑 写源代码 源程序文件 .c
编译 翻译成机器指令 目标文件 .obj
链接 与库函数等连接 可执行文件 .exe
运行 执行程序 运行结果 —

有两步省略了: 预处理和装载, 因为存在感较低, 其中预处理是处理文件头部#include相关语句, 产生 .i 文件; 装载则是将 .exe 程序装入内存中等待执行, 与C语言本身关联极小

5.2 三个坑

  1. C语言是编译型语言, 只能编译执行, 不能解释(即逐行翻译并直接执行)执行 (对比: Python 属于解释型, 因为逐行翻译, 所以速度慢不少, 而C语言由于预先编译, 运行起来就特别快)

  2. 源程序(.c)不能直接在计算机上运行, 必须先经过编译和链接

  3. 编译得到的目标文件(.obj)也不能直接运行, 必须经链接生成 .exe 才行

5.3 程序的入口

C 程序是由函数构成的, 一个程序有且仅有一个 main 函数. 程序总是从 main 函数开始执行, 也在 main 函数返回一个状态值后结束

6 其他猎奇题目(持续补充ing, 不分先后)

  • 贝尔实验室的DMR用C语言重写了UNIX系统
  • 冯·诺伊曼的英文名是

下一篇:第一个程序 —— 正式开始写 C