it-swarm.com.de

Warum hat BASIC Zeilennummern verwendet?

Warum haben alte BASICs (und möglicherweise andere Sprachen) Zeilennummern als Teil des Quellcodes verwendet?

Ich meine, welche Probleme hat es gelöst?

96
DerMike

BASIC muss in einen Kontext mit seinen zeitgenössischen Sprachen gebracht werden: Early Fortran, Cobol und Assembly.

Damals, als ich versuchte mich an 6502 Assembly ohne Beschriftungen war, bedeutete dies, dass Sie irgendwo eine Anweisung hinzufügen mussten, als Sie herausfanden Mitten in dicht gepacktem Code (ich habe später NOP s hinzugefügt) mussten Sie alle Sprungadressen durchgehen und wiederholen. Das war zeitaufwändig.

Fortran war ein auf Zeilennummern basierendes System vor BASIC. In Fortran waren die Spalten 1 bis 5 eine Zeilennummer, die für Ziele zum Verzweigen verwendet werden sollte. Das Wichtigste bei Fortran war, dass die Compiler tendenziell etwas intelligenter waren als der BASIC-Interpreter. Das Hinzufügen einiger Anweisungen war nur eine Frage des Schlagens einiger Karten und des Einlegens in das Deck an der richtigen Stelle.

BASIC hingegen musste alle Anweisungen in Ordnung halten. Es gab nicht viel von einem Konzept einer "Fortsetzung der vorherigen Zeile". Stattdessen wurde in Applesoft BASIC (einem der weit verbreiteten Dialekte, mit denen ich vertraut bin und zu denen ich Informationen finden kann) jede Zeile im Speicher wie folgt dargestellt:

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

Es hatte zwei Bytes für die Adresse der nächsten Zeile (NN NN). Zwei Bytes für die Zeilennummer dieser Zeile (TT TT) und dann eine Liste der Token (AA BB CC DD .. ..) gefolgt von der Zeilenende-Markierung (00). (Dies ist von Seite 84-88 von Inside the Apple // e )

Ein wichtiger Punkt, der bei der Betrachtung dieser Speicherdarstellung zu beachten ist, ist, dass die Zeilen außerhalb der Reihenfolge im Speicher gespeichert werden können. Die Struktur des Speichers war die einer verknüpften Liste mit einem Zeiger für die nächste Zeile in der Struktur. Dies machte es einfach, neue Zeilen zwischen zwei Zeilen einzufügen - aber Sie mussten jede Zeile nummerieren, damit sie ordnungsgemäß funktioniert.

Bei der Arbeit mit BASIC haben Sie häufig in BASIC selbst gearbeitet. Insbesondere war eine gegebene Zeichenfolge entweder eine Zeilennummer und BASIC-Anweisungen oder ein Befehl an den Basisinterpreter für RUN oder LIST. Dies machte es einfach, den Code von den Befehlen zu unterscheiden - jeder Code beginnt mit Zahlen.

Diese beiden Informationen identifizieren, warum Zahlen verwendet wurden - Sie können viele Informationen in 16 Bit erhalten. Zeichenfolgenbasierte Beschriftungen würden viel mehr Platz beanspruchen und sind schwieriger zu bestellen. Zahlen sind einfach zu verarbeiten, verständlich und leichter darzustellen.

Spätere BASIC-Dialekte, in denen Sie nicht in dem Dolmetscher waren, konnten die ganze nummerierte Zeile beseitigen und mussten stattdessen nur die Zeilen nummerieren das waren Branchenziele. In der Tat Etiketten.

130
user40980

Bei frühen Mikrocomputern war die Bearbeitung zeilenbasiert. Sie konnten sich nicht einfach im Quellcode frei bewegen und bearbeiten. Sie hatten eine einzelne Zeile am unteren Bildschirmrand, in die Sie Befehle eingeben und Code eingeben konnten. Der Rest des Bildschirms bestand aus schreibgeschützten Codelisten und Befehlsausgaben. Wenn Sie z. B. Zeile 90 in dem Programm bearbeiten möchten, haben Sie "EDIT 90 "und der Inhalt der Zeile 90 hat den einzeiligen Bearbeitungspuffer eingegeben. Wenn Sie die Zeile bearbeitet haben, drücken Sie die Eingabetaste, und die Programmliste wurde aktualisiert. Sie brauchten also Zeilennummern, um das Programm bearbeiten zu können.

Als die Code-Editoren weiterentwickelt wurden und Sie den Cursor in der Codeliste bewegen konnten, brauchten Sie keine Zeilennummern mehr.

50
JacquesB

Wenn Sie an BASIC-Dialekte der 8-Bit-Heim-Mikrocomputer der 80er Jahre denken, hatten diese Computer keine Texteditoren (es sei denn, Sie haben eine Textverarbeitungsanwendung gekauft). Es gab keine Möglichkeit, den gesamten Quellcode des BASIC-Programms "in einem Editor geöffnet" zu haben, wie Sie es heute beim Programmieren getan hätten. Der Programmierer würde das Programm nicht einmal als Quellcodedatei oder Text betrachten.

Beispiel Problem

Nehmen wir also an, Sie haben ein einfaches Programm ohne Zeilennummern im Kopf:

FOR I=1 TO 42
PRINT I
NEXT I

Sie starten Ihren Computer. Sie haben eine Eingabeaufforderung "bereit" oder ähnliches und einen Cursor in der nächsten Zeile. Dies ähnelt den heutigen REPL Umgebungen verschiedener Skriptsprachen, ist jedoch nicht wirklich so streng zeilenbasiert, sondern eher bildschirmbasiert. Also nicht ganz wie die REPLs von heute, aber nah dran.

Wenn Sie jetzt mit der Eingabe des Programms beginnen, wird nach der ersten Zeile möglicherweise ein Fehler angezeigt, da der BASIC-Interpreter versucht, ihn sofort auszuführen (und zu vergessen), und es ohne NEXT keinen Sinn macht, die Schleife zu beenden. Dies ist kein Texteditor, in dem Sie Text bearbeiten. Hier geben Sie dem Computer Befehle!

Teillösung

Sie müssen also sagen, dies ist eine Programmzeile, speichern Sie sie! Sie könnten einen speziellen Befehl oder nur ein Symbol haben, das besagt, dass dies eine Programmzeile ist. Speichern Sie sie. Stellen wir uns Folgendes vor:

#FOR I=1 TO 42
#PRINT I
#NEXT I

Ok, jetzt hat unser imaginärer BASIC-Interpreter das Programm gespeichert und Sie können es ausführen. Jetzt möchten Sie die PRINT-Zeile bearbeiten. Wie machst du das? Sie befinden sich nicht in einem Texteditor. Sie können den Cursor nicht einfach auf die Zeile bewegen und bearbeiten. Oder Sie möchten eine weitere Zeile wie LET COUNT=COUNT+1 in der Schleife. Wie geben Sie an, wo die neue Zeile eingefügt werden soll?

Arbeitslösung

Zeilennummern lösen dies auf sehr einfache, wenn auch ziemlich klobige Weise. Wenn Sie eine Programmzeile mit einer bereits vorhandenen Nummer eingeben, wird die alte Zeile ersetzt. Jetzt wird die bildschirmbasierte Umgebung REPL) nützlich, da Sie den Cursor einfach auf die Programmliste auf dem Bildschirm bewegen und bearbeiten können die Zeile auf dem Bildschirm und drücken Sie die EINGABETASTE, um sie zu speichern. Dies scheint, als würden Sie die Zeile bearbeiten, obwohl Sie tatsächlich Text auf dem Bildschirm bearbeiten und dann ersetzen Die gesamte Zeile mit einer neuen Zeile auf dem Bildschirm. Das Einfügen neuer Zeilen wird ebenfalls einfach, wenn Sie nicht verwendete Zahlen dazwischen lassen. So demonstrieren Sie:

