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


95

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

つまり、どのような問題を解決しようとしたのですか?


27
すでに本格的な研究を行っている場合は、コメント内にその情報を埋めないで、質問を適宜編集してください。また、Googleが直接ここに連れて行ってくれました:stackoverflow.com/questions/541421/...とここstackoverflow.com/questions/2435488/...
ドク・ブラウン

13
答えはすでにstackoverflowにあるため、私はこの質問をトピック外として閉じることを投票しています。
アンドレスF.

6
Applesoft BASICは、私が学んだ最初のプログラミング言語でした。Pascalには行番号がないと聞いたのを覚えていますが、「行番号なしでGOTOを実行するにはどうすればよいですか?それはどのように機能しますか?」
イェンスシャウダー

14
おかしい、前回チェックしたときに、質問が他のサイトのコンテンツではなく、そのコンテンツに基づいたトピックに関するものかどうかを判断していました(そしておそらくそこにある答え)。
マシューロック

回答:


130

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の方言通訳のすべての時間は、すべての行に番号、代わりにのみ分岐ターゲットした行に番号を付ける必要と離れて行うことができました。実際には、ラベル。


3
良いグレービー、ミニアセンブラーを忘れてしまいました。それは思い出を呼び戻す
Blrfl

3
@Blrflメモリが役立つ場合...はい] CALL -936 * F666 G $ ... 、FPは基本的に基本です。

3
いいえ、それラインエディタでした。コマンドは、行番号がないことで識別されました。ステートメントの前に行番号を付けて、ステートメントであることを示し、行った行および/または上書きした行を示します。これは、BASICの組み込みのラインエディター部分であり、別個のツールや環境ではありませんでした。
–RBarryYoung

3
@RBarryYoung ] PRINT "FOO"は、すぐにBASICインタープリターによって実行されました。声明です。後で実行したい場合は] 10 PRINT "FOO"、それからを実行します] RUN。AppleSoft BASIC環境では、すべてのBASICステートメントをすぐに実行するか遅延させることができます。DOSによって提供された有効なBASICステートメントではないコマンドはごくわずかでした。現在のステートメントと後のステートメントの区別は、行番号でした。対応する行番号を再入力して、遅延ステートメントを変更することもできます。1行に複数のステートメントを配置することもできます:

4
Wikipediaの記事(en.wikipedia.org/wiki/Dartmouth_BASIC)に記載されているように、「DTSS(Dartmouth Time Sharing System)は、初期の...対話型コマンドラインインターフェイスを実装しました。...行番号で始まる行は、プログラムは、以前に保存された行を同じ番号に置き換えます;他のすべてはDTSSコマンドであると想定され、すぐに実行されました。...この編集方法は、Dartmouth Timesharingシステムの端末ユニットとしてテレプリンターを使用するため必要でした。 "
-RBarryYoung

50

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

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


38
行を編集しますか?ぜいたく!最初に使用したBASICを使用して、行全体を再入力しました。サブルーチンの番号を付け直さなければならなかったとき、それは本当にひどいものでした。
TMN

48
画面?どの画面?私の最初のベーシックでは、「スクリーン」はロール紙でした。
-ddyer

18
@ddyer:私はかつて紙のロールを夢見ていました!すべての私たちが持っていたが、電極の束でした。仕事が行われることになっている夕方には、プログラムが正しく機能するかどうかを確認するために、一列に並び、感電した人を観察する必要があります。... —真剣に、私は人々が実際に当時の作業プログラムを書き戻すことができたことにwest敬の念を抱いています。
16

26
電気!血まみれの贅沢。当社は、花崗岩で私たちのコマンドを彫るために使用される
マイケル・デュラント

10
@TMN&ddyer OK、あなたはどちらもこれがどこに向かっているのか知っていますか?;-D ==> dilbert.com/strip/1992-09-08 ==> imgs.xkcd.com/comics/real_programmers.png
Baard Kopperud

45

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

解決したばかりのその他の問題

少なくともGOTOAND GOSUBコマンドのターゲットとして、行番号を言語構造として使用できるという利点(または有名なBASICスパゲッティコードを有効にするための呪い)があります。これはラベルに置き換えることができますが、行番号を使用すると、BASICインタープリターに実装するのがはるかに簡単になります。

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

結論

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


4
あなたはそれを打ちました。ttyや1行を印刷するだけでなく複数行の画面を使用すると簡単になりますが、ソースファイルの概念がなくても行指向のままです。
JDługosz

ただし、システムが8ビットアーキテクチャであるという事実は、実際には制限要因ではありません。さて、システムはRAMとROMのキロバイトの一握りのわずか数キロバイトを持ち、そして可能性もなし永続ストレージ(あなたcasetteテープレコーダが壊れた場合)...かもしれないという事実
からCVn

テキストエディターなしでコーディングを想像するのはまだ難しい
-phuclv

@LưuVĩnhPhúcまあ、ほぼすべての8ビットホームコンピューター、またはMSDOSとdosboxを備えたGWBASICなど、「本物」を実行するためのエミュレーターはたくさんあります。ただ、一例として、あなたは多くのC64エミュレータの1を得ることができ、その後、Googleが検索したPDFとしてのユーザーズガイド :-)
ハイド

