用Brainfuck写Ray Tracer有多难?
I wrote a ray tracer in Brainfuck

在准备C++系统编程竞赛时,我重新学习CMake,却注意到一个有趣的说法:有人甚至用CMake Language写过Ray Tracer。这激起了我的好奇——如果用更简单的语言会怎样?于是,我选择了只有8个操作的Brainfuck。为了渲染与RayTracingInOneWeekend中Metal版本相同的图像,我基于第一性原理重新设计,使用Q16.16格式模拟浮点数,并手动实现了sqrt、rand等核心算法。最终生成的代码长达23MB,渲染速度为每分钟100条光线。这不仅是对极简语言极限的挑战,更是一次对底层计算原理的深刻探索。
很多时候,正确的做法是用通用编程语言写一个工具来解决问题,然后教CMake如何在构建过程中调用这个工具。
HN 评论区
21- throwaway99e2
这难道不就是个用 Python/C 写的 Ray Tracer,最后输出 Brainfuck 代码吗?照这个逻辑,GCC 把我所有的程序都写成了汇编 lol
- shoo
直接写 Brainfuck 很不爽——比如这门语言没有变量,你得手动记账,搞清楚哪个内存偏移量存的是什么“变量”。而且如果你稍微重构一下程序,导致内存布局变了,可能还得手动重新调整绝对和相对偏移量。所以我能理解作者为啥没撸起袖子直接写 BF——那既没生产力也没啥意思。
挺有意思的是作者如何拆解这个问题:
- C 语言 Raytracer https://github.com/mTvare6/rayfuck/blob/master/ray.c
~~ LLM 重构 C 代码 ~~>
- SSA 风格的 C 语言 Raytracer 代码 https://github.com/mTvare6/rayfuck/blob/master/ray_ssa.c
~~ c2dsl.py 辅助脚本(编译器) ~~>
- DSL Raytracer https://github.com/mTvare6/rayfuck/blob/master/ray.dsl
~~ dsl2bf.py 辅助脚本(另一个编译器) ~~>
BF Raytracer https://github.com/mTvare6/rayfuck/blob/master/ray.bf(约 22 MB 不可读的天书)
dsl2bf 编译器里有很多在 BF 原语之上实现稍高层级抽象的例子。比如用“go”把指针移到不同偏移量,破坏性和非破坏性拷贝,一直到除法之类的操作——BF 原生只支持一元加减法。
如果我们读一下最终编译器 dsl2bf.py 的代码,里面用到的抽象相对简单:全局变量、局部变量、列表、字典、for 循环、函数定义和函数调用。
- extraduder_ire
之前还有一些其他尝试构建输出 Brainfuck 的编译器。
这个支持一些 LLVM IR 指令:https://github.com/caozhanhao/llvm-brainfuck
这里有一个其他项目的列表,其中 asm2bf 看起来最完整:https://esolangs.org/wiki/Brainfuck_code_generation