古いBASIC(およびおそらく他の言語)がソースコードの一部として行番号を使用したのはなぜですか?
つまり、どのような問題を解決しようとしたのですか?
古いBASIC(およびおそらく他の言語)がソースコードの一部として行番号を使用したのはなぜですか?
つまり、どのような問題を解決しようとしたのですか?
回答:
BASICは、その初期言語である初期のfortran、cobol、およびassemblyのコンテキストに組み込む必要があります。
ラベルなしで6502アセンブリ を軽くたたいたとき、これは、密集したコードの途中で命令を追加する必要があることがわかったとき(後でNOPを追加しました)、すべてのジャンプをやり直す必要があることを意味しましたアドレス。これには時間がかかりました。
Fortranは、BASICより前の行番号ベースのシステムでした。Fortranでは、列1〜5は分岐のターゲットに使用される行番号でした。Fortranの重要な点は、コンパイラーがBASICインタープリターよりも少しインテリジェントになる傾向があり、いくつかの命令を追加することは、いくつかのカードをパンチし、それらを適切な場所のデッキに入れるだけのことでした。
一方、BASICは、すべての命令を順序付けする必要がありました。「前の行の継続」という概念はあまりありませんでした。代わりに、Applesoft BASIC(私がよく知っている情報を見つけることができる広く使用されている方言の1つ)では、メモリ内の各行は次のように表されました。
NN NN TT TT AA BB CC DD .. .. 00
次の行のアドレス(NN NN
)に2バイトありました。この行の行番号(TT TT
)に2バイト、次にトークンのリスト(AA BB CC DD .. ..
)の後に行末マーカー(00
)が続きます。(これはInside the Apple // eの84-88ページからです)
そのメモリ表現を見たときに気付く重要な点は、行をメモリ内に順不同で保存できることです。メモリの構造は、構造内に「次の行」ポインタを持つリンクリストの構造でした。これにより、2行の間に新しい行を簡単に追加できましたが、適切に機能するように各行に番号を付ける必要がありました。
多くの場合、BASICで作業するとき、実際には BASIC自体で作業していました。特に、指定された文字列は、行番号とBASIC命令、または基本インタープリターへのコマンドRUN
またはのいずれかLIST
でした。これにより、コードとコマンドを簡単に区別できました。すべてのコードは数字で始まります。
これらの2つの情報は、数字が使用された理由を特定します。16ビットで多くの情報を取得できます。文字列ベースのラベルはより多くのスペースを必要とし、注文するのが難しくなります。数字は扱いやすく、理解しやすく、表現しやすいです。
あなたがいなかった後にBASICの方言で通訳のすべての時間は、すべての行に番号、代わりにのみ分岐ターゲットした行に番号を付ける必要と離れて行うことができました。実際には、ラベル。
] PRINT "FOO"
は、すぐにBASICインタープリターによって実行されました。声明です。後で実行したい場合は] 10 PRINT "FOO"
、それからを実行します] RUN
。AppleSoft BASIC環境では、すべてのBASICステートメントをすぐに実行するか遅延させることができます。DOSによって提供された有効なBASICステートメントではないコマンドはごくわずかでした。現在のステートメントと後のステートメントの区別は、行番号でした。対応する行番号を再入力して、遅延ステートメントを変更することもできます。1行に複数のステートメントを配置することもできます:
初期のマイクロコンピューターでは、編集は行ベースでした。ソースコード内を自由に動き回って編集することはできませんでした。画面の一番下には、コマンドを入力してコードを入力できる単一行がありました。画面の残りの部分は、読み取り専用のコードリストとコマンド出力でした。「EDIT 90
」と書いたプログラムの90行目を編集する場合、行の内容が90
1行の編集バッファーに入ります。行を編集してEnterキーを押すと、プログラムリストが更新されました。そのため、プログラムを編集するには行番号が必要でした。
コードエディタがより高度になり、コードリスト内でカーソルを移動できるようになったとき、行番号は必要なくなりました。
80年代の8ビットの家庭用マイクロコンピューターのBASIC方言を考えているなら、それらのコンピューターにはテキストエディターがありません(ワードプロセッサアプリケーションを購入していない限り)。今日のプログラミングのように、BASICプログラムのソースコード全体を「エディタで開く」方法はありませんでした。プログラマーは、プログラムをソースコードファイル、またはテキストと実際に考えることすらありません。
したがって、頭に行番号のない単純なプログラムがあるとします。
FOR I=1 TO 42
PRINT I
NEXT I
コンピューターを起動します。「準備完了」などのプロンプトがあり、次の行にカーソルがあります。これは、今日のさまざまなスクリプト言語のREPL環境によく似ていますが、実際には厳密に行ベースではなく、画面ベースに似ています。したがって、今日のREPLとはまったく異なりますが、近いものです。
ここで、プログラムの入力を開始すると、BASICインタープリターがすぐに実行(および忘れ)ようとし、ループを終了するNEXTなしでは意味がないため、最初の行の後にエラーが発生する場合があります。これは、テキストを編集するテキストエディターではなく、コンピューターにコマンドを与える場所です。
だから、あなたはこれをプログラム行であると言う何らかの方法が必要です、それを保存してください!特別なコマンドや、ちょっと、これはプログラムの行で、それを保存することを伝えるシンボルを持っているかもしれません。これを想像してみましょう:
#FOR I=1 TO 42
#PRINT I
#NEXT I
わかりました、今私達の想像上のBASICインタプリタはプログラムを保存し、それを実行できます。しかし、今度はPRINT行を編集します。どうやってやるの?テキストエディタを使用していないため、カーソルを行に移動して編集することはできません。またはLET COUNT=COUNT+1
、ループのように別の行を追加します。新しい行を挿入する場所をどのように示しますか?
行番号を使用すると、かなりわかりにくい場合でも、非常に簡単にこれを解決できます。すでに存在する番号のプログラム行を入力すると、古い行が置き換えられます。カーソルを画面上のプログラムリストに移動し、画面上の行を編集してEnterキーを押すだけで保存できるため、画面ベースのREPL環境が便利になりました。これは、実際に画面上のテキストを編集してから、画面全体を新しい行で置き換えているときに、行を編集しているように見えます。また、間に未使用の番号を残しておくと、新しい行の挿入が簡単になります。実証するには:
10 FOR I=1 TO 42
20 PRINT I
30 NEXT I
変更を加えて行20を再入力し、新しい行を追加すると、
5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I
少なくともGOTO
AND GOSUB
コマンドのターゲットとして、行番号を言語構造として使用できるという利点(または有名なBASICスパゲッティコードを有効にするための呪い)があります。これはラベルに置き換えることができますが、行番号を使用すると、BASICインタープリターに実装するのがはるかに簡単になります。
さらに重要なことは、ユーザーエクスペリエンスの観点からすると、行番号はコードを編集するための驚くほど簡単で完全なインターフェイスです。新しいコードを挿入するには、数字で始まる行を入力するだけです。LIST 100-200
行100〜200を表示するために使用します。行を編集するには、画面上にリストし、画面上のテキストを編集して、行を再入力します。行を削除するには、空になるように編集します。これは単に行番号を付け、その後に何も付けないことです。これを説明する1つの段落。DOSのedlinやUnixのedまたはexのような古いテキストエディターの使用を説明しようと比較してください。
他の回答では、行番号がどのようになったかを説明しています。ここでカバーしようとしているのは、なぜ行番号が生き残ったのか、実際の問題をどのように解決し続けたのか:実際のエディターなしで実際のプログラミングを非常に簡単な方法で行う方法を提供しました。適切で使いやすいフルスクリーンテキストエディタがコードを編集する主流の方法になりました。ハードウェアの制限がなくなり、新しいものに適応する人々のwas性が克服されると、行番号ベースのBASIC方言は使用からすぐに消えました。彼らが解決した核となるユーザビリティの問題はもはや問題ではありませんでした。
Basicが開発された場所と時代において、利用可能な最高のI / Oデバイスはテレタイプでした。プログラムの編集は、プログラム全体またはその興味深い部分のリストを(紙に)印刷してから、置換行と行番号を入力することによって行われました。
また、デフォルトの行番号が10であるため、既存の行間に未使用の番号が存在することにもなります。
ren
番号を変更するための ' 'コマンドがありました。典型的な呼び出しはしたren 10, 10
10ずつ増加、10から始まる番号を付け直す( - 1だけで入力した場合、デフォルトの動作ren
ザgoto
とgosub
とthen (linenumber)
。コマンドは自動的に更新されるだろう。しかし、これは間違いなく最も初期の基本では使用できませんでしたが、IIRCは、アップルで利用可能でした。整数ベーシック、Applesoft FPベーシック、TIベーシック/拡張ベーシック、MSベーシック/ GWベーシックなど
「行番号」とは、いくつかの異なることを意味します。
まず、「線」の概念は永遠に存在しているわけではないことに留意してください。この時代の多くのプログラミング言語はパンチカードを使用し、シーケンス番号(通常はカードの最後の数列)を使用することで、ドロップした場合やカードリーダーで何かひどいことが起こった場合に適切な順序でデッキを復元できました。これを自動的に行うマシンがありました。
GOTO
ステートメントのターゲットとして使用する行番号は、まったく異なる概念です。FORTRAN IVでは、これらはオプションであり、ステートメントの前にありました(1から5列目)。自由形式のラベルよりも実装が簡単であることに加えて、計算および割り当てられたGOTOの概念もあり、任意の行番号にジャンプすることができました。これは、ほとんどの現代のプログラミング言語にはないものですが(switch
ステートメントは近づいてきましたが)、アセンブラープログラマーにとってはおなじみのトリックでした。
BASICはFORTRANから派生したものであり、実装と理解をより簡単にすることを目的としていたため、すべての「行」に行番号を付けること(順序付けおよびGOTO
/ GOSUB
ステートメントのターゲットとして)は、おそらくそのための設計上の決定でした。
goto array_of_labels[some_computation()];
GOTO
(またはASSIGN
)および元の別名算術別名スリーウェイIF
、および(まれに使用される)の代替リターンCALL
、およびDO
、およびFORMAT
ステートメントのターゲットの並べ替え(おそらく区切り文字)が必要です。他のステートメントでは、それらはオプションでした。
GOTO 1000+N*100
を使用すると、switch
ステートメントをエミュレートするように記述できます。
各行の1〜6列目に行番号を使用するCOBOLでプログラミングを開始しました。1970年代にはIDEがなかったため、すべてがパンチカードを介して行われ、元のソースのどの行が置き換えられ、どの新しい行が追加されたかを識別するために行番号が使用されました。以前は、行を追加する余地を与えるために、行番号を100ずつ増やしていました。
BASICは、ラインターミナル時代のFORTRANよりも遅れて登場しました。カードのデッキよりもインタラクティブなread-exe-print-loop環境が特徴でした。
BASICで、24文字を保持する1行のディスプレイでプログラムすることを学びました。行番号は、行を編集するか他の行に挿入するかに関係なく、行の移動先を指定する自然な方法でした。
私はあなたがそれを他にどのようにするのか本当に想像できません。