<!-- title: 语句与函数：代码世界的两条腿 -->
<!-- domain: programming -->

# 语句与函数：代码世界的两条腿

## 概述：为什么值得重看这堂十分钟的课

在YouTube教育区，CrashCourse是一个现象级频道：制作精良、节奏极快，用动画把一个学科“压”进几十个十分钟。它的《计算机科学》系列（Crash Course Computer Science，2017年播出，共40集，主持人Carrie Anne Philbin）从算盘一路讲到人工智能，被全球无数课堂当作开胃课。这个系列的第12集《编程基础：语句与函数》（Programming Basics: Statements & Functions）播放量已超过104万（截至2026年9月），是系列里被反复引用的基础集之一。

它讲的两个词——语句、函数——是每个写代码的人每天重复几百次的东西，正因为太熟，几乎没人停下来问一句：**代码为什么偏偏长成这个样子？** 这集视频的真正价值，是把这个“天经地义”拆开给你看：语句和函数不是自然规律，而是七十年工程史一步步打磨出来的发明。看懂这层，你写下的每一行代码都会多一个维度。本文按视频的叙事脉络逐层拆解，补上它没讲透的历史与理论，也指出它为了十分钟时长不得不做的简化。

## 视频基本信息

| 项目 | 内容 |
|---|---|
| 视频标题 | Programming Basics: Statements & Functions（《编程基础：语句与函数》） |
| 所属系列 | Crash Course Computer Science 第12集 |
| 频道 | CrashCourse |
| 主持人 | Carrie Anne Philbin |
| 发布时间 | 2017年（该系列于2017年连播完成） |
| 热度数据 | 播放量104万+（截至2026年9月） |
| 链接 | https://www.youtube.com/watch?v=l26oaHV7D40 |

## 核心主张拆解：视频的四步叙事

### 第一步：先交代前提——人为什么要高级语言

视频接在系列第11集的尾巴上：那一集讲了最早的编程语言和编译器，主角是Grace Hopper——她在1952年做出A-0编译器，让机器“自己翻译”程序，而不是让人手写机器码。第12集开篇把这笔遗产接过来：有了编译器，程序员终于可以写“给人看”的代码，而不是整天和寄存器地址、跳转编号缠斗。这个前提很重要，因为**语句和函数，都是“给人看”这个目标催生的产物**。机器不需要名字，不需要缩进，甚至不需要分块——人才需要。

### 第二步：语句——把想法切成一步一步的动作

视频用最朴素的方式定义了语句（statement）：一句“让机器做一个动作”的指令，比如给变量赋一个值。单看每一句都 trivial，真正的骨架在于**控制流**——这些动作按什么规则被执行。视频把控制流归纳成三种：

1. **顺序**：从上往下，一句接一句；
2. **条件**：if/else，根据情况二选一（或多选一）；
3. **循环**：while/for，重复执行直到某个条件被打破。

视频在这里传达了一个极重要但容易滑过去的观点：不管你的程序多复杂——一个游戏、一个浏览器、一个操作系统——拆到最后，它的“行走方式”就是这三种。没有第四种基本走法。这个论断有扎实的理论靠山，后文第二节详述。

### 第三步：函数——给一段逻辑起一个名字

讲完语句，视频处理第二个关键词：函数（function）。思路同样是朴素的：同一段逻辑经常要在不同地方反复使用，复制粘贴三遍是灾难——改一处忘两处。于是把这段逻辑打包起来，起个名字，需要时“喊”它一声：参数传进去，结果传出来。这就是函数定义与函数调用。

视频强调了两个容易忽略的点：其一，函数不只是复用手段，更是**认知压缩**——名字把一段实现细节整个封起来，调用者从此只需要知道“它做什么”，不需要知道“它怎么做”；其二，主流语言里这个概念有一堆同义词——过程（procedure）、子程序（subroutine）、方法（method）——内核都是同一件事：**一段有名字、有边界、有输入输出的逻辑**。

### 第四步：收束到“抽象”——现代软件是层次的堆叠

视频最后把两个概念拧成一股：语句负责把动作表达出来，函数负责把动作组织起来，而组织到足够规模，就出现了层次——底层的函数被更高层的函数调用，更高层的又被再高层的调用。浏览器、操作系统、游戏引擎，都是这样一层摞一层摞出来的。每一层只需要懂相邻层，不需要懂全部。**抽象不是装饰，是软件能够长大到今天的唯一原因。**

## 知识与理论溯源：这些概念各自是谁发明的

视频受时长所限，把很多关键历史一笔带过。下面把这些概念的真实出处补齐——这一节是“看过视频之后多懂的那一层”。