10 FOR I=1 TO 42
20 PRINT I
30 NEXT I

Nach erneuter Eingabe von Zeile 20 mit Änderungen und Hinzufügen neuer Zeilen könnte dies der Fall sein

5 LET COUNT=0
10 FOR I=1 TO 42
20 PRINT "Index", I
25 LET COUNT=COUNT+1
30 NEXT I

Weitere Probleme haben wir gerade gelöst

Es gibt den Vorteil (oder den Fluch, da er den berühmten BASIC-Spaghetti-Code ermöglicht), Zeilennummern als Sprachkonstrukt verwenden zu können, zumindest als Ziel von GOTO UND GOSUB Befehlen. Dies könnte durch Beschriftungen ersetzt werden, aber die Verwendung von Zeilennummern ist im BASIC-Interpreter viel einfacher zu implementieren, was in einem typischen 8-Bit-Heimcomputer der 80er Jahre immer noch ein klarer Bonus war.

Noch wichtiger ist, dass Zeilennummern aus Sicht der Benutzererfahrung eine überraschend einfache und dennoch vollständige Oberfläche zum Bearbeiten des Codes sind. Geben Sie einfach eine Zeile ein, die mit einer Zahl beginnt, um neuen Code einzufügen. Verwenden LIST 100-200, um die Zeilen 100-200 anzuzeigen. Um eine Zeile zu bearbeiten, listen Sie sie auf dem Bildschirm auf, bearbeiten Sie den Text auf dem Bildschirm und geben Sie die Zeile erneut ein. Um eine Zeile zu entfernen, bearbeiten Sie sie so, dass sie leer ist. Geben Sie einfach eine Zeilennummer an, hinter der nichts steht. Ein Absatz, um dies zu beschreiben. Vergleichen Sie den Versuch, die Verwendung alter Texteditoren wie edlin von DOS oder ed oder ex von Unix: Sie benötigen einen Absatz (nur leichte Übertreibung), um zu erklären, wie der Benutzer sie beenden kann, wenn er versehentlich gestartet wird!

Fazit

