私はBFインタプリタをアセンブリで作成しましたが、今はアセンブリコードにコンパイルするJavaでBFコンパイラを作成しています。Brainf ** kプログラムでメモリ配列が範囲外にアクセスされているかどうかを調べることはできますか?
メモリセルの配列が範囲外だったかどうかを検出するちょっとした機能を実装したかったのです。アレイの従来の制限は、インデックスを[0, 30000)
にすることです。それ以外の場合は、[0, inf)
もよく使用されます。もう1つの選択肢は、メモリがラップされるということです。最初のケースでは、インデックス30000にアクセスするとインデックス0にアクセスすることを意味する可能性があります。
私のコンパイラでは、この検出は従来のコンパイラのセマンティック解析フェーズで行われます。すでに構文解析段階からAST(抽象構文木)を取得しています。
私はDetecting infinite loop in brainfuck programとBFのウィキペディアのページを見つけましたが、メモリ配列[0, inf)
と同じBFプログラムがチューリングマシンに似ていることが分かりました。
私の質問は、[0, max)
と[0, inf)
の両方のケースでは、メモリポインタがゼロ以下になるかどうかを検出できますか?明らかにそれをチェックしている間無限ループに終わることなく、最大実行時間を設定するのをやめてしまいます。
ボーナスの質問:ループ構成の回数を検出することは可能ですか[...]
ループ?
私はbrainfuckを知りませんが、コンパイル時にこれを検出したい場合は、場合によっては停止できないと思われます。 – alain
@IraBaxter私は静的分析の重要性を語りたくありませんでした(実際には、それは困難で興味深い分野です)、スキウィが限界を認識しているかどうかは分かりませんでした。彼がリンクした質問を読んだので、彼はそうだったようです。 – alain
@alain:まあ、思い返して、私はあなたにコメントを狙っていない、私は空白を残しておくべきだった: - 私はあなたが始めた釘の中で運転していた: - } –