<<
21/27
>>
First
Last
バックエンドよもやま - Brainfuck
- とにかくクッソ遅い
- 値ひとつのインクリメントやポインタの移動が1命令
- スタックはたいてい 1<<24 付近のアドレスで、そこまで行って帰ってくるだけで一苦労
- 最適化処理系必須 ([-] やシンプルなループの検知)
- 最適化してCに変換、それをtinyccでコンパイルして実行してる
- 生成されたCコードをgcc/clangに喰わせるとメモリ使い切って死ぬ
- 8bitセル3つで24bit整数を表現
- 加減算めんどくさい、比較演算の実装、地獄 https://github.com/shinh/elvm/blob/master/target/bf.c#L376
- 命令ディスパッチやメモリロードストアは2階層
- if (!pc_high--) { if (!pc_low--) {...} if (!pc_low--) {...} ... *256 } if (!pc_high--) {...} ... *256
- 上記の内側のifの中に1つのbasic blockが入る
- つまりjmpなどが起きるまではまとめて一気に実行する
- load/storeでもbasic blockが切れる
- load/storeは8MBほどのBFコードなので、basic blockの中に直書きすると非現実的なコードサイズになる
- load/storeをしたい時はフラグを立ててアドレスと値を書いてbasic blockを出ると、メモリコントローラがやってくれる
http://shinh.skr.jp/slide/elvm/8cc.c.eir.bf