Brainfuckでレイトレーサーを書いた
I wrote a ray tracer in Brainfuck

CMakeのチュートリアルで「レイトレーサーはCMake言語でも書ける」という記述に触発され、Brainfuckでレイトレーサーを実装。Q16.16固定小数点演算や除算、平方根を8つの命令だけで実現し、23MBのコードで400x225の画像を生成。1ピクセルに1分かかる遅さだが、C++版と同じ画像を出力することに成功した。
「多くの場合、正しい答えは汎用プログラミング言語で問題を解決するツールを書き、CMakeにそのツールをビルドプロセスの一部として呼び出す方法を教えることです。コード生成、暗号署名ユーティリティ、さらにはレイトレーサーでさえCMake言語で書かれたことがありますが、これは推奨される方法ではありません。」
- throwaway99e2
これって要はpython/cで書いたレイトレーサーがbrainfuckを吐き出してるだけじゃないの?この論理で言ったらgccは俺の全プログラムをアセンブリで書いてることになるわwww
- shoo
brainfuckを直接書くのは楽しくない——例えばこの言語には変数がないから、どのメモリオフセットがどの「変数」を格納しているかを手動で管理しなきゃいけない。それに、メモリレイアウトが変わるような形でプログラムを少しリファクタリングする必要が出たら、絶対オフセットと相対オフセットを手で作り直さなきゃならないかもしれない。だから著者が直接BFを書くために腕まくりしなかったのは理解できる——それは生産的でも面白い演習でもない。
著者がどう問題を分解したかを見るのは興味深い:
- Cのレイトレーサー https://github.com/mTvare6/rayfuck/blob/master/ray.c
~~ CコードのLLMリファクタリング ~~>
- SSAスタイルのCレイトレーサーコード https://github.com/mTvare6/rayfuck/blob/master/ray_ssa.c
~~ c2dsl.pyヘルパースクリプト(コンパイラ) ~~>
- DSLレイトレーサー https://github.com/mTvare6/rayfuck/blob/master/ray.dsl
~~ dsl2bf.pyヘルパースクリプト(もう一つのコンパイラ) ~~>
BFレイトレーサー https://github.com/mTvare6/rayfuck/blob/master/ray.bf (約22MBの読めないナンセンス)
dsl2bfコンパイラには、BFプリミティブの上に少し高レベルの抽象化を実装した例がたくさんある。例えば、ポインタを別のオフセットに移動する「go」、破壊的コピーと非破壊的コピー、さらには除算のようなものまで——BFはネイティブには単項の加算/減算しか提供していないのに。
最終的なコンパイラであるdsl2bf.pyのコードを読んでみると、そのコードで使われている抽象化は比較的シンプルだ:グローバル変数、ローカル変数、リスト、辞書、forループ、関数定義、そして関数 […]