Brainf*ck interpreter
http://d.hatena.ne.jp/hogelog/20100914/p1 読んでいろいろいじるには brainf*ck がいい教材だということに気付いたのでとりあえず base になる interpreter code を書いてみた。細かい処理内容は元ネタの記事と一緒ていうかパクってすいませんていうか仕様の愚直実装なんだけど。ただ思いっきり C++ な書き方してたりする。
- http://github.com/januswel/brainf_ck
- http://github.com/januswel/brainf_ck/blob/3f8b3828a533b2de54c007653b835dbfb0a0e007/interpreter/cpp/brainf_ck.hpp
- http://github.com/januswel/brainf_ck/blob/3f8b3828a533b2de54c007653b835dbfb0a0e007/interpreter/cpp/main.cpp
main.cpp のほうは入力の取り扱いとか object の生成・ member function 呼び出しとかだけで重要なのは brainf_ck.hpp のほう。 2 つの class を宣言・定義してる。
- parser
- script を parse して intermediate codes に落とし込むところ。
- たたき台なのでまだ単純に入力を buffer するだけね。
- 主に parse() 関数をいじって遊ぶわけだ。
- executer
- intermediate codes を順次実行するところ。
- wikipedia の仕様どおり。
- こっちは execute() 関数を parser がはき出す intermediate codes にあわせて変更してやる作業をする予定。
で、実行は以下のように。
- VC++
- cl /O2 /DNDEBUG /EHsc /W4 /Za main.cpp
- main ../../scripts/helloworld.bf
- g++
- g++ -O2 -DNDEBUG -Wall --pedantic main.cpp
- ./a.out ../../scripts/helloworld.bf
でまぁもうちょっと賢い intermediate codes の構築とか高速化とかして遊ぶわけなので ( 中略 ) 元ネタでも使ってた mandelbrot 集合を描画する script -> http://esoteric.sange.fi/brainfuck/utils/mandelbrot/mandelbrot.b を実行した際の現時点の time 。あー実行環境も載せとこう。
./a.out ../../scripts/mandelbrot.bf 120.78s user 0.05s system 99% cpu 2:00.98 total