web-dev-qa-db-ja.com

BASICが行番号を使用したのはなぜですか?

なぜ古いBASIC(そして多分他の言語)がソースコードの一部として行番号を使用したのですか?

つまり、それはどのような問題を解決しようとしましたか?

96
DerMike

BASICは、初期のFortran、Cobol、Assemblyなどの現代言語との関連で考慮する必要があります。

私が 6502アセンブリに手を出すなしだったとき、これは、どこかに命令を追加する必要があることがわかったときに、密にパックされたコード(後で追加しました [〜#〜] nop [〜#〜] s)の途中で、すべてのジャンプアドレスを調べてやり直す必要がありました。これには時間がかかりました。

Fortranは、BASICより前の、行番号付きのシステムでした。 Fortranでは、列1から5は分岐のターゲットに使用される行番号でした。 Fortranの重要な点は、コンパイラーはBASICインタープリターよりも少しインテリジェントになる傾向があり、いくつかの命令を追加することは、いくつかのカードをパンチして正しい場所のデッキに配置することの問題でした。

一方、BASICは、すべての命令を順序どおりに維持する必要がありました。 「前のラインの継続」というコンセプトはあまりありませんでした。代わりに、Applesoft BASIC(私が精通していて情報を見つけることができる、広く使用されている方言の1つ)では、メモリ内の各行は次のように表されていました。

NN NN   TT TT   AA BB CC DD .. .. 00

次の行のアドレス用に2バイトありました(NN NN)。この行の行番号の2バイト(TT TT)、次にトークンのリスト(AA BB CC DD .. ..)に続いて行末マーカー(00)。 (これは 内部のApple // e の84-88ページからです))

そのメモリ表現を見るときに理解する重要なポイントは、行がメモリに順不同で格納される可能性があることです。メモリの構造は、構造内に「次の行」のポインタを持つリンクリストの構造でした。これにより、2行の間に新しい行を追加するのが簡単になりましたが、正しく機能するには、各行に番号を付ける必要がありました。

BASICを使用する場合、何度もBASIC自体をinで使用していました。特に、指定された文字列は、行番号とBASIC命令、またはRUNまたはLISTへの基本インタープリターへのコマンドのいずれかでした。これにより、コードとコマンドを簡単に区別できるようになりました。すべてのコードは数字で始まります。

これらの2つの情報は、数値が使用された理由を示しています。16ビットで多くの情報を取得できます。文字列ベースのラベルは、より多くのスペースを必要とし、注文が難しくなります。数値は扱いやすく、理解しやすく、表現しやすいです。

inでなかった後のBASIC方言は、常にすべての行に番号が付けられ、代わりに行に番号を付けるだけで済みましたブランチターゲットでした。実際には、ラベル。

130
user40980

初期のマイクロコンピュータでは、編集はラインベースでした。ソースコード内を自由に移動して編集することはできません。画面の下部にコマンドを入力してコードを入力できる1行がありました。画面の残りの部分は、読み取り専用のコードリストとコマンド出力でした。プログラムの90行目を編集したい場合は、 "EDIT 90"と記述し、90行の内容が単一行編集バッファーに入りました。 Enterキーを押した行を編集すると、プログラムリストが更新されます。したがって、プログラムを編集できるようにするには、行番号が必要でした。

コードエディターがより高度になり、コードリスト内でカーソルを移動できるようになったとき、行番号は必要なくなりました。

50
JacquesB

80年代の8ビットホームマイクロコンピュータの基本的な方言を考えている場合、それらのコンピュータにはテキストエディタがありませんでした(ワードプロセッサアプリケーションを購入した場合を除く)。今日のプログラミングのように、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のような別の行を追加したいとします。新しい行を挿入する場所をどのように指定しますか?

実用的なソリューション

行番号はこれを非常に簡単な方法で解決します。すでに存在する番号でプログラム行を入力すると、古い行が置き換えられます。画面ベースのREPL環境が便利になります。画面上でカーソルをプログラムlistingに移動し、行を編集するだけなのでon screen ENTERを押して保存します。これは、実際には画面上のテキストを編集していて、画面全体の行全体を新しい行に置き換えるときに行を編集しているようです。また、未使用の数字を残しておくと、新しい行の挿入が簡単になります例を示します。

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スパゲッティコードを有効にするための呪い)があります。これはラベルで置き換えることができますが、80年代の典型的な8ビットホームコンピューターでは、BASICインタープリターで行番号を使用するほうがはるかに簡単に実装できます。

さらに重要なことに、ユーザーエクスペリエンスの観点から見ると、行番号は驚くほど簡単ですが、コードを編集するための完全なインターフェイスです。新しいコードを挿入するには、数字で始まる行を入力するだけです。 LIST 100-200を使用して、100〜200行目を表示します。行を編集するには、画面上で行をリストし、画面上でテキストを編集して、行を再入力します。行を削除するには、行を編集して空にします。つまり、行番号の後に何もないようにします。これを説明する1つの段落。 DOSのedlinまたはUnixのedまたはexのような古いテキストエディターの使用を説明しようと比較してください。 )誤って開始した場合に、ユーザーがそれらを終了する方法を説明するだけです!

結論

他の回答は行番号がどのようになったかを説明しています。ここで取り上げるのは、行番号が存続する限りなぜ存続するのか、実際の問題を解決し続ける方法です。実際のエディターを使用せずに、非常に単純な方法で実際のプログラミングを行う方法を提供しました。かつて適切で使いやすいフルスクリーンのテキストエディターがコードを編集するための主流の方法になり、ハードウェアの制限がなくなり、人々が新しいことに適応する慣性が克服されると、行番号ベースのBASIC方言が使用からすぐに消えました。彼らが解決した中心的なユーザビリティ問題はもはや問題ではありませんでした。

45
hyde

Basicが開発された場所と時代では、利用可能な最良のI/Oデバイスはテレタイプでした。プログラムの編集は、プログラム全体またはプログラムの興味深い部分のリストを(紙に)印刷し、次に置換行を行番号で入力することによって行われました。

そのため、デフォルトの行番号は10でしたので、既存の行の間に未使用の番号がありました。

17
ddyer

「行番号」はいくつかの異なることを意味します。

まず第一に、「線」の概念は永遠に存在していないことを覚えておいてください。この時代の多くのプログラミング言語は、パンチカードを使用し、シーケンス番号を持っています(通常、カードの最後の数列)は、デッキを落としたり、カードリーダーでひどいことが起こったりした場合に、正しい順序でデッキを回復するのに役立ちました。これを自動的に行うマシンがありました。

GOTOステートメントのターゲットとして使用する行番号は、まったく異なる概念です。 FORTRAN IVでは、これらはオプションであり、ステートメントの前にあります(列1〜5)。自由形式のラベルよりも実装が簡単であることに加えて、任意の行番号にジャンプできる 計算され割り当てられたGOTO の概念もありました。これは、ほとんどの最近のプログラミング言語にはないものですが(switchステートメントが近づいていますが)、アセンブラープログラマーにはおなじみのトリックでした。

BASICはFORTRANから派生したものであり、実装と理解がより簡単になるように意図されているため、すべての「行」に行番号を付ける必要があります(シーケンス処理とGOTO/GOSUBの両方の対象として)ステートメント)は、おそらくそのために行われた設計上の決定でした。

