计算的封装

计算的封装

2025 南京大学《操作系统原理》
计算的封装

学习已有 libc 的实现

调试 glibc?

  • 不,你不想
  • glibc 的代码有非常沉重的历史包袱
    • 以及非常多的优化——都是对 “理解原理” 的阻碍
    • 新手阅读体验极差

基本原则:总有办法的

  • 让 AI Copilot 帮你解释代码 (这个可以有)
  • 是否有比 glibc 更适合学习的 libc 实现?
    • (我的知识储备跟不上 AI,更跟不上有 RAG 的 AI)
    • 幸好我还做了正确的选择:musl
2025 南京大学《操作系统原理》
计算的封装

学习已有 libc 的实现 (cont'd)

下载源码不难,难的是怎么 “使用” 下载的 libc

  • 我们知道可以使用 gcc 和 ld
  • 到底应该用什么编译选项?

如何使用我自己的 clang、musl 替代 glibc 编译程序?

  • 当然,我们还是选择自己编译
    • 比较重要的选项
      • -O1: 减少优化级别,便于查看状态
      • -g3: 增加调试信息
    • 使用 musl-gcc 静态编译
  • 试一试:从第一条指令开始调试一个 C 程序
2025 南京大学《操作系统原理》
计算的封装

基础数据的体系结构无关抽象

Freestanding 环境下也可以使用的定义

2025 南京大学《操作系统原理》
计算的封装

字符串和数组操作

string.h: 字符串/数组操作

  • memcpy, memmove, strcpy, ...

stdlib.h: 常用功能

  • rand, abort, atexit, system, atoi, ...
  • 看起来就不像是人用的
// C
void qsort(void*, size_t, size_t, int (*)(const void*, const void*));
// C++
std::ranges::sort(xs, [](const auto& x, const auto& y) { ... });
2025 南京大学《操作系统原理》
计算的封装

更多的例子

在 AI 的指导下阅读手册

  • 更多的 stdlib.h 中的例子
    • atoi, atol, atoll, strtoull, ...
    • rand (注意线程安全), ...
  • math.h
  • setjmp.h
    • 这个好玩!要用状态机去理解
  • 实现库函数 = C 语言课程习题
2025 南京大学《操作系统原理》
计算的封装

关于 AI 擅长做什么、不擅长做什么

“Attention is all you need.”

  • 你需要给他 “关键词” (prompt engineering)
  • 推理模型降低了对 “关键词” 的依赖
    • 但 “神来之笔” 的关键词仍然能起决定性的作用

center

2025 南京大学《操作系统原理》