2020.7.31
前へ
次へ
ホームページトップへ戻る

[新連載]復活!TINY BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
すべてはここからはじまりました。
中日電工も。
40年前を振り返りつつ新連載です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜



[第52回]


●FOR,NEXT

今回はFOR、NEXTの説明です。
FOR、NEXTもGOSUB、RETURNと同様スタックを使うことで多重使用(ネスティング)をすることができますが、そのプログラムはGOSUB、RETURNよりも複雑です。
下はオリジナルのTINY BASICプログラム中に置かれたFOR、NEXTのための説明文です。



’FOR’には2つの型があります。
1)FOR 変数=式1 TO 式2 STEP 式3
2)FOR 変数=式1 TO 式2
の2つです。
2)は1)の式3の値を1に固定したものです。
FOR、NEXTはBASICをさわったことがある人ならば大抵は理解していることと思います。
説明文にはときどきTBIという語が出てきて、最初はなんじゃいなと思ったのですが、これはTiny Basic Interpreterの略のようです。
FOR文では最初にVAR(変数)=EXP1(式)を解読します。
VARは変数A〜Zと配列変数@(n)です。
式の値を計算してその値を変数に初期値として与えます。
式2は変数値の上限(リミット)で式3は刻み値です。
これらの値とFOR文の行の位置アドレスなどが’FOR’変数領域にセットされます。
’FOR’変数領域は、
LOPVAR
LOPINC
LOPLMT
LOPLN
LOPPT
の各2バイト合計10バイトの領域です。
もしこれらの領域がすでに使われていたら(そのことはLOPVARの値が0でないことで判断されます)、新しい値で上書きする前に、その領域の以前の値をスタックに保存します。

その次の、
TBI WILL THEN DIG...
を読んで、実はちょっと驚きました。
これはすごいです。
TINYといいながらこんなことをやっているなんて全然’TINY’なんかじゃありません。

TINY BASIC インタプリタはFORの変数領域に値をセットするときに、スタックをサーチして同じ変数名がすでに使われていないかどうかを調べます。
原文では、
IN ANOTHER CURRENTLY ACTIVE ’FOR’ LOOP
と書いてあります。
「現在アクティブなFORループで」とでも訳しましょうか、既にNEXTを抜けて完結してしまったFORループは無関係です。
多重ループになっているFORループの中で同じ変数が使われていると、期待した通りの動作になりません。
それを避けるために同じ変数名が使われていないかどうかを調べます。
もしも同じ変数名がみつかった場合には古い変数名のFORループを強制的に閉じてしまいます(古いほうのFOR変数領域をスタックから取り除いてしまいます)。
以下簡単な例で考えてみます。

10 FOR A=10 TO 15
20 FOR A=3 to 7
30 PRINT A,
40 NEXT A
50 NEXT A

このプログラムに問題があることはすぐにわかると思います。
20 FOR B=3 TO 7
および
40 NEXT B
とすれば問題はありません。

10で初期値10をセットしたAの値は50で+1される以外は変更されないことが前提です。
ところが上の例では20でAに3が再設定されてしまいます。
20〜30のループを抜けるとA=7になってしまいます。
これではいつになっても50のNEXT文から抜け出せません。
上記の説明文はこのことを指しています。

TINY BASICのすごいところはFOR文の解読の時点でこの問題を回避するための工夫をしているところです。
もっともプログラム自体が間違っていますから、結局のところエラーメッセージで終ってしまうことにはなるのですが、エラー表示が出ることなく「間違っているプログラム」が実行されてしまうことに比べればはるかに高等なインタプリタです。
実は白状しますと、TINY BASICでこんなことをやっているなんて、今まで全く考えたこともありませんでした。

その昔に私は雑誌に掲載されたTINY BASICのバイナリリストを自作マシンに打ち込んで動作させたことがきっかけで、そのプログラムに機能を追加していくことでオリジナルのBASICインタプリタを作り上げてきました。
ですから現在の自前のBASICインタプリタは浮動小数点演算もできる大きなサイズにまでなっていますが、その昔のTINY BASICの仕組みはそのまま残っています。
しかし上記の説明文にあるFOR文のプログラムはなにをやっているのかということ自体を理解することが難しいプログラムです。
当時はこんなに丁寧な解説文までついたソースプログラムリストなど入手できるはずもなく、雑誌に掲載された16進コードだけのダンプリストとおそらく同時に掲載された簡単な解説文だけが頼りでしたから、TINYとはいうものの、その動作を解読するのはなかなかに困難な作業でした。
おそらく当時の私のプログラム技術と知識では上記のプログラム部分の動作は理解できなかったのではないかと思います。
なにしろ遠い昔のことですから記憶の痕跡すら残っていませんが、おそらくは「なにをやっているのかさっぱりわからんが、面倒なのでここは外してしまおう」と考えたのではないかと思います。

上記のプログラム例をTINY BASICで実行するとWHAT?が表示されます。


ZB3BASICではエラーにならず無限ループになってしまいます。


これはもう素直に、脱帽、です。

このあとNEXTの説明をするつもりでしたが、本日は時間がなくなってしまいました。
NEXTについては次回で説明します。

復活!TINY BASIC[第52回]
2020.7.31upload

前へ
次へ
ホームページトップへ戻る