首页 › 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就藏在哪里。这个土办法的效率,超过绝大多数调试工具。

一图看懂:视频的知识结构

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/>函数成为人机交接单元]

延伸阅读

参考来源

  1. Programming Basics: Statements & Functions — Crash Course Computer Science #12 | CrashCourse — 本文解读的主体视频
  2. Introduction to Programming and Computer Science - Full Course | freeCodeCamp.org — 同主题的长课程对照,可作补充练习材料
  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学通信知识星球海报-扫码加入