行番号の発明とスクリーンエディタ
レトロPCではインタプリタで使われたBASICですが、元々は大型機でラインエディタでコードを書き、コンパイルして走らせるものだったようです。
BASIC
FORTRANの影響を受けているのは確かですが、FORTRANの行番号は、今で言うところのラベルで、数字がユニークであれば大小は無関係で、すべての行に必要でもありません。
ここから先は
の続きですが、もう少し掘り下げてみます。
BASICでは行番号がある行はプログラムとして格納され、ない場合は、その場ですぐに実行されるという解釈がなされることとなりました。格納されたプログラムは、この行番号の小さな行から順に実行され、実際に入力した順序とは無関係でした。
行番号として1から順に隙間ない番号を使うと、途中に行を挿入したい時に方法がありません。そこで普通は10から10ずつ増やした行番号を使うことが一般的でした。こうしておけば、行番号10の行と、行番号20の行の間に、新しい行を追加したければ行番号を15にすれば良いのです。
適切な行番号を打ち込むのも面倒だったのか、多くのBASICにはAUTOコマンドがあります。これを実行すると、新しい行を入力する際に自動的に適切な行番号を予め入力した状態にしてくれます。行番号10の行の入力を終えてRETURNキーを打つと、次の行には予め20が打ち込まれているという具合です。
よく考えるとなかなか泥縄式な方法でもあるのですが、これで十分なことが殆でした。しかしメモリも増えて大きなプログラムを扱うようになると、もう隙間の数字が無いよということにもなるので、最初はプログラムを使って行番号を付け替えていましたが、BASIC自身にRENUMコマンドが用意されて、いつでも行番号を付け替えることができるようになったんですね。
当時、BASICを使っていた人にとっては「当たり前」のことばかりですが、BASICですら、今は行番号を使うことは無くなってしまったので、知らない人は「なんじゃこりゃ」ではないかと思います。
BASIC自身が持っていたスクリーンエディタは、カーソルを上下左右に動かしつつ、画面上の文字列を行番号を基準に判断しつつ、RETURNキーを押すたびに、カーソルのある行をメモリに取り込んでいたのです。人間の方は、ちゃんと入力されているか確かめるために、ときおりLISTコマンドを実行しつつ。何せ画面上の順序は実行順序では無いので、行番号を変えたりすると、上から順に走るわけではありませんから。
これを「悪用」した例を、知り合いの方から指摘され思い出しました。毎年エープリフル特集で出していた月刊ASCIIのパロディー版AhSKI!に記載された「アーストレック」のBASICソースコードです。行の長さでソートし三角形になったところで折り返して四角く詰め込んだ「最密充填リスト」というのを載せたのでした。このリストの通りに入力すれば、理論上は正しく動くのですが、入力を間違った場合、間違った部分がリストのどこにあるのか探すのが、とても大変でした。何せ紙に印刷してあるのですから。
Ah!Ski の想い出
この行番号ですが、もちろんプログラムの実行順序だけではなくて、実行順序を変更するIF文、GOTO文、GOSUB文などの飛び先としてラベルのようにも使われます。特に既にあるプログラムを修正するときなどに、これらを駆使して実行順序をあちらこちらに無秩序に変えられるので「スパゲッティ・プログラム」と称される、とても読みにくいコードが実に多く書かれました。この反省もあって「構造化」という概念が提唱され、独立したテキスト・エディタというプログラムでコードが書かれるようになると、行番号は駆逐されていきました。
確かに当時であっても、プログラムが300行を超えるようになると、飛び先としての行番号の管理が頭のバッファ容量を超えてくるので、番号ではなく意味のある名前が欲しくなりました。飛び先になる行にはコメント文で意味は書いておくのですけどね。
そこでDOSでテキスト・エディタが使えるようになった途端に、さっそく自分でアルファベットのラベルが使え、各行に番号を書いていないBASICコードからインタプリタで実行できる行番号付きのコードを出力するトランスレータを書きました。あまりに便利だったので、当時のBASICではサポートされていないIF文のELSE節を拡張したりしていたのですが、逆トランスレータまでは用意しなかったので、バグを見つけた時に元に戻って修正せずに、後から困ったこともありました。まあCでコンパイルして見つけたバグを機械語レベルでパッチしていたようなものです。このトランスレータはMS-DOSの時代まで直しながら愛用しました。ですからQuickBASICが出たときには、もう、そちらの世界への移行が済んでいたわけです。
戻りますが、初期のBASICはGOSUB文などで制御を移す時に、プログラムの先頭から飛び先を検索するので、小さな行番号のほうが速く飛べるということで、サブルーチンを先頭に集めるなんていうことも流行りました。これは後にインタプリタが進化し、一度見つけた飛び先は中間言語のレベルで記憶して飛び先を検索しないで済むようになったので、あまり有効ではなくなるのですが、習慣はなかなか変わらなかったようです。いずれにせよサブルーチンを活用するためには、被らない行番号に付け替えたり、ローカル変数が無いので、こちらも被らないようにする作業が大変でした。元々が「簡易な」言語として作られたので、プログラムが大規模になるにつれて、いろいろ綻びが出ていたのですが、BASICしか知らない人が多かったので、芸術的な大規模なプログラムが蔓延りました。私はトランスレータで逃げたり他の言語に行ってしまいましたが。
BASICにまつわる話は数限りないです。Microsoftはお里がBASICの会社なので、今のC#も、この進化の系列にいます。そのあたり(ActiveXとかね)であるとか、そうそう、それとは別に JIS BASIC の話題も書いておきたいですね。
[おまけ]
Ah!SKIを振り返る
ヘッダ写真は、奇跡的に残っていた高校生の時のプログラミング風景を映した動画からのキャプチャ。行番号の桁数が多いです:-)。
この記事が気に入ったらサポートをしてみませんか?