HabréでBrainfuckに関連する多くの投稿(その解釈を含む)を見つけた後、私は自分のBrainfuckインタープリターを書きたいと思っていました。 しかし、言語自体が私たちにもたらす必要な感覚を満たすために、それをBrainfuckに書く必要がありました。 そして、私は部分的に成功しました。 私は今、私が持っていないものを予約します:このインタープリター
は現在、
ループと入力データ入力をサポートしていません(入力データの場合、Brainfuckプログラムが入力されているので、それを読む方法はありません) -簡単に言えば、コマンド "
[ "、 "
] "および "
、 "。
制限事項
制限のうち(インタープリターがサポートしていないものに加えて)、次の2つだけがあります。
- 最小セルインデックスは(-1)以上でなければなりません(そうしないと、インタープリターが誤動作するリスクがあります)。 言い換えれば、プログラムの先頭に「 << 」と書くことは価値がありません。
- 使用されるセルの最大数は255です。
スピード
すでに提案されていると思いますが、
Brainfuckで通訳を書く価値はないことを明確にします。
難読化されたインタープリターのソースコード
あなたがまだ私がしたことを体験したいという願望を持っているなら、ソースコード自体:
,[>,]>>>>++<<<<<[<]>[[[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-]>++++++++++[<++++>-]<+++<[>-<-]+>[<->[-]]<[->>>[<+<<+>>>-]<[>+<-]<<[>>>>>>>>>[>>->>]<<<<[<<<<]<<<<<-]>>>>>>>>>>>[>>>>]<+<[-]<<<<[<<<<]<<[<+<<+>>>-]<[>+<-]<<[>>>>>>>>>>>[>>>>]<<+<<<<[<<<<]<<<<<-]>>>>>>>>>[>>[-]>[-]<<<[>>+>+<<<-]>>>[<<<+>>>-]>]<<<<[<<<<]<<<<<]<<[<]>[[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-]>+++++++++[<+++++>-]<<[>-<-]+>[<->[-]]<[->>>[<+<<+>>>-]<[>+<-]<<[>>>>>>>>>[>>->>]<<<<[<<<<]<<<<<-]>>>>>>>>>>>[>>>>]<-<[-]<<<<[<<<<]<<[<+<<+>>>-]<[>+<-]<<[>>>>>>>>>>>[>>>>]<<+<<<<[<<<<]<<<<<-]>>>>>>>>>[>>[-]>[-]<<<[>>+>+<<<-]>>>[<<<+>>>-]>]<<<<[<<<<]<<<<<]<<[<]>[[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-]>+++++++++[<+++++>-]<+<[>-<-]+>[<->[-]]<[->>>[<+<<+>>>-]<[>+<-]<<[>>>>>>>>>[>>->>]<<<<[<<<<]<<<<<-]>>>>>>>>>>>[>>>>]<.<<<<<[<<<<]>>>>[>>[-]>[-]<<<[>>+>+<<<-]>>>[<<<+>>>-]>]<<<<[<<<<]<<<<<]<<[<]>[[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-]>++++++++++[<++++++>-]<<[>-<-]+>[<->[-]]<[->>>-<<<]<<[<]>[[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-]>++++++++++[<++++++>-]<++<[>-<-]+>[<->[-]]<[->>>+<<<]<<[<]>[-]>]
繰り返しますが、このインタープリターはサイクルまたはループをサポートしないため、これらの機能の正しい動作についてこのインタープリターをテストする必要はありません。
brainfuck.tkでBrainfuckコードを実行し、入力データの例として次のコードを使用できます。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.+.+.>++++++++++.<.-.-.
次の2行が出力されます。
ABC
CBA
ソースコード
ソースコードの前に、いくつかのポイントを明確にします。
- N-したがって、入力文字列の長さを示します。 私たちの場合、それはBrainfuckのプログラムでなければなりません。
- セルのカウントは0から始まります。
- 入力プログラムのコードは、ゼロから始まるセルに配置されます。
- セル(N + 4)-現在のセルへのポインター。 デフォルト値は2です(入力プログラムの場合、これはインデックス0のセルです)。 入力プログラムの値-1-は、インデックス(-1)を持つセルとして使用できます。
- 入力プログラムデータはセル(N + 10)で始まります。
- データ構造の形式は、1番目のセル-セル番号、2番目のセル-値、3番目と4番目のセル-中間結果を保存するためのセルです。
使用される文字のASCIIコード:
ソースコード:
,[>,] brainfuck >>>>++<<<< (N 4) <[<]> : N 0 [ [[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-] (N 1) >++++++++++[<++++>-]<+++ 43 (N 2) <[>-<-] 43 +>[<->[-]]<[- ""; : (N 1) >>>[<+<<+>>>-]<[>+<-]<< (N 4) (N 1) [>>>>>>>>>[>>->>]<<<<[<<<<]<<<<<-] >>>>>>>>>>>[>>>>]<+<[-] <<<<[<<<<]<<[<+<<+>>>-]<[>+<-]<< (N 4) (N 1) [>>>>>>>>>>>[>>>>]<<+<<<<[<<<<]<<<<<-] >>>>>>>>>[>>[-]>[-]<<<[>>+>+<<<-]>>>[<<<+>>>-]>] <<<<[<<<<]<<<<< (N 1) ] <<[<]> : (N 1) 0 [[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-] (N 1) >+++++++++[<+++++>-]< 45 (N 2) <[>-<-] 45 +>[<->[-]]<[- ""; : (N 1) >>>[<+<<+>>>-]<[>+<-]<< (N 4) (N 1) [>>>>>>>>>[>>->>]<<<<[<<<<]<<<<<-] >>>>>>>>>>>[>>>>]<-<[-] <<<<[<<<<]<<[<+<<+>>>-]<[>+<-]<< (N 4) (N 1) [>>>>>>>>>>>[>>>>]<<+<<<<[<<<<]<<<<<-] >>>>>>>>>[>>[-]>[-]<<<[>>+>+<<<-]>>>[<<<+>>>-]>] <<<<[<<<<]<<<<< (N 1) ] <<[<]> : (N 1) 0 [[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-] (N 1) >+++++++++[<+++++>-]<+ 46 (N 2) <[>-<-] 46 +>[<->[-]]<[- ""; : (N 1) >>>[<+<<+>>>-]<[>+<-]<< (N 4) (N 1) [>>>>>>>>>[>>->>]<<<<[<<<<]<<<<<-] >>>>>>>>>>>[>>>>]<.< <<<<[<<<<]>>>>[>>[-]>[-]<<<[>>+>+<<<-]>>>[<<<+>>>-]>] <<<<[<<<<]<<<<< (N 1) ] <<[<]> : (N 1) 0 [[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-] (N 1) >++++++++++[<++++++>-]< 60 (N 2) <[>-<-] 60 +>[<->[-]]<[- ""; : (N 1) >>>-<<< 1 ] <<[<]> : (N 1) 0 [[>]>+>+<<<[<]>-]+[>]>>-[<<<[<]>+[>]>>-] (N 1) >++++++++++[<++++++>-]<++ 62 (N 2) <[>-<-] 62 +>[<->[-]]<[- ""; : (N 1) >>>+<<< 1 ] <<[<]>[-]> ( ) ]
結論の代わりに
実行中のサイクルを見るのも面白いでしょうが、現時点では、それらの実装方法の完全な図がわかりません。そのため、インタプリタの完全に機能する実装ができたらすぐに、この記事を更新します。
PSBrainfuckでBrainfuck
インタープリターへのリンクを提供してくれたiSage
habloveに感謝し
ます 。