### 三种控制流足够了：1966年的定理

“顺序、条件、循环三件套能表达一切逻辑”不是经验总结，而是被证明过的。1966年，Corrado Böhm（他本人是1974年届的图灵奖得主之一， 也是最早用自举方式写出编译器的人之一）和Giuseppe Jacopini在《Communications of the ACM》上发表论文《Flow diagrams, Turing machines and languages with only two formation rules》，证明了：任何流程图描述的计算，都可以只用顺序、选择、迭代三种结构改写，而不损失表达能力。这就是著名的**Böhm–Jacopini定理**，它后来成了“结构化编程”运动的理论地基——你今天写不出“第四种基本控制流”，不是想象力不够，是数学不允许（至少在可读性收益为正的前提下不允许）。

### 一封改变行业的读者来信：1968年

有了定理，还得有人把它变成行业共识。1968年3月，荷兰计算机科学家Edsger W. Dijkstra在《Communications of the ACM》发表了一页半的短信，标题《Go To Statement Considered Harmful》（“goto语句有害论”——这个著名的标题是时任编辑Niklaus Wirth起的，Dijkstra本人觉得措辞太温和）。信的核心论点极其漂亮：**程序有两次生命，一次是写在纸上的静态文本，一次是机器执行的动态过程；goto的问题在于，它让这两种描述彻底脱节**——你盯着代码根本猜不出程序是怎么跳的。而顺序、条件、循环的美德恰恰是：文本结构与执行轨迹高度对应，读代码就是在“预演”程序。

这封信引发的争论持续了十几年。连Donald Knuth都在1974年的《Structured Programming with go to Statements》（发表于ACM Computing Surveys）里出面调停：问题不在goto本身，而在“无纪律的跳转”；在状态机和错误清理这类场景里，受限的goto反而最清晰。直到今天，Linux内核的C代码里清理资源的收尾路径依然大量使用goto——**理论给了方向，工程留了活口**，这场拉锯本身就是理解“语句”概念深度的最好教材。

### 函数的前身：1949年，让人“跳过去再回来”

函数的发明比“语句”更早，也更机械。世界上第一台全电子存储程序计算机之一EDSAC（剑桥大学，1949年 开始跑程序）上，博士生David Wheeler面对一个现实问题：机器只有1024个字的存储，每个字的都很贵，同一段代码写两遍都嫌奢侈。他的解法是把一段代码放在固定位置，用一条跳转指令跳过去，执行完再带着计算结果跳回来——这就是著名的**Wheeler jump**，人类历史上第一个子程序。1951年，Maurice Wilkes、David Wheeler和Stanley Gill合著出版《The Preparation of Programs for an Electronic Digital Computer》——公认的第一本编程教材——书里随书附赠的，就是一整套**子程序库**：排序、开方、三角函数，拿过来就能用。

今天你 `import` 一个库、调用一个API，血脉可以直接接到1949年剑桥那台机器上。函数不是语言学家的美学发明，是**存储贵得离谱的年代逼出来的经济学发明**——先有复用的刚需，后有名实相符的优雅。

### 编译器：让代码先像人话

两条腿能不能站起来，还差一个前提：人写的代码机器得看得懂。1952年Grace Hopper为UNIVAC写出A-0编译器，第一次让“机器翻译程序”成为现实；她的FLOW-MATIC语言直接孕育了1959年定稿的COBOL。1957年，IBM的John Backus团队交付Fortran编译器，用近乎偏执的优化证明了“高级语言写科学计算，效率不输手写汇编”，高级语言自此站稳。**先有编译器把“人话”翻成机器码，语句和函数这些为人设计的结构才有落脚点。**

### 运行时的那一半：调用栈

视频没时间讲的另一半故事在机器内部：函数调用在运行时靠**栈**实现——每调用一次，就在栈顶压入一帧（局部变量、参数、返回地址），返回时弹出。1960年的ALGOL 60报告把块结构（block structure）和递归写进了语言规范，递归要求“同一段函数可以同时存在多个未返回的实例”，这正是栈式调用成为一切主流语言默认运行时的历史节点。你写的每一次函数调用，背后都是这套1960年定型的机制。

## 批判性审查：这堂课简化了什么

作为十分钟的教学视频，它的简化大多合理，但有四处值得较真。

**第一，“三件套足够”是教学口径，不是工程结论。** Böhm–Jacopini定理保证的是“可表达”，不承诺“可读”。从1968到1980年代，结构化编程的推广伴随着大量反复（Knuth 1974的调停文章就是明证）；实践中，异常处理、事件回调、协程这些“第四种走法”层出不穷——它们最终都能还原回三件套，但直接表达它们的结构，往往才是可读性更好的选择。视频把它们略去，是为了主线干净；读者应知道地基之上还有楼层。

