まったり アイマス2

アイドルマスター2 超ライトユーザーのプレイ日記

4537. PC-8801 mkII SRミニ 発売へ、続き^8

2024年08月23日 | 日記

 N88-BASICでは一度制御が通過するとGOTO/THEN/GOSUBの行番号は探索された後にポインタで置き換えられて、以後は探索無しで飛べるようになる、はずです。しかし、同時期の他のパソコンBASICは毎回探索するはずです。
 プログラムの前後、と言うと書いた順か制御の進行方向かで真逆で、普通は行番号の若い方が「前」です。ややこしいので、以下、上下で表現します。マイナーな表現なので他文献を見る時はご注意下さい。

(1) 行番号からポインタに付け替えが起こらない場合

 探索は、目標の行番号が現在の行番号よりも大きい場合は、次の行から下へ、つまりプログラムの末尾に向かって探索されます。ですから下へ向かう場合は近いほど探索が早く終了します。
 目標の行番号が現在の行番号よりも小さい場合は、プログラムの最上位、つまり冒頭から下へ探索されます。この場合は冒頭に近いほど早く探索が終了します。

 IF-THEN-ELSEの構造だと、素直に書くと、THENの行番号は下になり、IF文の直後からのELSE節の末尾からENDIF相当の場所へ飛ぶGOTOも下になり、どちらも比較的近くに飛びます。ですから、ここはあまり心配ないです。

 しかしループは一回の終了時に上に跳ぶので、近くでも探索に時間がかかるかもしれません。
 そこで、パソコンBASICでは繰り返し処理のためにFOR文とWHILE文が用意されています。どちらもスタック上に専用フレームが作られ、ループの先頭と末尾へのポインタが入っています。FORの場合は追加で制御変数へのポインタが保持されます。STEP値と終値も入っていて、整数型と単精度浮動小数点数型があって、したがって、制御変数を整数型にしておくと若干高速になるはずです。
 つまり、ループはできる限りFOR-NEXTまたはWHILE-WENDを使うべきだ、ということ。FORの制御変数は普通は単純なカウントか配列の要素指定に使います。その他の場合にWHILEを使います。

 呼び出すサブルーチンはできるだけ下の近くに配置するのが良いです。

(2) 行番号からポインタに付け替えが起こる場合

 上方へのGOTOが気兼ねなしに使えるようになるので、GOTOを使って単純ループを組んだり、THENの飛び先をループの先頭とみなして、PASCALのrepeat-until (C言語のdo-while)相当が気軽に書けます。
 サブルーチンの位置は任意の場所でOKです。

 とは言っても、FOR文は便利なので、積極的に使う人が多いと思います。

 ところで、WHILEは、私はFORTRAN 90の解説書で、最適化を著しく損なうために使うな、との文章を見たことがあり、しかし、その理由を書いた文章は見たことがありません。
 なので想像になりますが、フローチャート化すると分かるようにWHILEは制御がループの末尾で袋小路になっていて、終末時には2回のGOTO相当が追加されます。repeat-untilの方がよほど単純で、しかしFORTRANにあったかな。単純ループはあったと思います。

 フローチャートにすると同様の構造に見えるFORTRANのDO文がむしろ推奨されているのは、制御変数が特別扱いで、ループ内で更新してはいけないので、DOの入り口で繰返し回数が決定できるので、最適化は容易、との理由のようです。PASCALのFORも同様。

 C言語には制御変数の概念が無く、FOR文はいわゆるシンタックスシュガーです。ところが、FOR(;;){}と書くと{}の中身が単純ループになるためか、あまり最適化の障害になるとかの話は聞いたことがありません。私はこのfor(;;)は多用します。脱出にはbreak文を使います。
 パソコンBASICでも制御変数の特別扱いは無いはずですが、インタプリタの構成から、速度的には些細な話になってしまうので、FORは推奨されるはずです。同様の理由でWHILE-WENDは積極的に使って構わないです。

 あと、C言語のswitch-caseの多重分岐に相当するのは、ON n GOTO ...です。あまり使った記憶が無いのですが、効率的には素直に下に飛ぶなら良好なので、必要時には、ためらわずに使って良いと思います。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 4536. PC-8801 mkII SRミニ ... | トップ | 4538. PC-8801 mkII SRミニ ... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

日記」カテゴリの最新記事