有个开发者发帖说,自己正在用Rust写一个玩具语言的编译器,语法夸张地简单——只有let、print?和println?,变量类型也只认u64整数和String字符串。初看像是两天就能交差的练手项目,但帖子底下藏着一条苦涩的进度条:“Now, I'm writing the codegen and I'm stuck because of Assembly.”
先把这位兄弟的贴子拆开看看,几个技术点很值得边笑边记:
1. 自定语法极度克制,但踩中了“函数变宏”的坑
他的语言示例就两行赋值、三次打印,连控制流都还没影。他说print?现在是函数,但“soon they'll become macro”。从函数改成宏,很可能是想省去运行时的调用开销,或者需要直接操纵语法树。问题是,宏展开要在编译早期解决,等于重构整个解析流程。
2. 类型系统停留在石器时代
只有u64和String两种类型,连布尔都不支持,更别提结构体或泛型。他大概是想先把代码生成跑通再回头补课——结果直接栽在代码生成本身。
3. 代码生成成了真正的拦路虎
这位老兄直说卡在汇编,“I have to learn it! Never mind.”话里的“Never mind”透着一种强行淡定。很多人以为写完词法和语法分析就等于Compiler 80%完工,结果发现把中间表示翻译成x86或arm指令时,寄存器分配、栈帧布局、系统调用约定一齐扑上来,学完汇编还得学目标平台的ABI。
4. 心态管理意外成为编译器工程的一部分
帖子里有句“In a few days, I'll complete it”,还附上代码仓库让网友检查,最后留下个“Stay tuned OvO”。这种边学边摔边直播的节奏,倒是比完美主义的沉默更可能真把东西做出来。
顺便说句客观话:用Rust写编译器其实不算最糟的选择,模式匹配和强类型能在语义分析阶段帮上忙,但救不了汇编瘸腿。如果接下来他决定直接把代码生成为C然后调gcc,或者先跑在虚拟机上,进度条大概会诚实得多。
热门跟贴