背景
之前 Anthropic 团队用 Agent 开发 C 编译器 以及 早期 Rewrite Bun in Rust. 最初我也就看个热闹, 但没有想到的是 Bun 作者真的把这个 100W+行的 PR 合入了, 我相信这不仅是对我而是整个开发者群体都是一件相当震惊的事情。
一个 ~100k+ star 、真实应用到生产环境的顶级开源项目、不到 2 周时间 AI 编写了 100 万+行代码 单个 PR 直接合入主分支了! 这里最核心的是他不是一个玩具项目。所以这个事件引发了我的一些思考:
- 对于百万行级的大型项目 Agent 大幅度参与的可行性、会不会遇到什么问题?
- 开源项目、开发者、Agent 如果管理和维护?
- Agent 承担了执行者的角色, 而人更多的是做 架构设计、决策、规则制定、品位、审美相关的事?
- 不是人来执行者后, 编程语言选择、是否手写、xx 语言开发者群体等可能更偏向文化类感性一点? (类似 小众文化 / 二次元)
带着上面的思考, 加上我本身又是 C++ 最新语言特性 以及 模块化工程(import std;) 极度的爱好者 + 实践者, 所以我决定使用 C++26 + 模块化 也重写一下 Bun 来具体体验一下这个过程, 同时也来验证一下 C++26 和 模块化在百万级工程项目上的可用性和最佳实践, 于是就有了这个 -> Rewrite Bun in MC++
进展和规划
mbun 已经有 24 万+行 C++模块化(.cppm) 代码, 并能构建为单可执行文件。
目前 已经可以初步"验证使用" + 真实运行生态顶级开源项目:
但是对于 Bun 和 Node 原生的 6000+测试集覆盖率目前还处于~40%的进度。
当前的规划是 先 100%过 Node 和 Bun 原生的所有测试集, 然后再分模块的进行性能优化。在这个从"零"搭建基础项目结构, 使用多 Agent 并行开发 20+万行 C++代码中也遇到了一些问题以及关于上面问题的一些思考, 打算过几天等 100%覆盖所有测试集后, 再编写相关具体的文章来详细分析一下过程和相关的思考
而目前我已经把所有的代码放到了 Github 的 mbun 仓库, 欢迎感兴趣的朋友 Star 项目或一起参与开发/构建 (一起玩 / Just for Fun)
mbun - main.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;
}