2006/01/26(木)05:07
8bitパソコン時代のBASIC
JR-100という1981年に発売されたナショナルのパソコン(時代的にはマイコンと言った方が相応しいが)のエミュレータを作ってます。
ROMデータを吸い上げなくてもだれでも使えるように、ユーザーズガイドに載っている外部仕様を満たすように一から作っているのですが、実機では少々の文法違反でも許容してしまうのが悩みの種です。
使う側にとっては融通が効いていいのかもしれませんが…。
文法違反許容の例: 予約語が空白を含んでいても良い。
例えば"PRINT"も"P R I N T"もエラーとならない。
→入力文字列をトークンに分割する処理が複雑になって困る。
FOR文が入れ子になってなくても良い。
一般的にはFOR文は入れ子になっていないとスタックオーバーフローになって実行が停止するが、JR-100のBASICでは次のようなプログラムが正常動作する。
10 FOR I=1 TO 100
20 FOR J=1 TO 100
30 GOTO 50
40 NEXT J
50 NEXT I
このままだとJループの状態がスタックに積まれ続けるためいずれオーバーフローするはずだがしない。
→NEXT文の処理で特別な処理をする必要がある。
IF文が文法違反の形式を受け付ける。
JR-100のBASICでのIF文の文法は以下です。IF 条件式 [THEN] 文の並びTHENは省略可能。
ところがTHENの後ろの文の並びの部分で数値定数を書くことができ、その場合はGOTO文が省略されていると見なされる。例えば"IF A=0 10"は"IF A=0 THEN GOTO 10"と等価となる。
→IF文を文法解析するときに特別な処理が必要となる。
コンパイラを作ったことがある人は分かると思いますが、IF 式 [THEN] 式という文法を作れば追加したくなりますがそれは間違い。
"IF A=0 THEN B=C"という文を解析しようとすると、Bというトークンを読み込んだ時点で、これがGOTO文を省略したものか代入文の左辺なのかが区別できない。したがってTHENの後ろは数値定数でなければならない。
他にもまだ知らない落とし穴があるかもしれません。
現代的なプログラミング言語の理論から見るとちょっとルーズですが、当時はユーザ視点に立った(立ちすぎた)プログラムが作れたわけで、ある意味では幸せだったのかもしれません。
プログラミング可能なメモリ領域も16KBと非常に限られてましたし、1行も72文字以内という制限もあり、仕方なかったという面もあります。
もっとも、エミュ作者としては淡々と機能を実装していくのみです。