まだ名前のないBrainfuck風スタック言語、略して MNNBFSL
というのを考えてみた。
インタープリタの実装は GitHub - yshl/MNNBFSL: Mada Namae no Nai BrainFuck fu Stack Language に。
説明
データスタックとリターンスタックの 2本のスタックがあります。スタック 2本あればチューリング完全らしいから、チューリング完全なんじゃないかな。証明してないけど。
命令は、通常の命令 9個とデバッグ用の 1個の合計 10個です。Brainfuck より 2個も増えてしまった……。
" | データスタックのトップの値を複製する |
+ | データスタックのトップの値を 1 増やす |
- | データスタックのトップの値を 1 減らす |
> | データスタックからポップし、取り出した値をリターンスタックにプッシュ |
< | リターンスタックからポップし、取り出した値をデータスタックにプッシュ |
[ | プログラムカウンタをリターンスタックにプッシュ |
] | データスタックからポップする。取り出した値が 0 ならリターンスタックからポップする。 0 でないならリターンスタックからポップし、取り出した値をプログラムカウンタにセットする |
. | データスタックからポップし、その値を stdout に出力する |
, | stdin から 1バイト読み、データスタックにプッシュし、さらに 1 をプッシュする。 EOF の場合はデータスタックに 0 をプッシュする。 |
s | (デバッグ用) データスタックとリターンスタックの値を stderr に出力する |
その他 | 何もしない |
大体 Brainfuck に似た感じ。ただし、[ と ] が対応した括弧にジャンプではなく、プログラムカウンタ操作になってます。前方へのジャンプは [ でプログラムカウンタを取得しておけば、] でジャンプできるのですが、後方へのジャンプは [ でプログラムカウンタを取得してから適当に値を増やす必要があり、若干めんどくさくなっています。
プログラムカウンタをいじれるので、C へのトランスレータとか最適化するコンパイラは Brainfuck より難しそうな予感がします。
EOF ときの動作を仕様で決めている点は、Brainfuck より進歩していると思う。
サンプル
Hello, world
[<"++++++++[>++++<-"][]"++++"[->+<"][]."+"+[->++<"][]"".+++++++"".."+++".>>>"+++ +++++++++.".<<<"++++++++.".+++..-.+.
ビジーループ
[<+["]
入力をそのまま出力
[<+++++"[->+++++<"][]">"++>] [.,]