[Rewrite Bun in MC++] 7 天 20+万行代码 C++26 模块化, 重写 Bun 行为艺术复刻, 已能真实运行顶级开源 Web 框架项目

7 月 19 日
 Sunrisepeak

背景

之前 Anthropic 团队用 Agent 开发 C 编译器 以及 早期 Rewrite Bun in Rust. 最初我也就看个热闹, 但没有想到的是 Bun 作者真的把这个 100W+行的 PR 合入了, 我相信这不仅是对我而是整个开发者群体都是一件相当震惊的事情。

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

带着上面的思考, 加上我本身又是 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;
}

2400 次点击
所在节点    程序员
16 条回复
Sunrisepeak
7 月 19 日
msg7086
7 月 19 日
在已有项目上做翻译都算是比较简单的工作了,抄起 terra-max 开个 goal 让他干几天就完事了,走低倍率中转说不定干完才花几十块钱。
说来 C++module 现在可用性怎么样了?之前搞了些简单的项目,后来发现好像要自己手动构建 std 的什么文件才行,要不然不能直接 import std ,现在还需要吗?
Sunrisepeak
7 月 19 日
@msg7086 gcc 16 / llvm 22 用 import std 目前感觉上没有什么大问题(上面 mbun 就是用的)。之前有做了个为模块化 和 import std 打造的 构建工具 基本没有工具链负担 mcpp new / mcpp run 就可以了。上面 mbun 项目也是用这个 mcpp 构建工具构建的, 具体可以可以看下面仓库

- https://github.com/Sunrisepeak/mbun
Sunrisepeak
7 月 19 日
@msg7086 Bun 作者说他 11 天重写, API 费用花了 16+万美元
msg7086
7 月 19 日
@Sunrisepeak Bun 他们是为了噱头拉爆了 64 个 subagents 来节约时间,这样可以宣传 11 天蹬完整个项目。
咱们自己移植没必要这么浪费 token 的,开一两个 subagents 在旁边打辅助,剩下的 inline 跑就行了。
Sunrisepeak
7 月 19 日
@msg7086 我实际体验下来, 超过 5 个 agent 并行 使用 worktree 依然会有冲突问题, 往往并行过多时推进还会慢 (可能和我使用方式有关系)
msg7086
7 月 19 日
@Sunrisepeak 所以要 inline 跑啊,subagents 可以帮忙做 code review 也可以跑测试之类的,主进程做代码修改,又或者反过来 subagents 写代码,然后主进程跑测试,整理要提交的文件然后分批提交。
多 subagents 要良好并行是要下功夫的,想想企业里开发一个小软件交给 5 个程序员一起做会多混乱吧。
magicdawn
7 月 19 日
6

不过 node 和 反过来的 deno 都有了
bun 和 反过来的 [nub]( https://nubjs.com/) 也有了
你可以命名你的项目叫 bnu ubn unb nbu 🐶
DeeCheung
7 月 19 日
我也做了一个,没开源,兼容性支持比 mbun 高些,不过我是 linux-only + uring 吞吐高些
Sunrisepeak
7 月 19 日
@magicdawn 原来还有 nub, 这个之前还真没有发现 hhh
Sunrisepeak
7 月 19 日
@DeeCheung 也是用 C++吗 还是 rust
DeeCheung
7 月 19 日
@Sunrisepeak 是 C++ 不过不纯,底层用 lo(v8 升级到 14.9 ICU+Temporal),利用其能力快速扩展底层能力,大量兼容 webstd/N-API/Bun-API/Node 。有些是三方是 C/Rust
DeeCheung
7 月 19 日
后来已经跳出 lo 来 build custom runtime ,纯 ts 编排( lo 方式)。一个建议,如果要做上游,让 agent 用预言机模式直接复用上游测试及 bench 脚本即可。
DeeCheung
7 月 19 日
一开始 uring bench 稳定超过 bun.serve 15% ,最近不知道什么原因性能下降了,还没有定位到原因,兼容性推进多了,被 codex 重置额度推着猛蹬,有点失控
Sunrisepeak
7 月 19 日
@DeeCheung 复杂度高了后 模块间影响 性能很容易下降, 可能需要 按模块 + 全局性能优化
limhiaoing
7 月 19 日
厉害了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1228291

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX