コミュニティアイコン プチコン 非公式コミュニティ プレイ日記

アバター
とすけ ◆IUAdB4KpZwSR
2018/4/28 18:01
なんでこれが通るんだ

コメント

アバター
こういち 2018/4/28 19:34 ◆ou0jbJnEJ0Kb
IF文でGOTO使うときのみ、
THENとGOTOは省略出来ます。
アバター
とすけ 2018/4/28 19:41 ◆IUAdB4KpZwSR
文法的にはTHENと同一という説
アバター
おちゃめ 2018/4/28 20:19 ◆jH1opV6FnGyx
BASICなどの高級言語(人間にとってわかりやすいプログラミング言語)は、逆に言えばコンピュータ(プチコンなど)にとってはわかりにくい言語となります。
アルファベットの羅列がどのような命令や関数かを1文字ずつ読み取って判断していったら動作速度が非常に遅くなります。
そのためプチコン3号は実行時には仮想マシンコードへとコンパイルが行われます。

このコンパイルはRUNやEXECだけではなくUSEでも行われます。(USEはプログラムを実行せずコンパイルのみ行う命令)
コンパイル時は実行可能な命令、関数か否かの簡単なチェックも行われて変数やラベルなどのリストアップが行われます。

ここで重要なのはコンパイル時の文法チェックはあくまで簡易的なものであり、細かい部分は実行時にチェックが行われるということです。
実は、GOTOのジャンプ先は変数が使えるため「ジャンプ先が正しいかどうか」というチェックはコンパイル時には行われてないのです。(プチコン3号ではコンパイル速度を重視して1パスコンパイルを行っているためたとえGOTOが変数が使えない仕様だったとしてもジャンプ先が正しいかをチェックすることはできないけど)
そのためコンパイルが終わった時点ではGOTOの後に何を書こうがエラーは発生しません。

ここで、該当するプログラムを見てみるとIF 0 GOTO ?"###"となっています。
IF 0だと常にFalseとなるためTHEN以下は実行されることはないのですが、このプログラムにはTHENがありません。

そこで、また重要なのがこういちさんが書いているIFにおいてはIF 〜 THEN GOTOはTHENを省略してIF 〜 GOTOと記述可能な点です。
つまり、実行時は「THEN GOTOのTHENが省略された状態」として認識されるため常にFalseとなるこのIF文はエラーが出ることがないのです。(このGOTOが実行された時に初めてエラーとして認識される)
つまり、明かな記述ミスだけどコンパイル時も実行時もエラーが出ないIF文となります。

これはプチコンのバグというより単なる仕様でしょうね。(特に実害もないので問題ないし)
アバター
こういち 2018/4/28 21:49 ◆ou0jbJnEJ0Kb
そういえば実行されない謎文字列の入ったプログラムを謎文字列の行で中断するとダイレクトモードの挙動が変化する謎現象があったのを思い出しました。
http://petitverse.hosiken.jp/community/petitcom/diary/?read=999&ukey=1
アバター
おちゃめ 2018/4/28 22:20 ◆jH1opV6FnGyx
不可解な部分がどれかは分かりませんでしたが、謎文字列が実行するまでエラーを吐かないのはプチコン3号が「1パスコンパイルであること」「自作命令が使えること」が原因ですね。
つまり、「コンパイルの時点では謎文字列が自作命令かどうかが分からない」ためにエラーの出しようがないということです。

コメントを書く

この投稿にはコメントできません。

- WEB PATIO -