構造を微修正

TinyBASICをC言語で書き直そうと決めたとき、これから起きそうな問題を徹底的に洗い出し、対策をとったつもりでいたが、作業が進むにつれ、やはりほころびが見えてきた。中間言語の実行で行の終端を越えないようにする処理が美しくまとまらない。いちおう1行分の中間コードの先頭に1行の長さを記録してあるのだが、行番号があるかないか、すなわちリストを実行するかコマンドとして直接実行するかで中間コードの先頭からの位置が異なり、処理を区別しなければならない。

1行の長さがわかったところで、ポインタをひとつ進めるたびに検査をするというのは非効率極まりない。たとえば、構文解析は数式に矛盾がない限り数式が続くと判断してポインタを進めているが(だから次の行の長さが何かの中間コードと一致したとき行をまたいで進んでしまう)、これをいちいち確認するということになると大変な手間で、合理性を欠き、実行速度を大幅に落とす。BASICだから実行速度が遅いのはしかたがないとしても合理性を欠いた処理で遅いことは容認しがたい。

そこで今は1行の末尾に0xffを置こうかと考えている。0xffはどの中間言語とも一致しないのでポインタがこれを超えて勝手に進んでしまうことがない。これを必ずしも名案だと思わないのは、1行を区別するために先頭の「長さ」と末尾の「区切り」を使うのがある種の重複となり、やはり美しいとはいえないからだ。しかし、次善の策ではある。

この方法の効果をあげるため終端の空白は削除することにした。つまり中間コードが終わったらすぐ0xffがくるようにする。いままでは終端の空白を残しておけば何かメリットがあるかもしれないと考えていた。たとえば、行番号だけを入力した場合(既存の同一行番号を削除する)と区別して何かの働きをさせる(行番号だけの行を保存する)とか。しかし、実際たいした働きはしないようだ。作業が進むにつれて明らかになるものは、ほころびだけではない。

広告
カテゴリー: TinyBASIC パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中