为什么我用原始 C++ 从头构建数据库(以及我为何禁用 STL)
发布: (2026年5月3日 GMT+8 05:02)
3 分钟阅读
原文: Dev.to
Source: Dev.to
我学习方式的问题
很长一段时间,我写的代码能够运行,但我根本不知道它为什么能运行。我使用了抽象、API 和库,这些东西把所有有趣的细节都隐藏了起来。我可以构建功能,但无法解释内存、磁盘或硬件层面到底发生了什么。这让我感到不安。
NanoDB 实际是什么
NanoDB 是我为了解决上述问题而做的尝试。它是一个分阶段构建的自定义存储引擎:
- Phase 0 — 原始 C++ 基础,没有安全网
- Phase 1 — 页面管理器,原始磁盘 I/O
- Phase 2 — 带 LRU 驱逐的缓冲池
- Phase 3 — 堆文件和元组布局
- Phase 4 — B+ 树索引
- Phase 5 — 查询层
- Phase 6 — 预写日志(WAL)
- Phase 7 — 使用 2PL 的并发控制
- Phase 8 — 基准测试与研究文档
我目前正处于 Phase 0。不会假装自己已经走得更远。
为什么要禁用 STL?
因为 STL 解决了我尚未亲身经历的问题。如果在我还不了解动态内存分配之前就使用 std::vector,我就学不到 std::vector 实际上是如何工作的。这个限制迫使我感受到抽象层隐藏的痛苦,而这种痛苦正是学习的过程。
为什么现在写这篇文章,而不是先写代码?
为了自我约束。并且“为什么”与“做什么”同样重要。我会在这里记录每个阶段——我构建了什么,哪里出错了,我学到了什么,以及哪些地方让我困惑。没有光鲜的成功案例,只有真实的艰难过程。
如果你也在探索系统编程或底层 C++,欢迎一起跟进。我们可以一起摸索。
Phase 0 现在开始。 ⚔️