第二次 Futamura 投影:把特化器喂给特化器,编译器自己掉出来
来源:blog.veitheller.de — 2026-11-03
📋 概述
Veit Heller 接上一篇:他先把 compfuck 变回解释器,再写一个特化器把解释器折掉,得到的第一 Futamura 投影已经能产出编译好的程序——但每来一个 Brainfuck 程序都要重跑一遍特化器。第二次投影是对特化器本身下手:compiler = specialize(specializer, interpreter)。难点在于旧特化器只认识解释器这一个程序,静态与动态的划分是手写的,静态求值还依赖 Carp 的 eval。这次他写了会自省的特化器:用 remember / defmix 把参数也存进元数据、收集成「特化器即程序」,用纯语法的 mentions? 规则做静态动态划分,并自己实现小 Lisp 求值器 ev 取代 eval。
🔑 核心要点
- mentions? 规则纯语法,因此只引用静态变量但有副作用的表达式也会在特化期被执行。
- 结果是:一个完全不懂 Brainfuck 的解释器加一个特化器,互相喂一次就吐出了编译器,还附带一个本没要求的括号搜索优化。
- 仍有需要人插手的地方:哪些变量算静态、原语集合、memo 放哪,都要引导。
- 第三次投影(特化器特化自身、把解释器变成编译器)作者不承诺,只说「也许我有时间」。
💡 金句
我们写了一个解释器和一个特化器,它们都不知道怎么编译 Brainfuck;把其中一个喂给另一个,编译器就掉了出来。
👍 0
👎 0
← 返回 Lobsters 首页