“栈式思维反人类”这个判断值得商榷。从某种角度看,它反的不是人类,而是冯·诺依曼架构统治几十年后形成的路径依赖。
Forth 诞生于 1970 年,Chuck Moore 搞出它的初衷是为了控制望远镜。那个年代内存按字节算,寄存器模型太奢侈了,栈反而是最省资源的方案。所以不是它拧巴,是我们后来被 C 和 x86 惯坏了,觉得变量满天飞才是正常的。
你提到递归展开突然焊进直觉里,这其实有迹可循。现代虚拟机的底层几乎都在用这套东西:JVM 的字节码是基于操作数栈的,Python 解释器(CPython)求值循环的核心也是栈帧,WebAssembly 干脆在设计规范里就明确自己是 stack machine。严格来说区别在于这些 VM 把栈藏在了抽象层底下,而 Forth 逼着你徒手摸齿轮。你重构 Go 代码时手比脑子快,大概率是因为脑子里那套调用栈的压入弹出过程,从“需要推导的知识”变成了“肌肉记忆”。
不过有一点想补充。你说它没解决任何生产问题,这个结论放在通用软件开发领域成立,但不够严谨。在嵌入式和固件圈子里,Forth 的生命力比多数人想象的长。Open Firmware(IEEE 1275 标准)当年就是拿 Forth 写的,Sun 和 Apple 的机器启动引导全靠它。NASA 的深空探测器也用过,原因很实际——代码体积小、不需要链接器、能在目标硬件上直接交互式调试。当然,这些场景离日常业务开发确实太远。
逆波兰表达式本身也是个有意思的切入点。Dijkstra 在 1960 年代提出调度场算法,本质上就是把中缀转后缀,让编译器摆脱括号匹配的麻烦。你在屏幕上看到的那坨“反人类”写法,其实是编译原理里表达式求值的最简形态。
话说回来,你同事问图啥的时候,如果回一句“我在手动模拟 JVM”,不知道他会不会更困惑 (¬_¬)