13
Mike Harris

各行の列1〜6の行番号を使用するCOBOLでプログラミングを始めました。 1970年代にはIDEがなかったため、すべてパンチされたカードを介して行われ、元のソースのどの行が置き換えられ、どの新しい行が追加されるかを識別するために行番号が使用されました。以前は、行番号を100ずつ増やして、行を追加する余地を与えていました。

6
Keith Miller

BASICは、FORTRANよりも後に、回線端末の時代に登場しました。カードのデッキよりもインタラクティブなread-exe-print-loop環境が特徴でした。

私は、BASICで、24文字を保持する1行表示でプログラムすることを学びました。行番号は、1つの行を編集する場合でも、他の行の間に挿入する場合でも、行の移動先を指定する自然な方法でした。

あなたが他にどのようにするのか、私には本当に想像できません。

5
JDługosz

Dartmouth Time Sharing Systemはテレタイプインターフェイスを使用していました。したがって、コマンドベースのインターフェースを使用していました。元々、行番号はプログラムを編集する手段として使用されていました。行番号を使用して、挿入、置換、または削除できます。初期のバージョンではgotoステートメントに行番号が使用されていたようには見えませんが、これは後で言語に追加されたものです。

1
C. Fugate

まだ誰も言及していない点の1つは、分岐ターゲットが明示的であるプログラムフローについて、初心者が推論する方が簡単であることです。したがって、BEGIN/ENDステートメント(または使用されているブロック区切り文字)を一致させる(ネストする可能性がある)必要はなく、制御フローがどこに行くのかは明らかでした。これはおそらく、BASICのターゲットオーディエンスが与えられたときに役立つでしょう(結局のところBeginner's汎用シンボリック命令コードです)。

1
TMN