1
@phuclv-現在、テキストエディタなしのコーディングは想像しにくい。当時は、テキストエディタを使用して保存し、実行する前にコンパイルしなければならないという不便さを想像するのは困難でした。それが実際にPCの世界にやってきました。PascalとC。両方ともコンパイルされた言語で、どちらもテキストエディターで自由に編集でき、どちらもプログラミング環境ではありません(BASICはプログラミング環境とランタイム環境の両方でした)。パスカルは私の次の言語であり、多くの点で非常に自由でした。間違いなくより強力です。しかし、他の方法では、少しスリルがありません。
DavidO

17

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

また、デフォルトの行番号が10であるため、既存の行間に未使用の番号が存在することにもなります。


1
実際、カードリーダー(キーパンチを伴う)とラインプリンターはテレプリンターよりも優れたI / Oデバイスでしたが、テレプリンターははるかに安価でした。
スーパーキャット

10による行番号付けは事実上の標準であり、厳密な要件ではありません。また、多くのBASICにはren番号を変更するための ' 'コマンドがありました。典型的な呼び出しはしたren 10, 1010ずつ増加、10から始まる番号を付け直す( - 1だけで入力した場合、デフォルトの動作rengotogosubthen (linenumber)。コマンドは自動的に更新されるだろう。しかし、これは間違いなく最も初期の基本では使用できませんでしたが、IIRCは、アップルで利用可能でした。整数ベーシック、Applesoft FPベーシック、TIベーシック/拡張ベーシック、MSベーシック/ GWベーシックなど
DavidO

13

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

まず、「線」の概念は永遠に存在しているわけではないことに留意してください。この時代の多くのプログラミング言語はパンチカードを使用し、シーケンス番号(通常はカードの最後の数列)を使用することで、ドロップした場合やカードリーダーで何かひどいことが起こった場合に適切な順序でデッキを復元できました。これを自動的に行うマシンがありました。

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

BASICはFORTRANから派生したものであり、実装と理解をより簡単にすることを目的としていたため、すべての「行」に行番号を付けること(順序付けおよびGOTO/ GOSUBステートメントのターゲットとして)は、おそらくそのための設計上の決定でした。


2
ああ、計算されたゴト。PL / 1のラベル変数の配列のメモリ。1つの配列をループして一致を見つけ、それを使用してgotoを行うラベル変数の配列のインデックスとして配列インデックスを使用します。または、Cobolはgotosを変更しました。そして、どちらも行番号を使用しません!BBCベーシックには、非常に便利な番号変更ステートメントがありました。
キックスタート

GCCでは、計算されたGOTOを拡張機能として使用できます(もちろん、直接行番号を使用することはできません)-次のようなことができますgoto array_of_labels[some_computation()];
-immibis

マイナー:FORTRANでは、ターゲットGOTO(またはASSIGN)および元の別名算術別名スリーウェイIF、および(まれに使用される)の代替リターンCALL、およびDO、およびFORMATステートメントのターゲットの並べ替え(おそらく区切り文字)が必要です。他のステートメントでは、それらはオプションでした。
dave_thompson_085

一部のBASIC(Atariなど)では、GOTOステートメントで任意の数値式を使用することさえできました。したがって、適切な行番号付け規則GOTO 1000+N*100を使用すると、switchステートメントをエミュレートするように記述できます。
dan04

6

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


14
COBOLはこれらの行番号を使用しませんでした。それらは厳密に便利なものでしたので、一部の貧しいシュラブが彼のデッキを落とし、カードがどこにでも行くと、彼はそれらを集めてカードソーターに通して正しい順序に戻すことができました。行番号をカードにパンチする必要はありませんでした。(学生はしませんでした。プロダクションショップはしました。)
ジョンR.ストローム

5

BASICは、ラインターミナル時代のFORTRANよりも遅れて登場しました。カードのデッキよりもインタラクティブなread-exe-print-loop環境が特徴でした。

BASICで、24文字を保持する1行のディスプレイでプログラムすることを学びました。行番号は、行を編集するか他の行に挿入するかに関係なく、行の移動先を指定する自然な方法でした。

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


2
これは、以前の4つの回答
-gnat

2
それは悪いことですか?Jaquesは、行の挿入とコードの精神的な追跡に関する1行の編集の本質を実際にはカバーしていなかったと思います。
JDługosz

1
@jameslarge「BASICを使用しているときに何度も...」で始まる段落のその点を見逃していますか?また、BASICをオペレーティングシステムと呼ぶのをためらいます。それはDOSでした。そして、DOSは、あなたが動作するようにほとんどの時間を持っていたそのまさにBASICを、必要はありませんでした。

2
@Ianは事実ですが、ioのテレタイプを使用するシステム(ダートマスタイムシェアリングシステム)用に設計されました。
ジュール

3
@MichaelT、おっと!私はコメントの半分を撤回しますが、BASICが一部のコンピューターのOSであるという部分を支持します。考えている; Apple] [、TI 99/4、IBM 5100、HP 9830a、Compucolor 8001、TRS-80 Model 1、Comodore Vic20、Sinclair ZX80など。すべてがROMからBASICに起動しました。一部には、オーディオカセットから、またはフロッピードライブに余分な$$を支払った場合はフロッピーディスクからロードできるオプションのオペレーティングシステムがありました。
ソロモンスロー

1

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


1

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.