跳转到内容

专业阶段 — Unit 3: C Classicals(计算机科学经典问题全景)

"Computer science is no more about computers than astronomy is about telescopes." — Edsger Dijkstra(结构化编程先驱,图灵奖得主)

覆盖计算机科学 17 个子领域的经典问题——从操作系统死锁到量子计算,从密码学到计算机视觉,每道题都是该领域的"第一性原理"经典问题。

课程总览

课号领域题目难度核心知识点
49并发哲学家就餐问题pthread 互斥锁、Coffman 死锁四条件、非对称资源分配、状态机模拟
50网络可靠数据传输 Stop-and-Wait停等协议、FSM 状态机、1-bit 序号空间、ACK/超时重传、不可靠信道模拟
51编译LL(1) 预测分析表FIRST/FOLLOW 集迭代、RHS 编码、表驱动栈式解析、不动点收敛
52数据库B+ 树索引B+ 树结构、分裂规则、叶子链表、范围查询、磁盘 I/O 友好性
53图形学基础光线追踪射线-球求交(判别式法)、Phong 三分量光照、PPM P3 格式、向量运算库
54AIA* 寻路算法f=g+h 启发式、Manhattan 距离可接受性、6×5 网格 10 步追踪、路径回溯
55密码学RSA 公钥加密模幂运算、Miller-Rabin 素性检测、欧拉定理、扩展欧几里得求逆元
56分布式向量时钟 Happens-Before偏序关系、Lamport 局限、Happens-Before 判定、3 节点 6 事件追踪
57体系结构缓存模拟器 LRU2 路组相联、地址分解 (tag/set/offset)、LRU 替换、12 次访问全追踪
58算法Aho-Corasick 多模式匹配Trie 树、失败链接 (failure link)、BFS 逐层构建、O(n) 一次扫描
59自动机NFA→DFA 子集构造ε-闭包不动点迭代、NFA 模拟状态集演算、4 状态 DFA 推导、位掩码编码
60软件工程微型单元测试框架C 预处理器宏 (#/##)、TEST 注册表、ASSERT 四要素、do-while(0) 惯用法
61安全缓冲区溢出分析x86-64 栈帧布局、gets/strcpy 溢出、Stack Canary 金丝雀、纵深防御体系
62机器学习感知机二分类器线性分类器 y=sign(w·x+b)、权重更新规则、AND 训练 4 轮追踪、Novikoff 收敛
63数值计算矩阵 LU 分解求解器A=LU 分解、部分主元 pivoting、前代/回代、浮点误差传播、P 向量隐式表示
64系统编程无锁环形缓冲区C11 _Atomic SPSC、memory_order 分级、伪共享、忙等待 vs CAS、2× vs 1.5× 增长
65运行时标记-清除 GCDFS 标记可达对象、三色标记抽象、线性 sweep 回收、碎片问题与 stop-the-world
66可计算性图灵机 aⁿbⁿ 模拟器七元组定义、δ 转移表、配对消去法、Church-Turing 论题、对角线停机证明
67信号处理快速傅里叶变换 FFTN=8 Cooley-Tukey DIT、蝶形运算、位反转置换、旋转因子 W₈、复乘
68计算机视觉Sobel 边缘检测Gx/Gy 卷积核、梯度幅值 √(Gx²+Gy²)、128 阈值分割值边界处理
69信息检索TF-IDF 文档相似度词频 TF × 逆文档频 IDF、余弦相似度、3 文档向量化、strtok 预处理
70量子计算量子比特与门电路态矢量
71区块链工作量证明 PoWSHA-256 Merkle-Damgård、消息填充、3 区块挖矿、nonce 暴力搜索、链验证三角
72HCIANSI 终端计算器双栈表达式求值、运算符优先级编码、ANSI 转义序列、parse_number 多位数累积

24 道题 × 17 个 CS 子领域,点击课号跳转至详细讲义。每道题采用 make+stdout 评测模式,平均编写约 96 行 C 代码。


一、阶段定位与目标

本阶段是 C 语言训练营的第四站,承接 Unit 2(C Essentials)建立的数据结构与算法基础,正式进入计算机科学经典问题的全景式训练。如果说 Unit 2 是"学会造数据结构",那么 Unit 3 就是"用数据结构解决真实世界的经典问题"——从操作系统死锁到网络可靠传输,从编译器语法分析到数据库索引,从光线追踪到量子计算,每道题都是该领域的"第一性原理"经典问题。

根据训练营总体规划,本阶段旨在解决"学员懂数据结构但缺乏 CS 全局视野"这一核心问题。设计思路为:一题一领域,一领域一经典——24 道题覆盖计算机科学 17 个子领域,每题选取该领域最核心的经典问题,用纯 C 语言从第一性原理实现。

主要目标

  1. 建立 CS 全局视野:覆盖操作系统(哲学家就餐)、网络(停等协议)、编译原理(LL(1) 解析器)、数据库(B+ 树)、图形学(光线追踪)、人工智能(A* 寻路、感知机)、密码学(RSA)、分布式系统(向量时钟)、体系结构(缓存模拟器)、信息安全(缓冲区溢出)、数值计算(LU 分解)、信号处理(FFT)、计算机视觉(Sobel 边缘检测)、信息检索(TF-IDF)、量子计算(量子比特模拟)、区块链(PoW)、人机交互(终端计算器)以及算法(Aho-Corasick、NFA→DFA、图灵机)、软件工程(测试框架)、编程语言理论(标记 - 清除 GC)和嵌入式系统(无锁环形缓冲)。
  2. 深化系统编程能力:从无锁并发的原子操作,到标记 - 清除垃圾回收器的对象图遍历,再到 SHA-256 工作量证明——每道题都是工业级系统软件的微缩模型。
  3. 训练工程化开发习惯:本阶段全部采用 mode = "make+stdout" 评测模式——学员需编写 Makefile 管理编译流程,程序通过标准输出与预期结果逐字符比对。这是从"练习题"到"工程项目"的关键跨越。
  4. 为编译器项目铺路:本阶段的 LL(1) 解析器(Lesson 51)、NFA→DFA(Lesson 59)、标记 - 清除 GC(Lesson 65)、图灵机(Lesson 66)四道题直接对应 Unit 4 编译器项目中的语法分析、正则引擎、运行时内存管理、可计算性理论基础。Aho-Corasick(Lesson 58)则是编译器词法分析的多模式匹配基础。

授课形式

与 Unit 2(C Essentials,四节直播)类似,本阶段采用腾讯会议直播授课,共三节:

节次时间内容
第一节2026 年 07 月 13 日 20:00Lesson 49-56:操作系统与并发、网络协议、编译原理、数据库索引、图形学、AI 寻路、密码学、分布式系统
第二节2026 年 07 月 15 日 20:00Lesson 57-64:体系结构、多模式匹配、自动机理论、测试框架、安全分析、机器学习、数值计算、无锁编程
第三节2026 年 07 月 17 日 20:00Lesson 65-72:垃圾回收、可计算性、信号处理、计算机视觉、信息检索、量子计算、区块链、人机交互

每节直播约 2 小时,包含领域背景讲解、算法推导、代码实战、现场答疑。直播录像会回传至训练营知识库供回看。

学习依托

  • 训练营维护的 clings 练习仓库(24 个 Lesson,共 24 道题)
  • 每个 Lesson 配套的 README 讲义(含领域背景、算法图解、数学推导、课堂讨论与课后练习,单篇最长 775 行)
  • CNB 云原生开发环境(一键开箱)或本地 GCC 环境

二、主要内容与学习路径

本阶段通过 24 道题覆盖计算机科学 17 个子领域,按主题模块组织如下:

模块一:操作系统与并发

Lesson 49 — 哲学家就餐问题(1 道题)

  • 经典死锁问题:5 个哲学家共享 5 把叉子,用状态机模拟(免 pthread 依赖)。
  • 非对称资源分配策略打破循环等待:奇数号先取左、偶数号先取右。
  • 理解死锁四条件(互斥、占有等待、不剥夺、循环等待)与预防方法。

Lesson 56 — 向量时钟(1 道题)

  • 分布式系统的因果序追踪:3 节点 6 事件,构建向量时钟并判定 happens-before 关系。
  • 理解 Lamport 标量时钟与向量时钟的区别,并发事件的判定规则。

Lesson 64 — 无锁环形缓冲区(1 道题)

  • SPSC(单生产者单消费者)无锁队列:用原子操作 + 内存屏障实现。
  • 理解 CAS(Compare-And-Swap)原理、__atomic_load / __atomic_store 的使用。
  • 这是 Linux 内核、DPDK 等高性能系统的基础组件。

模块二:网络与可计算性

Lesson 50 — 可靠数据传输 Stop-and-Wait(1 道题)

  • 停等协议:序号 0/1 交替 + 超时重传 + ACK 确认。
  • 不可靠信道模拟:丢包 25% + 损坏 10% + ACK 丢失 10%(srand(42) 固定随机种子)。
  • 理解可靠传输三要素(序号、ACK、重传)与滑动窗口的简化版。

Lesson 66 — 图灵机模拟器(1 道题)

  • 通用图灵机模拟:状态转移表 + 读写头 + 无限纸带。
  • 理解可计算性理论:图灵机是"可计算"的数学定义,丘奇 - 图灵论题。
  • 这是计算机科学的 theoretical foundation——所有编程语言的计算能力上限。

模块三:编译与语言理论

Lesson 51 — 表驱动 LL(1) 解析器(1 道题)

  • 预测分析表驱动的 LL(1) 语法分析:文法 (E \to TE'),FIRST/FOLLOW 集预计算。
  • 栈式解析:RHS 编码(终结符 0-5,非终结符 id+100 区分),18 步推导输出。
  • 这是编译器前端的核心技术——Unit 4 编译器项目的直接预热。

Lesson 59 — NFA 模拟与子集构造(1 道题)

  • NFA 模拟 + 子集构造法转 DFA:语言 (a^b | ab^),ε-闭包计算。
  • 理解正则表达式的底层引擎:正则 → NFA → DFA 的完整转换链路。
  • 这是 grep、sed、lex 等工具的核心算法。

Lesson 65 — 标记 - 清除垃圾回收(1 道题)

  • 在固定对象图上实现 mark-sweep GC:DFS 标记可达对象 + 清扫回收不可达对象。
  • 理解 GC 的两大流派(tracing vs reference counting)及 mark-sweep 的优缺点。
  • 这是 Java/Go/Python 等托管语言运行时的核心机制。

模块四:数据结构与索引

Lesson 52 — B+ 树索引(1 道题)

  • 数据库索引核心结构:B+ 树的插入、分裂、范围查询。
  • 所有数据存叶节点,叶节点用链表连接——支持高效范围扫描。
  • 理解为什么 MySQL/PostgreSQL 都选择 B+ 树而非 B 树作为索引结构。

Lesson 58 — Aho-Corasick 多模式匹配(1 道题)

  • AC 自动机:模式集 {"he","she","his","hers"} 匹配文本 "ushers"
  • Trie 树 + 失败函数(failure link)+ 状态转移——一次扫描匹配所有模式。
  • 这是入侵检测、敏感词过滤、grep -F 的核心算法。

模块五:人工智能

Lesson 54 — A* 寻路算法(1 道题)

  • 启发式搜索:(f(n) = g(n) + h(n)),Manhattan 距离作为启发函数。
  • Open 表选 f 最小节点 + Closed 表去重 + 路径重建(从目标回溯到起点)。
  • 理解 A* 与 Dijkstra 的关系((h=0) 时 A* 退化为 Dijkstra)。

Lesson 62 — 感知机二分类器(1 道题)

  • 机器学习的起点:线性分类器 (y = \text{sign}(\mathbf{w} \cdot \mathbf{x} + b))。
  • 权重更新规则:误分类时 (\mathbf{w} \leftarrow \mathbf{w} + \eta y_i \mathbf{x}_i)。
  • 理解感知机收敛定理与线性可分的几何意义——这是神经网络的基础。

模块六:数值计算与信号处理

Lesson 63 — 矩阵 LU 分解求解器(1 道题)

  • (A = LU) 分解 + 前代/回代求解线性方程组 (A\mathbf{x} = \mathbf{b})。
  • 部分主元(partial pivoting)避免数值不稳定。
  • 理解为什么科学计算库(LAPACK)的基础是 LU 分解。

Lesson 67 — 快速傅里叶变换 FFT(1 道题)

  • Cooley-Tukey 蝶形算法:(N=8) 点 FFT,3 级蝶形运算。
  • 时域抽取(DIT):偶数序列与奇数序列递归 + 蝶形组合。
  • 理解 (O(N \log N)) vs 直接 DFT 的 (O(N^2))——这是信号处理最重要的算法。

模块七:图形与视觉

Lesson 53 — 基础光线追踪(1 道题)

  • 从相机发射光线,与球体求交,计算法线与简单着色。
  • 向量运算:点积、叉积、归一化、射线 - 球求交方程。
  • 理解渲染方程的简化版——这是 Pixar 等电影工业的基础技术。

Lesson 68 — Sobel 边缘检测(1 道题)

  • 图像卷积:(G_x) 和 (G_y) 两个 3×3 Sobel 算子,梯度幅值 (\sqrt{G_x^2 + G_y^2})。
  • 阈值化输出二值边缘图(8×8 灰度图)。
  • 理解卷积神经网络(CNN)的第一层本质上就是边缘检测。

模块八:体系结构与安全

Lesson 57 — 缓存模拟器 LRU(1 道题)

  • 2 路组相联、4 组缓存:12 次访问,LRU 替换策略。
  • 地址分解:tag + set index + block offset,命中/缺失判定。
  • 理解为什么缓存命中率决定程序性能——这是性能优化的理论基础。

Lesson 55 — RSA 公钥加密(1 道题)

  • 玩具版 RSA:(p=61, q=53),uint64_t 模幂运算,Miller-Rabin 素性检测。
  • 密钥生成、加密、解密三步流程,理解公钥/私钥的数学关系。
  • 理解为什么大数分解是 RSA 安全性的基础——这是 HTTPS/TLS 的核心。

Lesson 61 — 缓冲区溢出分析(1 道题)

  • 栈帧布局分析:局部变量、保存的帧指针、返回地址的内存排列。
  • 安全分析而非攻击实验:理解溢出原理与防护手段(栈保护、ASLR、NX)。
  • 理解为什么 C 语言程序的安全审计如此重要——这是 Morris 蠕虫、Heartbleed 的根源。

Lesson 71 — 简化工作量证明 PoW(1 道题)

  • 区块链共识基础:3 个区块的挖矿,纯 C 实现 SHA-256(64 轮 + IV + K 表)。
  • 工作量证明:寻找 nonce 使 SHA256(prev || data || nonce) 前 N 位为 0。
  • 理解比特币/以太坊的共识机制本质——这是区块链安全性的基石。

模块九:软件工程与前沿

Lesson 60 — 微型单元测试框架(1 道题)

  • 用宏实现 TEST / ASSERT_EQ / ASSERT_STREQ / RUN_TESTS,自测 3 个用例。
  • 理解 Google Test、Check、Unity 等测试框架的底层原理。
  • 这是软件工程 SDF(Software Development Fundamentals)的核心实践。

Lesson 69 — TF-IDF 文档相似度(1 道题)

  • 3 篇文档的 TF-IDF 向量化 + 余弦相似度计算。
  • TF(词频)× IDF(逆文档频率),衡量词对文档的区分度。
  • 理解搜索引擎的文档相关性排序基础——这是 Elasticsearch、Lucene 的核心。

Lesson 70 — 量子比特与门电路(1 道题)

  • 量子比特状态演化:(H \to X \to Z \to H) 门电路序列 + 测量。
  • 态矢量表示、矩阵乘法模拟量子门、概率坍缩。
  • 理解量子计算与经典计算的本质区别——叠加态与测量坍缩。

Lesson 72 — ANSI 终端计算器(1 道题)

  • 双栈表达式求值(Dijkstra Shunting-yard 算法)+ ANSI 转义序列彩色输出。
  • 运算符栈与操作数栈的配合,优先级处理与括号匹配。
  • 理解人机交互(HCI)中的终端 UI 编程——这是 bcpython -i 的基础。

练习工具 — clings

  • 使用训练营基于 CNB 云原生开发环境的 clings 练习仓库进行交互式练习。
  • 本阶段全部采用 mode = "make+stdout":学员编写 Makefile 管理编译,程序通过标准输出与预期逐字符比对。
  • 测试用例打包在 clings 包内(site-packages),学员无法修改,确保评测公正。
  • 通过 clings tests <题目名> 查看公开测试用例,采用 TDD 开发模式。
  • 训练营会自动统计您的完成情况并记入阶段成绩。

三、推荐学习资料

以下资料可作为本阶段的主要参考:

核心教材

  • 《计算机程序的构造和解释》(SICP, Abelson & Sussman):MIT 经典教材,从第一性原理理解计算的本质。第 3 章的并发与第 5 章的寄存器机器与本阶段多题相关。
  • 《编译原理》(龙书,Aho & Lam & Sethi & Ullman):第 4 章 LL(1) 解析、第 3 章正则与 NFA/DFA——Lesson 51、58、59 的权威参考。
  • 《算法导论》(CLRS):第 23 章 A* 与图算法、第 34 章 NP 完全性、第 28 章 LU 分解——多道题的理论基础。

在线教程

参考资料(进阶)

开发环境搭建

  • 推荐使用 CNB 云原生开发环境(Fork 仓库后一键启动,无需本地配置)。
  • 本地开发推荐 Linux 环境(WSL2 + Ubuntu 或虚拟机),安装 GCC 14+ 和 Python 3.11+。
  • 安装 clings 练习工具:推荐使用 uvx clings@latest 命令(无需全局安装,隔离运行)。

四、学习方式与建议

  1. 先读讲义,再做练习:每个 Lesson 目录下的 README.md 包含领域背景、数学推导、算法图解和课堂讨论题(单篇最长 775 行)。建议先通读讲义,理解领域背景和算法原理后再动手修改 .c 文件。本阶段题目概念密度高,跳过讲义直接编码容易卡壳。

  2. 善用 clings 工具:进入 clings 的 watch 模式后,每次保存文件会自动编译和验证。遇到卡壳时按 h 查看提示,按 l 浏览题目列表,按 t 查看测试用例(TDD 开发)。本阶段采用 make+stdout 模式,Makefile 也是练习的一部分——学会编写规范的 Makefile 是系统编程的基本功。

  3. 理解领域背景,而非死记算法:本阶段每道题都来自一个真实 CS 子领域。学哲学家就餐时理解死锁四条件,学 RSA 时理解大数分解难题,学 FFT 时理解时频域转换——理解"为什么这个算法存在"比"怎么写这个算法"更重要。这正是 Dijkstra 所说"计算机科学不全是关于计算机的"。

  4. 重视数学推导:本阶段多道题涉及数学——RSA 的模算术、LU 分解的线性代数、FFT 的复数蝶形、感知机的几何意义、量子比特的态矢量。建议准备纸笔,跟着 README 里的推导一步步演算。不理解数学,代码就是无意义的符号堆砌。

  5. 建立跨领域连接:LL(1) 解析器(Lesson 51)与 NFA→DFA(Lesson 59)共享自动机理论;A* 寻路(Lesson 54)与向量时钟(Lesson 56)共享图论;标记 - 清除 GC(Lesson 65)与图灵机(Lesson 66)共享可达性分析。学会发现跨领域的共同抽象,是成长为系统架构师的关键。

  6. 按时参加直播:本阶段有三节腾讯会议直播课(07/13、07/15、07/17),建议按时参加以获得最佳学习效果。直播中会讲解每个 CS 子领域的背景脉络、经典论文脉络和工业应用场景,并现场推导算法和编写代码。如无法参加,请务必在课后观看回放。

五、关于晋级与要求

晋级方式

  1. Fork 训练营的 Unit-3-C-Classicals 仓库,在云原生开发环境或本地环境中完成 24 道练习题。
  2. 提交代码到 main 分支并创建合并请求(PR),CI 系统会自动评分。
  3. 可多次提交,以最高分为准。通过后即可在 OpenCamp 晋级榜单上查看成绩。

评分标准

  • 共 24 个 Lesson、24 道题,每题通过 clings 自动评测。
  • 评测模式统一为 make+stdout:学员编写 Makefile 编译程序,程序运行后标准输出与预期逐字符比对。

重要提示

本阶段是 C 语言训练营的专业关,题目覆盖计算机科学 17 个子领域的经典问题,每题平均编写约 96 行 C 代码(含 Makefile),概念密度为全训练营最高。24 道题看似量大,但每题都是独立的 CS 经典——从操作系统死锁到量子计算,从密码学到计算机视觉,每完成一道题就点亮一块 CS 版图。认真完成本阶段后,您将具备广阔的计算机科学视野和扎实的系统编程能力,为 Unit 4(从零实现 C 编译器)和 Unit 5(从零实现操作系统内核)两大项目阶段打下坚实的理论与实践基础。

六、训练营完整学习路线

本 C 语言训练营采用 "四阶段 + 双项目" 的成长路径,从零基础入门到亲手实现编译器与操作系统内核,共 6 个 Unit,共计 120 课。最终目标:学员同时具备用 C 语言实现编译器和从裸机搭建操作系统内核的系统级编程能力,形成"语言 → 算法 → 系统 → 编译器 → 内核"的完整知识闭环。

导学阶段

Unit名称课程数核心内容
Unit 0C Primer5 课 / 9 题最简程序、printf、循环、条件分支、累加求和

从"编辑 — 编译 — 运行"的全流程入手,通过 5 个最小可运行程序建立 C 语言的基本心智模型。使用 clings 工具交互式练习。

基础阶段

Unit名称课程数核心内容
Unit 1C Fundamentals19 课 / 40 题嵌套循环、函数、数组、指针、结构体、联合体、位运算、可变参数、预处理器、状态机

从九九乘法表到词法分析器,涵盖 C 语言核心语法特性。通过实现 printf、命令解释器、预处理器、词法分析器等项目,将语法知识转化为工程能力。两节腾讯会议直播授课(2026/06/29 和 2026/07/01)。

进阶阶段

Unit名称课程数核心内容
Unit 2C Essentials24 课 / 24 题链表、栈、队列、树、堆、排序、查找、回溯、C 标准库深入实现

系统学习经典数据结构与算法,从字符串内存操作(strstr/memcpy/memmove)到链表/栈/队列/树/堆的从零实现,再到快速排序、二分查找、Top-K 堆筛选,最终深入 snprintf/strtok_r/qsort/realloc/sscanf/setjmp/I/O 缓冲七个标准库函数的底层机制。四节腾讯会议直播授课(2026/07/03、07/06、07/08、07/10)。

专业阶段

Unit名称课程数核心内容
Unit 3C Classicals24 课 / 24 题17 个 CS 子领域经典问题:操作系统、网络、编译、数据库、图形学、AI、密码学、分布式、体系结构、安全、数值计算、信号处理、计算机视觉、信息检索、量子计算、区块链、人机交互

覆盖计算机科学 17 个子领域的经典问题,每题平均编写约 96 行 C 代码,从第一性原理实现哲学家就餐、停等协议、LL(1) 解析器、B+ 树、光线追踪、A* 寻路、RSA、向量时钟、缓存模拟、FFT、Sobel 边缘检测、TF-IDF、量子比特、PoW 区块链等 24 道经典题,为编译器项目建立广阔的 CS 视野。三节腾讯会议直播授课(2026/07/13、07/15、07/17)。

项目阶段

完成前三个阶段后,进入双线并行的项目实践:

Unit名称课程数核心内容
Unit 4C Compiler24 课从零实现 C 编译器 nccl-cc:一棵 AST,四个后端,五个运行环境
Unit 5C Kernel24 课从零实现操作系统内核 Avatar OS:裸机引导到多核调度

Unit 4 — C Compiler 用约 4000 行 C 代码完整走通"预处理 → 词法 → 语法 → 类型标注 → 代码生成"全流程,支持 RISC-V / ARM / AArch64 / x86-64 四个后端和 Linux 用户态 + 裸机共五种运行环境。最终验证:用自己写的编译器编译约瑟夫环程序,在四个架构上得到相同结果。

Unit 5 — C Kernel 基于 Avatar OS 真实内核代码,分五个子阶段递进:裸机基础 → 内存与同步 → 中断与定时器 → 多任务 → 用户态与多核。代码取自 Avatar OS 仓库,支持 AArch64 / RISC-V 64 / x86_64 三架构在 QEMU 上验证。最终目标:一个能运行 busybox shell、在多核处理器上并行调度的完整操作系统。

Released under the MIT License.