零Cargo依赖的Rust编译器:B语言编译器bext-lang/b的nob构建系统揭秘

零Cargo依赖的Rust编译器:B语言编译器bext-lang/b的nob构建系统揭秘 零Cargo依赖的Rust编译器B语言编译器bext-lang/b的nob构建系统揭秘【免费下载链接】bCompiler for the B Programming Language implemented in Crust项目地址: https://gitcode.com/gh_mirrors/b8/b你想过没有一个用 Rust 编写的编译器居然可以完全不用 Cargobext-lang/b 就是一个零Cargo依赖的Rust编译器它用纯rustc加自研的nob 构建系统完成从源码到可执行文件的全流程。本文将一步步揭秘这套极简构建方案的内部原理带你理解为什么没有 Cargo反而更酷。项目速览一个怎样的B语言编译器bext-lang/b 是 B 语言的编译器使用Crust 风格的 Rust 编写——所谓 Crust就是那种把 Rust 当 C 来写、大量使用no_std与no_main、通过 FFI 调用 C 标准库的硬核编程流派。项目的 src/b.rs 入口处就写着#![no_main]和#![no_std]完全没有 Rust 标准库的参与。它主打复古编程Recreational Programming能把你写的 B 语言代码编译成汇编再交给系统自带的cc/as完成链接最终生成原生可执行文件。零Cargo依赖的构建真相Makefile rustc 就够了所谓零Cargo依赖指的是项目根目录下没有Cargo.toml整个构建由一份 Makefile 驱动。核心编译命令只有一行rustc --edition 2021 -C opt-level0 -C panicabort src/b.rs -o build/b为了不依赖 Rust 标准库项目需要额外的 C 运行时支撑——来自 thirdparty/nob.h 等单头文件库它们被编译成.o目标文件再通过-C link-args链接进最终产物。nob构建系统到底是什么nobNoBuild构建系统源于 tsoding 的极简主义理念与其写复杂的 Makefile 或引入重量级构建工具不如用一段几百行的 C 代码把编译、运行命令这件事封装好。在本项目中nob 通过 thirdparty/nob.h 提供并封装成 Rust 模块 src/nob.rs为编译器提供文件读写、目录遍历、命令执行、日志输出等能力。它本质上是一个动态数组拼命令 同步执行的微型构建库例如nob_cmd_append拼装命令参数nob_cmd_run_sync_and_reset执行并清空设计极其直白。构建流程揭秘bgen 元程序是如何工作的这套构建系统最精妙的设计是藏在 src/bgen.rs 里的bgen 元程序。它会在编译主编译器之前先运行一次自动扫描src/codegen/目录把每个子目录对应一种代码生成后端收集起来生成src/codegen/.INDEX.rs索引文件扫描 src/codegen/ 下所有子目录将每个代码生成后端注册为 Rust 模块汇总各后端libb/目录中的 B 语言运行时库复制到build/libb/最终由 src/codegen/mod.rs 通过include!(.INDEX.rs)动态加载全部后端。这意味着新增一个目标平台只需在src/codegen/下放一个新文件夹重新运行make即可自动接入无需改动主代码。这正是 nob 构建系统灵活性的最佳体现。一窥多平台代码生成从 x86_64 到 6502得益于可插拔的代码生成架构这个 B 语言编译器支持多个硬核目标gas-x86_64支持 Linux / Windows / Darwin 三平台见 src/codegen/gas_x86_64/mod.rs甚至能通过 mingw 交叉编译出 Windows 可执行文件gas-aarch64面向 ARM 64 位平台uxn面向 100R 的极简虚拟机的 uxn 后端mos6502传奇的 MOS 6502 处理器配套 POSIX 模拟器作为测试环境。编译器会先生成.s汇编文件再调用系统汇编器与链接器完成构建汇编调用细节可以参考 src/codegen/gas_x86_64/mod.rs 中的generate_program。一键运行第一个 B 语言程序按照 README 的指引克隆仓库后只需两条命令即可体验$ git clone https://gitcode.com/gh_mirrors/b8/b $ cd b $ make $ ./build/b -run ./examples/hello_world.bmake会自动完成编译 bgen → 生成索引 → 编译主编译器 b → 编译测试工具 btest的完整链条其中测试体系在 docs/btest.md 中有详细说明。更多示例程序可以到 examples/ 目录下探索比如经典的生命游戏 game_of_life.b 和曼德博集合 mandelbrot.b。为什么放弃 Cargonob构建系统的三大优势1. 极致轻量无需下载任何 crate不依赖 Cargo 缓存网络本地有一个rustc就能编译。2. 构建过程全透明Makefile 里每一步都清晰可见从 C 源码到.o、从 Rust 到.INDEX.rs没有任何黑盒魔法非常适合学习编译器实现。3. 完美的自举气质用最朴素的工具链去构建一个编译器本身就是一场元编程的浪漫——就像 B 语言本身一样返璞归真。总结一次复古而硬核的构建艺术bext-lang/b 用nob 构建系统证明了现代的 Rust 编译器不一定非要 Cargo 加持。通过 Makefile 直调rustc、用 C 单头文件库补充运行时、再用 bgen 元程序自动发现代码生成后端这套零Cargo依赖的方案不仅可行而且结构优雅、易于理解。无论你是想研究编译器源码的初学者还是钟情于复古编程的极客都不妨 clone 下来跑一遍make亲眼看看这套构建系统是如何把 Rust、C 与汇编巧妙地编织在一起的。项目仍处于开发早期README 也坦诚地提示尚未完全实现不适合严肃开发但非常适合娱乐编程。这恰恰是它最迷人的地方——一个可以随手把玩、没有复杂依赖的编译器不正是最好的学习玩具吗【免费下载链接】bCompiler for the B Programming Language implemented in Crust项目地址: https://gitcode.com/gh_mirrors/b8/b创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考