重写 Bun 在 MC++:7 天内 20+ 万行代码 C++26 模块化, 重现 Bun 行为艺术

发布于

## 背景

之前 Anthropic 团队用 Agent 开发 C 编译器,以及早期 [Rewrite Bun in Rust](https://github.com/oven-sh/bun/pull/30412)。最初我也就看个热闹,但没想到 Bun 作者真的把这个 100W+ 行的 PR 合入了。我相信这不仅是对我而言,更是对整个开发者群体来说,相当震惊。

一个 *~100k+ star、真实应用于生产环境的顶级开源项目*,不到 2 周时间 AI 就编写了 100 万+ 行代码,单个 PR 直接合入主分支!这里最核心的是,这不是一个玩具项目。因此,这个事件引发了我的一些思考:

- 对于百万行级的大型项目,Agent 大幅度参与的可行性,会不会遇到什么问题?
- 开源项目、开发者、Agent 若要管理和维护,应该怎么做?
- Agent 承担了执行者的角色,而人更多的是做架构设计、决策、规则制定、品位、审美相关的工作?
- 不是人来执行后,编程语言选择、是否手写、某个语言的开发者群体等,可能更偏向文化类感性的考量?(类似小众文化/二次元)

带着这些思考,加上我本人是 C++ 最新语言特性以及模块化工程(`import std;`)的极度爱好者和实践者,因此我决定使用 C++26 + 模块化重新编写 Bun,以具体体验这个过程,同时验证 C++26 和模块化在百万级工程项目上的可用性和最佳实践,结果就有了这个 -> [Rewrite Bun in MC++](https://github.com/Sunrisepeak/mbun/pull/1)

## 进展和规划

[mbun](https://github.com/Sunrisepeak/mbun) 已经有 24 万+ 行 **C++模块化(.cppm)** 代码,并能够构建为 **单可执行文件**。
目前已经可以初步“验证使用”并真实运行生态顶级开源项目:
- Bun 生态的开源 Web 框架项目 [elysia](https://github.com/elysiajs/elysia)
- 以及 Node 生态的开源 Web 框架项目 [express](https://github.com/expressjs/express)

不过对于 Bun 和 Node 原生的 6000+ 测试集覆盖率,目前还处于 ~40%的进度。

**当前规划是 先 100% 通过 Node 和 Bun 原生的所有测试集,然后再分模块进行性能优化。**在这个从“零”搭建基础项目结构,使用多 Agent 并行开发 20+ 万行 C++ 代码的过程中,我遇到了一些问题,并对上述问题有了一些思考。我打算等 100% 覆盖所有测试集后,再编写相关具体的文章来详细分析一下过程和相关的思考。

目前我已经把所有代码放到了 GitHub 的 [mbun 仓库](https://github.com/Sunrisepeak/mbun),欢迎感兴趣的朋友 Star 项目或一起参与开发/构建(一起玩 / Just for Fun)。

- [https://github.com/Sunrisepeak/mbun](https://github.com/Sunrisepeak/mbun)

## mbun - main.cpp

```cpp
// mbun executable entrypoint and command dispatch.

import std;

import mbun.app;
import mbun.exe_platform;
import mbun.cli;
import mbun.cli.run_command;
import mbun.install.command;
import mbun.install.dependency;
import mbun.install.npm.json;
import mbun.install.package_json_editor;
import mbun.jsc.module_loader;
import mbun.jsc.runtime;
import mbun.jsc.test_runner;
import mbun.js_parser;
import mbun.toml;
import mbun.bunfig.types;
import mbun.bunfig.parser;
import mbun.http;
import mbun.bundler;
import mbun.resolver;

using namespace mbun::app;

int main(int argc, char* argv[]) {
//....

auto parsed = mbun::cli::parse(args);

using mbun::cli::Action;
switch (parsed.action) {
case Action::Version:
// Three lines: mbun's real version, then the bun / node compatibility
// claims (the corpus-pinned versions). Line 2 keeps `--version` output
// containing Bun.version (regression/issue/10170 asserts toContain).
std::println("mbun {}", mbun::cli::MBUN_VERSION);
std::println("bun {} (compatible)", mbun::cli::VERSION);
std::println("node v{} (compatible)", mbun::cli::NODE_COMPAT_VERSION);
return 0;
case Action::Help:
std::print("{}", USAGE);
return 0;
case Action::Test:
return run_test(std::span{args}.subspan(1));
case Action::Install:
return run_install(std::span{args}.subspan(1));
case Action::Add:
return run_add(std::span{args}.subspan(1));
case Action::Build:
return run_build(std::span{args}.subspan(1));
case Action::Exec:
return run_exec(parsed.argument);
case Action::NotImplemented:
std::println("mbun: '{}' is planned but not implemented yet", parsed.argument);
return 1;
case Action::Unknown:
// Tag::AutoCommand — an unrecognized first positional is not an error in
// bun: it is a run target. `bun dev` runs the "dev" script, `bun eslint`
// runs node_modules/.bin/eslint, and only when nothing matches does it
// report `Script not found` + exit 1 (cli/mod.rs:1469-1481 → exec_with_cfg,
// run_command.rs:2726-2790). --if-present makes the miss silent/0.
return exec_run_target(args[0], std::span{args}.subspan(1), globalFlags,
/*allowFastRunForExtensions=*/true, /*binDirsOnly=*/true);
}
return 0;
}
```

---

- 开源仓库: [https://github.com/Sunrisepeak/mbun](https://github.com/Sunrisepeak/mbun)
- [Rewrite Bun in MC++](https://github.com/Sunrisepeak/mbun/pull/1)
- [Rewrite Bun in Rust](https://github.com/oven-sh/bun/pull/30412)

---

原文链接:[点击查看](https://www.v2ex.com/t/1228291)

评论(7)

其实拿现成项目做 AI 翻译难度还好,挂个 terra-max 设个目标跑几天就搞定了,用中转低倍率的 API 说不定几十块钱就能搞定。顺便问下,现在 C++module 的体验咋样了?之前玩过点小项目,发现还得自己手动去编译 std 的相关文件才能 import,现在还得这么折腾吗?

· 0 个赞

回复

Bun 作者自己说,他这 11 天的极限重写,API 费用硬生生烧了 16 万多刀。

· 0 个赞

回复

在 gcc 16 或者 llvm 22 上用 `import std;` 基本没啥坑了(上面发的 mbun 就是这么跑起来的)。其实之前我还专门写了个针对模块化和 `import std;` 的构建工具,这样就不需要折腾工具链了,直接 `mcpp new` 和 `mcpp run` 就能跑。上面的项目也是用它构建的。

· 0 个赞

牛逼。不过现在 Node、Deno 以及反过来的 Bun,还有反过来的 nub ( https://nubjs.com/ ) 都有了,你这项目要不考虑叫 bnu、ubn 或者 unb 🐶

· 0 个赞

回复

我去,还真没发现有个叫 nub 的项目,长见识了 hhh

· 0 个赞

巧了,我也搞了个类似的,不过没开源。我的兼容性稍微做得好点,目前是纯 Linux 平台,靠 io_uring 撑着,吞吐量还可以。

· 0 个赞

回复

大佬你的项目是 C++写的还是用 Rust 撸的?

· 0 个赞