Andere Antworten erklären, wie Zeilennummern entstanden sind. Ich versuche hier zu beschreiben, warum die Zeilennummern so lange überlebt haben, wie sie ein reales Problem gelöst haben: Sie boten eine Möglichkeit, die eigentliche Programmierung ohne einen echten Editor auf sehr einfache Weise durchzuführen. Sobald die richtigen, benutzerfreundlichen Vollbild-Texteditoren zur gängigen Methode zum Bearbeiten von Code wurden, sowohl mit dem Verschwinden der Hardwareeinschränkungen als auch mit der Überwindung der Trägheit von Personen, die neue Dinge anpassen, verschwanden zeilennummernbasierte BASIC-Dialekte recht schnell aus der Verwendung, weil Das zentrale Usability-Problem, das sie gelöst haben, war kein Problem mehr.

45
hyde

In der Zeit und Ära, als Basic entwickelt wurde, war das beste verfügbare E/A-Gerät ein Teletyp. Das Bearbeiten eines Programms erfolgte durch Drucken (auf Papier) einer Liste des gesamten Programms oder des interessanten Teils davon und anschließendes Eingeben von Ersatzzeilen mit Zeilennummern.

Das ist auch der Grund, warum die Standardzeilennummerierung 10 war, sodass zwischen vorhandenen Zeilen nicht verwendete Nummern vorhanden waren.

17
ddyer

"Zeilennummern" bedeuten ein paar verschiedene Dinge.

Denken Sie zunächst daran, dass das Konzept der "Linien" nicht für immer existiert. Viele Programmiersprachen in dieser Ära verwendeten Lochkarten und hatten Sequenznummern (normalerweise in den letzten Spalten der Karte) hat Ihnen geholfen, Ihr Deck in der richtigen Reihenfolge wiederherzustellen, wenn Sie es fallen gelassen haben oder etwas Schreckliches im Kartenleser passiert ist. Es gab Maschinen, die dies automatisch erledigten.

Zeilennummern zur Verwendung als Ziele für GOTO -Anweisungen sind ein völlig anderes Konzept. In FORTRAN IV waren sie optional und standen vor der Anweisung (in den Spalten 1-5). Es war nicht nur einfacher zu implementieren als Freiform-Labels, sondern es gab auch das Konzept berechnetes und zugewiesenes GOTO , mit dem Sie zu einer beliebigen Zeilennummer springen konnten. Dies war etwas, was die meisten modernen Programmiersprachen nicht haben (obwohl switch Anweisungen nahe kommen), aber für Assembler-Programmierer ein vertrauter Trick.

BASIC wurde von FORTRAN abgeleitet und sollte einfacher zu implementieren und zu verstehen sein, sodass jede "Zeile" eine Zeilennummer haben muss (sowohl für die Sequenzierung als auch als Ziel von GOTO/GOSUB) Aussagen) war wahrscheinlich eine Entwurfsentscheidung aus diesem Grund.

13
Mike Harris

Ich begann mit der Programmierung in COBOL, wobei die Zeilennummern in den Spalten 1-6 jeder Zeile verwendet wurden. Da es in den 1970er Jahren keine IDEs gab, wurde alles über Lochkarten erledigt und die Zeilennummer wurde verwendet, um zu identifizieren, welche Zeilen in der ursprünglichen Quelle ersetzt und welche neuen Zeilen hinzugefügt werden sollten. Früher haben wir die Zeilennummern um 100 erhöht, um Platz für weitere Zeilen zu schaffen.

6
Keith Miller

BASIC entstand später als FORTRAN in der Ära der Leitungsterminals. Es gab eine Read-Exe-Print-Loop-Umgebung, die interaktiver war als ein Kartenspiel.

Ich habe gelernt, in BASIC auf einem einzeiliges Display zu programmieren, das 24 Zeichen enthält. Zeilennummern waren eine natürliche Methode, um anzugeben, wohin eine Zeile gehen soll, ob Sie eine bearbeiten oder zwischen anderen einfügen.

Ich kann mir wirklich nicht vorstellen, wie Sie es sonst tun würden.

5
JDługosz

Das Dartmouth Time Sharing System verwendete eine Teletyp-Schnittstelle. Daher wurde eine befehlsbasierte Schnittstelle verwendet. Ursprünglich wurden Zeilennummern nur als Mittel zum Bearbeiten des Programms verwendet. Sie können mithilfe einer Zeilennummer einfügen, ersetzen oder löschen. Es scheint nicht, dass die frühe Version Zeilennummern für goto-Anweisungen verwendet hat, aber dies war eine spätere Ergänzung der Sprache.

1
C. Fugate

Ein Punkt, den noch niemand erwähnt hat, ist, dass es für Anfänger einfacher ist, über den Programmablauf nachzudenken, wenn die Verzweigungsziele explizit sind. Anstatt mit (möglicherweise verschachtelten) BEGIN/END-Anweisungen (oder den verwendeten Blocktrennzeichen) übereinstimmen zu müssen, war es ziemlich offensichtlich, wohin der Kontrollfluss führte. Dies war wahrscheinlich angesichts der Zielgruppe von BASIC nützlich (es ist schließlich der Anfänger Allzweck-Symbol für symbolische Anweisungen).

1
TMN