穿越回1972年:B语言编译器bext-lang/b历史模式(-hist)体验Ken Thompson的原始B语言
穿越回1972年B语言编译器bext-lang/b历史模式(-hist)体验Ken Thompson的原始B语言【免费下载链接】bCompiler for the B Programming Language implemented in Crust项目地址: https://gitcode.com/gh_mirrors/b8/bB语言编译器 bext-lang/b 是一个用 Rust 实现的 B 语言编译器它最吸引人的功能之一就是-hist历史模式只需一个参数就能让编译器严格遵循 Ken Thompson 在 1972 年撰写的《Users Reference to B》规范带你原汁原味地体验半个世纪前的编程语言。无论是想了解 C 语言的源头还是纯粹对复古编程感兴趣这个 B语言编译器历史模式都值得一试。下面我们就从零开始看看如何穿越回 1972 年。什么是B语言C语言的爷爷了解一下在正式介绍历史模式之前先简单回顾一下 B 语言的身世。B 语言诞生于 1969 年左右由 Ken Thompson 在贝尔实验室开发是 C 语言的直接前身C 语言中的 C 正是字母表中 B 的下一位。最初的 B 语言运行在 PDP-7 上后来 Dennis Ritchie 在其基础上改进最终演化出了改变世界的 C 语言。B 语言有几个鲜明的时代特征没有类型系统变量就是一个个字word语法非常精简只有少量关键字很多运算符的写法与现代语言截然不同也正因为如此如今几乎没有机会亲手运行一段真正的 1972 年风格 B 代码。而 bext-lang/b 的-hist历史模式正是为你打开这扇时光之门的钥匙。bext-lang/b用 Rust 写就的 B 语言编译器bext-lang/b 是一个Compiler for the B Programming Language implemented in Crust——即用 Rust项目里叫 Crust实现的 B 语言编译器。它架构上把前端生成中间表示 IR与后端把 IR 变成最终程序解耦因此可以灵活挂接多种目标平台包括 x86_64、aarch64、甚至复古的 Uxn 虚拟机和 MOS 6502 处理器。项目文档位于 docs/其中 bext.md 记录了现代模式下的 B 语言扩展如顶层extrn声明、内联汇编__asm__、裸函数等。而我们要体验的历史模式正是为了去掉这些扩展、回归原始规范而设计的。什么是历史模式(-hist)一条命令穿越回1972年历史模式的定义就藏在编译器参数解析代码 src/b.rs 中官方原话是让编译器尽可能严格遵循 Ken Thompson 撰写的《Users Reference to B》中对 B 语言的描述。也就是说开启-hist后编译器会刻意关闭现代 B 语言的舒适功能模拟 1972 年那份参考手册描述的语言面貌。具体差异体现在词法分析器 src/lexer.rs 中主要有以下几点转义字符从 \ 变回 *现代 B 语言使用反斜杠\作为字符串转义符如\n表示换行而在历史模式下转义符是星号*见 lexer.rs。所以换行要写成*n而不是\n这在今天的程序员看来相当新奇。赋值运算符的镜像写法历史模式使用了一套与现代完全相反的复合赋值写法见 lexer.rs现代 B历史模式1972含义加并赋值--减并赋值**乘并赋值//除并赋值左移并赋值右移并赋值这种运算符前置的写法正是 Ken Thompson 原始 B 语言的特征在别的语言里几乎绝迹。禁用现代便利功能为了贴近 1972 年的原始体验历史模式还会主动报错并拒绝这些现代语法❌ C 风格注释//历史模式不支持见 lexer.rs❌ 十六进制字面量0x...历史模式不支持见 lexer.rs写错就会收到明确的LEXER ERROR提示仿佛编译器在提醒你请按 1972 年的规矩来。一键体验历史模式安装与运行步骤说了这么多不如亲手跑一次。整个过程非常简单第一步获取源码$ git clone https://gitcode.com/gh_mirrors/b8/b $ cd b第二步编译$ make编译器依赖 Rust 工具链以及 GCC/Clang 等 C 编译器通常现代 Linux/macOS 环境都自带。第三步用历史模式运行示例程序$ ./build/b -hist -run ./examples/hello_world.b看到输出你就成功了项目在 examples/ 目录下准备了大量示例比如斐波那契数列 fib.b、FizzBuzz fizzbuzz.b、生命游戏 game_of_life.b 等都可以搭配-hist试试。如果想感受历史模式的严苛可以故意在代码里写//注释或0x10十六进制字面量看看编译器如何报错——这种被规范约束的体验本身就是穿越的一部分。现代模式 vs 历史模式一张表看懂区别特性现代模式默认历史模式-hist转义字符\如\n*如*n复合赋值、-等、-等//注释支持不支持报错十六进制字面量支持不支持报错语言基准现代扩展见 bext.mdKen Thompson《Users Reference to B》顺带一提测试工具 btest.rs 目前还有一条 TODO写着让 btest 也测试历史模式说明这个功能仍在持续打磨中未来可期。复古不止于此多后端带你玩得更远如果你觉得单纯穿越还不够过瘾这个 B语言编译器还支持把代码编译到多种有趣的目标平台例如经典的 Uxn 虚拟机见 src/codegen/uxn/一个极简的可移植虚拟机传奇的 MOS 6502 处理器见 src/codegen/mos6502.rs正是 Atari 2600、NES、Apple II 的心脏也就是说你可以用 1972 年的语法编译出能在复古架构上运行的代码——历史与现代的奇妙碰撞。结语bext-lang/b 的-hist历史模式是少有的一键还原 1972 年编程体验的实用功能。它不仅是了解 B 语言的好工具也是一堂生动的编程语言演化课看着*n转义、赋值这些陌生的语法你会更理解今天的语言设计为何如此。如果你也想亲手敲一敲 Ken Thompson 时代的代码不妨 clone 一份源码make之后加上-hist参数开启你的穿越之旅。【免费下载链接】bCompiler for the B Programming Language implemented in Crust项目地址: https://gitcode.com/gh_mirrors/b8/b创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考