**第二，函数边界是给人的，不是给机器的。** 视频强调函数让代码清晰，这没错；但它没说函数在机器眼里几乎是“不存在”的——现代编译器的内联（inlining）优化会把小函数的代码直接展开到调用处，调用开销归零。反方向的坑也存在：失控的递归会把调用栈压穿，程序当场崩溃。函数是**认知边界**，不是性能边界——混淆这两者，是初学者最常见的技术性错觉之一。

**第三，函数不是唯一的组织单位。** 面向对象把数据和函数打包成类，函数式编程把函数本身当成可以传递的值——这些范式扩展了“组织代码”的方式，但都建立在“语句+函数”这层地基之上，谁也没有推翻它。把第12集理解为“地基课”而不是“全景课”，定位就准了。

**第四，视频成书于2017年，没有AI语境。** 而这恰恰是今天重看它最扎心的收获：当大模型可以成段生成代码时，人审查代码的**最小可信单元**正在从“每一行语句”变成“一个个函数”——你看它的输入输出契约是否成立，而不是逐行追踪控制流。语句与函数这对七十年前的发明，正在被AI时代重新定价：语句越来越便宜，函数（接口）越来越贵。

## 认知提升与实用启示

**1. 把任何新语言当“方言”学。** 学一门新语言时，第一个小时别背语法，先找三样东西：赋值怎么写、条件怎么写、循环怎么写；再找一样：函数怎么定义、怎么传参。骨架永远是三件套加函数，语言差异只是口音。这门“映射式学法”能把你上手新框架的时间从几天压到一个下午。

**2. 函数名是写给未来自己的目录。** Wheeler发明子程序是为了省存储，今天的你复用函数是为了省认知。实操标准只有两条：一个函数只做一件事；名字说出来就是它在做的事（`sendRetryableRequest` 比 `process` 好一个数量级）。写不出的名字，通常说明这个函数还没想清楚。

**3. 卡住时，手画控制流。** 读不懂一段逻辑时，别盯着屏幕磨，拿纸把每个分支和循环画成一张走向图——用Dijkstra的标准说，就是在重建“文本结构与执行轨迹的对应”。哪个框画不出来，哪个条件说不清，bug就藏在哪里。这个土办法的效率，超过绝大多数调试工具。

## 一图看懂：视频的知识结构

```mermaid
flowchart TD
    A[机器码时代<br/>人迁就机器] --> B[编译器出现<br/>代码开始像人话]
    B --> C[语句<br/>一个动作一句话]
    C --> D[控制流三件套]
    D --> D1[顺序执行]
    D --> D2[条件分支]
    D --> D3[循环]
    B --> E[子程序<br/>1949 剑桥EDSAC]
    E --> F[函数<br/>参数进 结果出]
    F --> G[抽象<br/>名字封住细节]
    D --> G
    G --> H[层层堆叠<br/>现代软件的层次]
    G --> I[AI时代<br/>函数成为人机交接单元]
```

## 延伸阅读

- **Crash Course Computer Science 第13集《Intro to Algorithms》**：第12集铺完“语句与函数”的地基，第13集紧接着讲算法——同一套叙事风格的下一站。
- **Charles Petzold《Code: The Hidden Language of Computer Hardware and Software》**（2000年初版，2022年第二版）：从电报继电器讲到条件逻辑，是本视频“从软件往下看”视角的最佳互补——“从硬件往上看”。

## 参考来源

1. [Programming Basics: Statements & Functions — Crash Course Computer Science #12 | CrashCourse](https://www.youtube.com/watch?v=l26oaHV7D40) — 本文解读的主体视频
2. [Introduction to Programming and Computer Science - Full Course | freeCodeCamp.org](https://www.youtube.com/watch?v=zOjov-2OZ0E) — 同主题的长课程对照，可作补充练习材料
3. E. W. Dijkstra, "Go To Statement Considered Harmful", *Communications of the ACM*, Vol.11, No.3, 1968 — 控制流革命的原点文献
4. C. Böhm, G. Jacopini, "Flow diagrams, Turing machines and languages with only two formation rules", *Communications of the ACM*, Vol.9, No.5, 1966 — “三件套足够”的数学证明
5. M. V. Wilkes, D. J. Wheeler, S. Gill, *The Preparation of Programs for an Electronic Digital Computer*, Addison-Wesley, 1951 — 第一本编程教材，子程序与子程序库概念的出处

---
> 本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵**爱卫生**（微信ID: gprshome201101）维护，聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。
> 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
