BASIC-Interpreter -BASIC interpreter

Ein Beispiel für die Eingabe eines beliebten Programms in einen BASIC-Interpreter (in diesem Fall HAMURABI )

Ein BASIC-Interpreter ist ein Interpreter , der es Benutzern ermöglicht, Programme in der BASIC- Sprache einzugeben und auszuführen , und war für den ersten Teil der Mikrocomputer- Ära die Standardanwendung , die Computer starten würden. Von den Benutzern wurde erwartet, dass sie den BASIC-Interpreter verwenden, um Programme einzugeben oder Programme aus dem Speicher zu laden (zunächst Kassetten, dann Disketten ).

BASIC-Interpreter sind von historischer Bedeutung. Microsofts erstes zum Verkauf stehendes Produkt war ein BASIC-Interpreter ( Altair BASIC ), der den Weg für den Erfolg des Unternehmens ebnete. Vor Altair BASIC wurden Mikrocomputer als Bausätze verkauft, die in Maschinencode programmiert werden mussten (z. B. der Apple I ). Während der Altair-Zeit wurden BASIC-Interpreter separat verkauft und waren die erste Software, die eher an Einzelpersonen als an Organisationen verkauft wurde. Apple BASIC war das erste Softwareprodukt von Apple. Nach dem MITS Altair 8800 wurde erwartet, dass Mikrocomputer gebündelt mit eigenen BASIC-Interpretern ausgeliefert werden (z. B. der Apple II , der mehrere Implementierungen von BASIC hatte). Eine Gegenreaktion auf den Preis von Microsofts Altair BASIC führte auch zu einer frühen kollaborativen Softwareentwicklung für Tiny BASIC- Implementierungen im Allgemeinen und Palo Alto Tiny BASIC im Besonderen.

BASIC-Interpreter wurden nicht mehr verwendet, als die Computer immer leistungsfähiger wurden und die zugehörigen Programme zu lang wurden, um sie in ein vernünftiges Verteilungsformat einzugeben. Software wurde zunehmend vorkompiliert und auf Disketten oder über Bulletin-Board-Systeme übertragen , wodurch die Notwendigkeit von Quellenverzeichnissen weniger wichtig wurde. Darüber hinaus wurden immer ausgefeiltere Befehls-Shells wie MS-DOS und die Apple Macintosh- GUI zur primären Benutzeroberfläche , und die Notwendigkeit, dass BASIC als Shell fungiert, verschwand. Die Verwendung von BASIC-Interpretern als primäre Sprache und Schnittstelle zu Systemen war Mitte der 1980er Jahre weitgehend verschwunden.

Geschichte

BASIC half dabei, die Timesharing-Ära in Gang zu bringen, wurde in der Mikrocomputer-Ära zum Mainstream, verblasste dann zu einer weiteren Anwendung in der DOS- und GUI-Ära und überlebt heute in einigen Nischen im Zusammenhang mit Spieleentwicklung, Retrocomputing und Unterricht.

Time-Sharing-Ära

BASIC wurde zuerst als Compile-and-Go-System und nicht als Interpreter implementiert und entstand als Teil einer breiteren Bewegung in Richtung Time-Sharing- Systeme. General Electric , das am Dartmouth Time-Sharing-System und dem zugehörigen Dartmouth BASIC gearbeitet hatte , schrieb sein eigenes zugrunde liegendes Betriebssystem und startete ein Online-Time-Sharing-System namens Mark I mit einem BASIC-Compiler (kein Interpreter) als einem seiner Hauptverkäufe Punkte. Andere Unternehmen in der aufstrebenden Branche folgten schnell diesem Beispiel. In den frühen 1970er Jahren war BASIC auf Allzweck-Mainframe-Computern weitgehend universell.

Das HP 2000- System wurde entwickelt, um zeitgeteiltes BASIC als seine primäre Aufgabe auszuführen.

BASIC war als schlanke Sprache, die auf integrierte Zeilenbearbeitung ausgelegt war, natürlich für die Portierung auf den Minicomputermarkt geeignet , der gleichzeitig mit den Time-Sharing-Diensten aufkam. Diese Maschinen hatten einen sehr kleinen Hauptspeicher , in der modernen Terminologie vielleicht nur 4 KB, und es fehlte der Hochleistungsspeicher wie Festplatten , der Compiler praktisch macht. Im Gegensatz dazu würde ein Interpreter auf Kosten der Leistung weniger Rechenressourcen beanspruchen. 1968 führte Hewlett Packard das HP 2000 ein, ein System, das auf seinem HP Time-Shared BASIC- Interpreter basierte . 1969 schrieben Dan Paymar und Ira Baxter einen weiteren frühen BASIC-Interpreter für Data General Nova .

Einer der Verlierer war die Digital Equipment Corporation (DEC), der führende Hersteller von Minicomputern. Sie hatten eine neue Sprache namens FOCAL veröffentlicht , die auf dem früheren JOSS basierte , das Anfang der 1960er Jahre auf einer DEC-Maschine am Stanford Research Institute entwickelt wurde. JOSS war BASIC in vielerlei Hinsicht ähnlich, und FOCAL war eine Version, die entwickelt wurde, um in sehr kleinen Speichersystemen zu laufen, insbesondere dem PDP-8 , der oft mit 4 KB Hauptspeicher ausgeliefert wurde . In den späten 1960er Jahren stellten die DEC-Verkäufer, insbesondere in der Verkaufsabteilung für Bildungseinrichtungen, fest, dass ihre potenziellen Kunden nicht an FOCAL interessiert waren und sich anderswo nach ihren Systemen umsahen. Dies veranlasste David H. Ahl, einen Programmierer einzustellen, um ein BASIC für den PDP-8 und andere DEC-Maschinen zu erstellen. Innerhalb eines Jahres war jegliches Interesse an Alternativen wie JOSS und FOCAL verschwunden.

Ära der Mikrocomputer

Die Einführung der ersten Mikrocomputer Mitte der 1970er Jahre setzte das explosive Wachstum von BASIC fort, was den Vorteil hatte, dass es jungen Designern und Computerbastlern, die sich für Mikrocomputer interessierten, ziemlich bekannt war, von denen viele BASIC auf Minis gesehen hatten oder Großrechner. BASIC war eine der wenigen Sprachen, die sowohl hoch genug war, um von Menschen ohne Ausbildung verwendet werden zu können, als auch klein genug, um in die damaligen Mikrocomputer zu passen. 1972 stellte HP den programmierbaren Tischrechner HP 9830A mit einem BASIC Plus- Interpreter im Nur-Lese-Speicher (ROM) vor.

Im Juni 1974 bewiesen Alfred Weaver, Michael Tindall und Ronald Danielson von der University of Illinois in Urbana-Champaign in ihrem gleichnamigen Artikel, dass es möglich ist, "einen BASIC-Sprachinterpreter für den Intel 8008-Mikroprozessor" zu produzieren, obwohl ihre Die Anwendung wurde auf einem 8008-Simulator für IBM 360/75 bereitgestellt und benötigte 16 KB.

Altair 8K BASIC auf Papierband

Im Januar 1975 wurde der Altair 8800 angekündigt und löste die Mikrocomputer- Revolution aus. Eine der ersten Mikrocomputerversionen von BASIC wurde von Gates, Allen und Monte Davidoff für ihre neu gegründete Firma Micro-Soft gemeinsam geschrieben. Dies wurde von MITS kurz nach der Maschine selbst im Lochstreifenformat für den Altair 8800 veröffentlicht und präsentiert BASIC als Hauptsprache für frühe Mikrocomputer.

Im März 1975 nahm Steve Wozniak am ersten Treffen des Homebrew Computer Club teil und begann, das Design seines eigenen Computers zu formulieren. Clubmitglieder waren von Altair BASIC begeistert. Wozniak kam zu dem Schluss, dass seine Maschine ein eigenes BASIC haben müsste. Er arbeitete damals bei Hewlett Packard und nutzte deren Minicomputer-Dialekt HP Time-Shared BASIC als Grundlage für seine eigene Version. Integer BASIC wurde auf Kassette für den Apple I veröffentlicht und im Sommer 1977 im ROM geliefert , als der Apple II ausgeliefert wurde.

Andere Mitglieder des Homebrew Computer Club begannen, Kopien von Altair BASIC auf Papierstreifen in Umlauf zu bringen, was Gates veranlasste, seinen Offenen Brief an Hobbyisten zu schreiben , in dem er sich über dieses frühe Beispiel von Softwarepiraterie beschwerte . Teilweise als Antwort auf Gates Brief und teilweise, um ein noch kleineres BASIC zu erstellen, das auf 4-KB-Rechnern nützlich wäre, drängte Bob Albrecht Dennis Allison , eine eigene Variante der Sprache zu schreiben. Wie man eine abgespeckte Version eines Interpreters für die BASIC-Sprache entwirft und implementiert, wurde in Artikeln von Allison in den ersten drei vierteljährlichen Ausgaben des Newsletters der People's Computer Company behandelt , der 1975 veröffentlicht wurde, und Implementierungen mit Quellcode, die in Dr. Dobbs Journal of veröffentlicht wurden Tiny BASIC Calisthenics & Orthodontia: Running Light ohne Overbyte . Dies führte zu einer Vielzahl von Tiny BASICs mit zusätzlichen Funktionen oder anderen Verbesserungen, darunter bekannte Versionen von Tom Pittman und Li-Chen Wang , beide Mitglieder des Homebrew Computer Club. Tiny BASIC wurde öffentlich veröffentlicht und Wang prägte den Begriff "Copyleft", um andere zu ermutigen, seinen Quellcode zu kopieren. Hobbyisten und Profis haben ihre eigenen Implementierungen erstellt, was Tiny BASIC zu einem Beispiel für ein Freie-Software- Projekt macht, das vor der Freie-Software-Bewegung existierte .

Viele Firmen haben BASIC-Interpreter entwickelt. 1976 führte SCELBI SCELBAL für den 8008 ein , und die University of Idaho und das Lawrence Livermore Laboratory gaben bekannt, dass sie LLL BASIC im öffentlichen Bereich veröffentlichen würden, das Gleitkommaunterstützung beinhaltete. 1977 hatten Apple II und TRS-80 Model I jeweils zwei Versionen von BASIC, eine kleinere Version, die mit den ersten Versionen der Maschinen eingeführt wurde, und eine lizenzierte Microsoft-Version, die später eingeführt wurde, als das Interesse an den Plattformen zunahm.

Hello World , mit inversem Video und Klingelzeichen , läuft dann aufgeführt in Applesoft BASIC

Microsoft portierte seinen Interpreter auf den MOS 6502 , der schnell zu einem der beliebtesten Mikroprozessoren der 8-Bit-Ära wurde. Als neue Mikrocomputer wie der Commodore PET auftauchten, lizenzierten ihre Hersteller ein Microsoft BASIC, das an die Hardwarefähigkeiten angepasst war. Bis 1978 war MS BASIC ein De-facto- Standard und praktisch jeder Heimcomputer der 1980er Jahre enthielt es im ROM . Im Jahr 1980 lehnte IBM als Teil eines größeren Lizenzabkommens, das andere Sprachen und PC DOS umfasste, eine Ouvertüre von Atari ab und lizenzierte stattdessen MS-BASIC über seine eigene Implementierung und veröffentlichte schließlich vier Versionen von IBM BASIC , jede viel größer als frühere Interpreter ( Beispielsweise benötigte Cartridge BASIC 40 KB). Don Estridge , Leiter des IBM PC- Teams, sagte: „IBM hat ein ausgezeichnetes BASIC – es wird gut angenommen, läuft schnell auf Mainframe-Computern und ist viel funktionaler als Mikrocomputer-BASICs … Aber [seine] Anzahl von Benutzer waren im Vergleich zur Anzahl der Microsoft BASIC-Benutzer winzig klein. Microsoft BASIC hatte Hunderttausende von Benutzern auf der ganzen Welt. Wie wollen Sie damit argumentieren? (Siehe Microsoft BASIC für die nachfolgende Geschichte dieser verschiedenen Implementierungen.)

Viele Anbieter haben "damit argumentiert" und andere Firmen eingesetzt oder ihre eigenen Interpreter geschrieben. Im September 1978 stellte Shepardson Microsystems Cromemco 16K Structured BASIC für die Z80 -basierten Cromemco S-100-Busmaschinen fertig . Paul Laughton und Kathleen O'Brien erstellten dann Atari BASIC als im Wesentlichen eine abgespeckte Version von Cromemco BASIC, die auf den 6502 portiert wurde. 1979 entwickelte Warren Robinett die BASIC-Programmierkassette für Atari, Inc. , obwohl sie nur Programme mit 9 unterstützte Codezeilen (insgesamt 64 Zeichen). Ebenfalls im Jahr 1979 veröffentlichte Texas Instruments TI BASIC (TI 99/4A) mit seinem TI-99/4 , das sich fast 3 Millionen Systeme verkaufen würde, wenn es als TI-99/4A überarbeitet wurde. Sinclair BASIC wurde von John Grant und Steve Vickers von Nine Tiles für den ZX-80 entwickelt . 1980 entwickelte Sophie Wilson von Acorn Computers Atom BASIC , das sie später zu BBC BASIC weiterentwickelte, einem der ersten Interpreter, der eine strukturierte BASIC-Programmierung mit benannten / -Prozeduren und -Funktionen, Schleifen und Strukturen anbot, die von COMAL inspiriert waren . Jan Jones entwickelte SuperBASIC , ein weiteres britisches BASIC, das strukturierte Programmierung unterstützt, für den Sinclair QL . 1983 entwickelte Randall Hyde SmartBASIC für Coleco Adam . Richard Clayton, Chris Hall und Paul Overell entwickelten Mallard BASIC für BBC Micro und Locomotive BASIC für Amstrad CPC , die beide Befehle für ein ISAM- indiziertes Dateisystem unterstützen . 1985 veröffentlichte MetaComCo ABasiC für den Amiga und ST BASIC für den Atari ST . DEF PROCDEF FNREPEAT UNTILIF THEN ELSE

1978 veröffentlichte David Lien die erste Ausgabe von The BASIC Handbook: An Encyclopedia of the BASIC Computer Language , in der Schlüsselwörter für über 78 verschiedene Computer dokumentiert sind. Bis 1981 dokumentierte die zweite Ausgabe Schlüsselwörter von über 250 verschiedenen Computern und zeigte das explosive Wachstum der Mikrocomputer-Ära.

Dolmetscher als Anwendungen

Mit dem Aufkommen von Festplattenbetriebssystemen und späteren grafischen Benutzeroberflächen wurden BASIC-Interpreter zu einer Anwendung unter vielen, anstatt die erste Eingabeaufforderung bereitzustellen, die ein Benutzer möglicherweise beim Einschalten eines Computers sieht.

1983 debütierte der tragbare Computer TRS-80 Modell 100 , dessen Microsoft BASIC-Implementierung aus zwei Gründen bemerkenswert war. Zuerst wurden Programme mit dem einfachen Texteditor TEXT bearbeitet, anstatt Zeile für Zeile eingetippt zu werden (aber Zeilennummern waren immer noch erforderlich). Zweitens war dies das letzte Microsoft- Produkt, das Bill Gates persönlich entwickelt hat.

Ebenfalls 1983 begann Microsoft, GW-BASIC mit DOS zu bündeln. Funktionell identisch mit IBM BASICA , war sein BASIC-Interpreter eine vollständig eigenständige ausführbare Datei und benötigte nicht das Cassette BASIC ROM, das im ursprünglichen IBM-PC enthalten war . Laut Mark Jones Lorenzo ist angesichts des Umfangs der Sprache "GW-BASIC wohl das Nonplusultra von Microsofts Familie von zeilennummerierten BASICs, die bis zum Altair zurückreicht - und vielleicht sogar von zeilennummeriertem BASIC im Allgemeinen." Mit der Veröffentlichung von MS-DOS 5.0 wurde der Platz von GW-BASIC von QBasic eingenommen .

MacBASIC enthielt eine vollständig interaktive Entwicklungsumgebung für den ursprünglichen Macintosh- Computer und wurde von Donn Denman, Marianne Hsiung, Larry Kenyon und Bryan Stearns entwickelt. MacBASIC wurde 1985 als Beta-Software veröffentlicht und für den Einsatz an Orten wie der Informatikabteilung des Dartmouth College zur Verwendung in einem Einführungskurs in die Programmierung übernommen. Es war dazu verdammt, das zweite von Apple entwickelte BASIC zu sein, das zugunsten eines Microsoft BASIC getötet wurde. Im November 1985 beendete Apple das Projekt abrupt als Teil eines Deals mit Microsoft, um die Lizenz für BASIC auf dem Apple II zu erweitern .

BASIC kam zu einigen Videospielsystemen, wie dem Nintendo Famicom .

BASIC-Interpreter waren nicht nur eine amerikanisch/britische Entwicklung. 1984 veröffentlichte Hudson Soft Family BASIC auf dem japanischen Markt für die Videospielkonsole Family Computer von Nintendo, eine Implementierung nur für Ganzzahlen, die für die Spieleprogrammierung entwickelt wurde und auf Hudson Soft BASIC für das Sharp MZ80 (mit englischen Schlüsselwörtern) basiert. Turbo-Basic XL ist eine kompatible Obermenge von Atari BASIC, entwickelt von Frank Ostrowski und veröffentlicht in der Dezemberausgabe 1985 der deutschen Computerzeitschrift Happy Computer , was es zu einem der letzten Interpreter macht, der als Eintippprogramm veröffentlicht wurde . Die Sprache enthielt neben dem Interpreter einen Compiler und verfügte über strukturierte Programmierbefehle. Mehrere modifizierte Versionen, die mit verschiedenen DOS-Systemen arbeiten, wurden von anderen Autoren veröffentlicht. In Frankreich entwickelten François Lionet und Constantin Sotiropoulos zwei BASIC-Interpreter mit Fokus auf Multimedia: STOS BASIC für den Atari ST im Jahr 1988 und AMOS BASIC für den Amiga im Jahr 1990.

Im Mai 1991 veröffentlichte Microsoft Visual Basic , eine ereignisgesteuerte Programmiersprache der dritten Generation, die für ihr COM-Programmiermodell ( Component Object Model ) bekannt ist. Visual Basic unterstützte die schnelle Anwendungsentwicklung (RAD) von Anwendungen mit grafischer Benutzeroberfläche (GUI) , den Zugriff auf Datenbanken mit Data Access Objects , Remote Data Objects oder ActiveX Data Objects und die Erstellung von ActiveX- Steuerelementen und -Objekten. Visual Basic wurde verwendet, um proprietäre interne Anwendungen sowie veröffentlichte Anwendungen zu entwickeln.

Nischen-BASICs

1993 veröffentlichte Microsoft Visual Basic for Applications , eine Skriptsprache für Microsoft Office- Anwendungen, die die Fähigkeiten früherer anwendungsspezifischer Makroprogrammiersprachen wie Word BASIC (das 1989 eingeführt wurde) ersetzt und erweitert.

1996 veröffentlichte Microsoft VBScript als Alternative zu JavaScript zum Hinzufügen interaktiver clientseitiger Funktionen zu Webseiten , die mit Internet Explorer angezeigt werden .

1999 veröffentlichte Benoît Minisini Gambas als Alternative für Visual Basic-Entwickler, die sich entschieden hatten, auf Linux umzusteigen .

Im Jahr 2000 veröffentlichten Lee Bamber und Richard Vanner DarkBASIC , ein Spielerstellungssystem für Microsoft Windows , mit begleitender IDE und Entwicklungstools.

2001 wurde SmallBASIC für den Palm PDA veröffentlicht . Ein weiterer BASIC-Interpreter für Palm war HotPaw BASIC, ein Ableger von Chipmunk Basic .

Im Jahr 2002 veröffentlichten Emmanuel Chailloux, Pascal Manoury und Bruno Pagano ein Tiny BASIC als Beispiel für die Entwicklung von Anwendungen mit Objective Caml .

Im Jahr 2011 veröffentlichte Microsoft Small Basic (getrennt von SmallBASIC) zusammen mit einem Lehrplan und einem Einführungshandbuch, das Schülern helfen soll, die visuelle Programmiersprachen wie Scratch gelernt haben , textbasiertes Programmieren zu lernen. Die zugehörige IDE bietet eine vereinfachte Programmierumgebung mit Funktionen wie Syntaxhervorhebung , intelligenter Codevervollständigung und Zugriff auf die Dokumentation im Editor. Die Sprache hat nur 14 Schlüsselwörter. Im Jahr 2019 kündigte Microsoft Small Basic Online (SBO) an, mit dem Schüler Programme über einen Webbrowser ausführen können .

Im Jahr 2014 veröffentlichte Robin H. Edwards Arduino BASIC für den Arduino und jetzt eine weit verbreitete Implementierung. Eine andere Implementierung mit demselben Namen wurde 1984 von Gordon Brandly von Palo Alto Tiny BASIC für sein 68000 Tiny BASIC angepasst und später von Mike Field auf C portiert.

Mobile BASIC für Android

Viele BASIC-Interpreter sind jetzt für Smartphones und Tablets über den Apple App Store oder den Google Play Store für Android erhältlich .

Heute ist das Codieren von BASIC-Interpretern Teil des Retrocomputing- Hobbys geworden. Höhere Programmiersprachen auf Systemen mit umfangreichem RAM haben die Implementierung von BASIC-Interpretern vereinfacht. Zum Beispiel ist die Zeilenverwaltung einfach, wenn Ihre Implementierungssprache dünn besetzte Matrizen unterstützt , die Variablenverwaltung ist einfach mit assoziativen Arrays und die Programmausführung ist einfach mit Auswertungsfunktionen . Als Beispiele siehe das in Haskell geschriebene Open-Source-Projekt Vintage BASIC oder das OCaml Tiny BASIC .

Verkauf und Distribution

Ursprünglich wurden Dolmetscher entweder mit Computerhardware gebündelt oder als kundenspezifische Dienstleistung entwickelt, bevor Ende der 1960er Jahre eine Industrie entstand, die unabhängig verpackte Software für Organisationen herstellte. BASIC-Interpreter wurden zuerst separat von Mikrocomputern verkauft, dann eingebaut, bevor sie in der DOS-Ära wieder als Anwendungen verkauft wurden.

Beschriftungstext
Jahr Medien Beispiel
1975 Papier Klebeband Altair BASIC
1975 Programm eingeben Winziges BASIC Extended
1976 Kassette Apple I BASIC
1977 Disketten-ROM MICRO-BASIS
1977 Rom Ganzzahl BASIC
1983 Diskette GW-BASIC
1995 CD-ROM Visual Basic 4.0
2008 Appstore Verschieden

Als sich der Markt auf ROMs verlagerte, dominierte die ROM-Größe die Entscheidung darüber, wie groß ein BASIC-Interpreter sein könnte. Da RAM als 4-KB-Chips verkauft wurde, wurde Altair BASIC ursprünglich in separaten Editionen für 4K, 8K und 12K verpackt; Dies wurde auf ROM-Chips übertragen, da die Hersteller entscheiden würden, wie viele ROM-Chips sie angesichts der Preisziele und anderer Einschränkungen in ihr Design einbauen könnten.

Compiler vs. Interpreter

Compiler vs. Interpreter
Aspekt Compiler Dolmetscher
Optimiert für Leistung Speichernutzung
Ausführungsgeschwindigkeit Schneller Langsamer
Speichernutzung Höher Untere
Zweitlager Erforderlich Optional
Fehlerüberprüfung Vor der Hinrichtung Während der Ausführung
Quellcode Nicht in ausführbare Datei eingebettet Zur Ausführung erforderlich

Die erste Implementierung von BASIC, Dartmouth BASIC , war ein Compiler. Im Allgemeinen untersuchen Compiler das gesamte Programm in einem mehrstufigen Prozess und erzeugen eine zweite Datei, die ohne Bezugnahme auf den Quellcode direkt in der zugrunde liegenden Maschinensprache des Hostcomputers ausführbar ist. Dieser Code besteht oft aus Aufrufen vorgefertigter Routinen im Laufzeitsystem der Sprache . Die ausführbare Datei ist normalerweise kleiner als der Quellcode, der sie erstellt hat.

Der Hauptnachteil von Compilern, zumindest im historischen Kontext, besteht darin, dass sie große Mengen an temporärem Speicher benötigen. Während der Compiler arbeitet, erzeugt er eine ständig wachsende Ausgabedatei, die zusammen mit dem ursprünglichen Quellcode im Speicher gehalten wird. Zusätzlicher Speicher für temporäre Suchen, insbesondere Zeilennummern im Fall von BASIC, trägt zur Speicheranforderung bei. Computer der damaligen Zeit hatten sehr wenig Speicher; In modernen Begriffen könnte ein typischer Mainframe in der Größenordnung von 64 KB liegen. Bei einem Timesharing-System, wie es bei den meisten BASICs der 1960er Jahre der Fall war, wurde dieser Speicher von vielen Benutzern geteilt.

Damit ein Compiler funktioniert, mussten die Systeme über eine Form von Hochleistungs- Sekundärspeicher verfügen , typischerweise eine Festplatte . Die Programmbearbeitung fand in einer dedizierten Umgebung statt, die den Quellcode des Benutzers in eine temporäre Datei schrieb. Wenn der Benutzer das Programm ausführte, beendete der Editor und führte den Compiler aus, der diese Datei las und den ausführbaren Code erzeugte, und schließlich beendete der Compiler das resultierende Programm und führte es aus. Das Aufteilen der Aufgabe auf diese Weise reduzierte die Speichermenge, die von einem der Teile des gesamten BASIC-Systems benötigt wurde. Zu jedem Zeitpunkt musste nur der Editor, Compiler oder die Laufzeitumgebung geladen werden, der Rest befand sich im Speicher.

Während Mainframes über geringe Speichermengen verfügten, hatten Minicomputer noch kleinere Mengen: 4- und 8-KB-Systeme waren in den 1960er Jahren typisch. Aber viel wichtiger ist, dass Minicomputern tendenziell jegliche Form von Hochleistungsspeicher fehlte; Die meisten frühen Designs verwendeten Lochstreifen als primäres Speichersystem, und Magnetbandsysteme waren für das obere Ende des Marktes bestimmt. In dieser Umgebung hätte ein System, das den Quellcode geschrieben, kompiliert und dann das Ergebnis ausgeführt hat, Minuten gedauert. Aufgrund dieser Einschränkungen vermehrten sich Dolmetscher.

Interpreter führen letztendlich die gleichen grundlegenden Aufgaben wie Compiler aus, lesen den Quellcode und konvertieren ihn in ausführbare Anweisungen, die Laufzeitfunktionen aufrufen. Der Hauptunterschied besteht darin , wann sie die verschiedenen Aufgaben ausführen. Im Fall eines Compilers wird der gesamte Quellcode konvertiert, was dem Benutzer als eine einzelne Operation erscheint, während ein Interpreter die Quelle Anweisung für Anweisung konvertiert und ausführt. Der resultierende Maschinencode wird ausgeführt und nicht ausgegeben, und dann wird dieser Code verworfen und der Prozess wird mit der nächsten Anweisung wiederholt. Dadurch entfällt die Notwendigkeit irgendeiner Form von Sekundärspeicher, während eine ausführbare Datei erstellt wird. Der Hauptnachteil besteht darin, dass Sie die verschiedenen Teile des Gesamtprozesses nicht mehr voneinander trennen können – der Code, der zum Konvertieren der Quelle in Maschinenoperationen benötigt wird, muss zusammen mit der dafür erforderlichen Laufzeit in den Speicher geladen werden, und in den meisten Fällen die auch Quellcode-Editor.

Das Produzieren einer Sprache mit all diesen Komponenten, die in eine kleine Speichermenge passt und immer noch Platz für den Quellcode des Benutzers bietet, ist eine große Herausforderung, aber es macht einen sekundären Speicher überflüssig und war die einzige praktische Lösung für frühe Minicomputer und die meisten davon die Geschichte der Heimcomputer -Revolution.

Entwicklung

Sprachdesign

Das Sprachdesign für die ersten Interpreter bestand oft einfach darin, auf andere Implementierungen zu verweisen. Zum Beispiel waren Wozniaks Referenzen für BASIC ein HP BASIC-Handbuch und eine Kopie von 101 BASIC Computer Games . Basierend auf diesen Quellen begann Wozniak mit dem Skizzieren einer Syntaxtabelle für die Sprache. Er wusste nicht, dass sich HPs BASIC stark von der in 101 Games verwendeten DEC BASIC- Variante unterschied . Die beiden Sprachen unterschieden sich hauptsächlich in Bezug auf die Behandlung von Zeichenfolgen und die Kontrollstrukturen. Data General Business Basic , eine reine Integer-Implementierung, war die Inspiration für Atari BASIC.

Im Gegensatz dazu schrieb Dennis Allison , ein Mitglied der Fakultät für Informatik an der Stanford University , eine Spezifikation für eine einfache Version der Sprache. Allison wurde von Bob Albrecht vom Homebrew Computer Club aufgefordert, den Standard zu erstellen, der BASIC auf Minicomputern gesehen hatte und der Meinung war, dass es perfekt zu neuen Maschinen wie dem Altair passen würde. Allisons vorgeschlagenes Design verwendete nur Integer-Arithmetik und unterstützte keine Arrays oder String-Manipulation. Das Ziel war, dass das Programm in 2 bis 3 Kilobyte Speicher passt. Das Gesamtdesign für Tiny BASIC wurde in der Septemberausgabe 1975 des Newsletters der People's Computer Company (PCC) veröffentlicht.

Die Grammatik ist unten in Backus-Naur-Form aufgeführt . In der Auflistung *bezeichnet ein Sternchen (" ") null oder mehr Objekte auf der linken Seite — mit Ausnahme des ersten Sternchens in der Definition von " term", das der Multiplikationsoperator ist; Klammern gruppieren Objekte; und ein Epsilon (" ε") bedeutet die leere Menge. Wie in der Grammatiknotation von Computersprachen üblich, |unterscheidet der vertikale Balken (" ") Alternativen, ebenso wie die Auflistung in separaten Zeilen. Das Symbol " CR" bezeichnet einen Wagenrücklauf .

    line ::= number statement CR | statement CR
 
    statement ::= PRINT expr-list
                  IF expression relop expression THEN statement
                  GOTO expression
                  INPUT var-list
                  LET var = expression
                  GOSUB expression
                  RETURN
                  CLEAR
                  LIST
                  RUN
                  END
 
    expr-list ::= (string|expression) (, (string|expression) )*
 
    var-list ::= var (, var)*
 
    expression ::= (+|-|ε) term ((+|-) term)*
 
    term ::= factor ((*|/) factor)*
 
    factor ::= var | number | (expression)
 
    var ::= A | B | C ... | Y | Z
 
    number ::= digit digit*
 
    digit ::= 0 | 1 | 2 | 3 | ... | 8 | 9
 
    relop ::= < (>|=) | > (<|=) | =

Diese Syntax, so einfach sie auch war, fügte eine Neuerung hinzu: GOTOSie GOSUBkonnte einen Ausdruck anstelle einer Zeilennummer annehmen und ein zugewiesenes GOTO anstelle der switch-Anweisung der ON-GOTO/GOSUBfür BASIC typischeren Struktur bereitstellen.

Sinclair BASIC verwendete als Sprachdefinition den Minimal-BASIC-Standard des American National Standards Institute (ANSI) von 1978, war jedoch selbst eine unvollständige Implementierung mit nur ganzzahliger Arithmetik. Der ANSI-Standard wurde nach dem Entwurf der ersten Generation von Interpretern für Mikrocomputer veröffentlicht.

Die Architektur

Gemeinsame Komponenten eines BASIC-Interpreters:

  • E/A- und Interrupt-Behandlung
    • Tastatur und Bildschirm
    • Dateieingabe/-ausgabe (falls vorhanden)
  • Routinen bearbeiten
    • Befehlszeile
    • Programmbearbeitung und -speicherung
  • Ausführungsroutinen
    • Analyse und Interpretation
    • Arithmetikpaket
    • Speicherverwaltung
      • Symboltabelle (falls vorhanden)
      • Müllabfuhr (falls vorhanden)

Kodierung

Frühen Mikrocomputern fehlten Entwicklungswerkzeuge, und Programmierer entwickelten ihren Code entweder auf Minicomputern oder von Hand. Zum Beispiel haben Dick Whipple und John Arnold Tiny BASIC Extended direkt in Maschinencode geschrieben, indem sie octal verwendet haben . Robert Uiterwyk hat MICRO BASIC für den SWTPC (ein 6800- System) handschriftlich auf einem Notizblock geschrieben. Steve Wozniak schrieb den Code von Hand in Integer BASIC , übersetzte die Assembler-Code- Anweisungen in ihre Maschinencode- Äquivalente und lud das Ergebnis dann auf seinen Computer hoch. (Aus diesem Grund war das Programm sehr schwer zu ändern, und Wozniak war nicht in der Lage, es schnell genug für Steve Jobs zu ändern , der später BASIC von Microsoft lizenzierte.)

Gates und Allen hatten kein Altair-System, auf dem sie ihren Interpreter entwickeln und testen konnten. Allen hatte jedoch einen Intel 8008 -Emulator für ihr früheres Unternehmen Traf-O-Data geschrieben, der auf einem PDP-10- Time-Sharing- Computer lief . Allen passte diesen Emulator basierend auf dem Altair-Programmierhandbuch an und sie entwickelten und testeten den Interpreter auf Harvards PDP-10. Als Harvard die Verwendung dieses Systems einstellte, kauften Gates und Allen Computerzeit von einem Timesharing-Dienst in Boston, um das Debugging ihres BASIC-Programms abzuschließen. Gates behauptete in seinem Offenen Brief an Hobbyisten im Jahr 1976, dass der Wert der Computerzeit für das erste Jahr der Softwareentwicklung 40.000 Dollar betrug.

Nicht, dass Allen nicht in Maschinensprache von Hand kodieren konnte. Beim Endanflug auf den Flughafen von Albuquerque auf einer Reise, um den Dolmetscher vorzuführen, stellte Allen fest, dass er vergessen hatte, ein Bootstrap- Programm zu schreiben, um das Band in den Speicher zu lesen. Allen schrieb in 8080-Maschinensprache und beendete das Programm, bevor das Flugzeug landete. Erst als er das Programm auf einen Altair lud und eine Aufforderung sah, nach der Speichergröße des Systems zu fragen, wusste er, dass der Interpreter auf der Altair-Hardware funktionierte.

Eine der beliebtesten der vielen Versionen von Tiny BASIC war Palo Alto Tiny BASIC, kurz PATB. PATB erschien erstmals in der Ausgabe von Dr. Dobbs vom Mai 1976 , geschrieben in einer benutzerdefinierten Assembler-Sprache mit nicht standardmäßigen Mnemoniken. Li-Chen Wang hatte seinen Dolmetscher auf einem Timesharing-System mit einem generischen Assembler codiert.

Eine Ausnahme von der Verwendung von Assembly war die Verwendung von ALGOL 60 für den Paisley XBASIC-Interpreter für Burroughs große Systeme . Eine weitere Ausnahme und ein Eingabeprogramm war Classic BASIC, geschrieben von Lennart Benschop in Forth und veröffentlicht im niederländischen Forth-Magazin Vijgeblad (Ausgabe Nr. 42, 1993).

Der Quellcode von Interpretern war oft Open Source (wie bei Tiny BASIC) oder wurde später von den Autoren veröffentlicht. Der vollständige kommentierte Quellcode und die Designspezifikationen von Atari BASIC wurden 1983 als The Atari BASIC Source Book veröffentlicht .

Virtuelle Maschinen

Einige BASIC-Interpreter wurden in die Zwischendarstellung einer virtuellen Maschine codiert , um eine Ebene der Abstraktion und Prägnanz über der nativen Maschinensprache hinzuzufügen .

Virtuelle Maschinen in prominenten BASIC-Interpretern
Dialekt von BASIC Sprache für virtuelle Maschinen Native Maschine
Winziges BASIC Tiny BASIC Intermediate Language (TBIL) 6800
NIBL Mittelstufe (IL) SC/MP
TI BASIC Grafikprogrammiersprache (GPL) TMS9900

Während virtuelle Maschinen in Compile-and-Go-Systemen wie BASIC-PLUS verwendet wurden , dienten diese nur zum Ausführen von BASIC-Code, nicht zum Analysieren. Tiny BASIC hingegen wurde entwickelt, um als virtuelle Maschine implementiert zu werden, die BASIC-Anweisungen analysiert und ausführt (interpretiert); Bei einer solchen Implementierung wird der Tiny BASIC- Interpreter selbst auf einem Interpreter einer virtuellen Maschine ausgeführt. Die Länge des gesamten Interpreterprogramms betrug nur 120 Operationen der virtuellen Maschine, bestehend aus 32 Befehlen. Somit sparte die Wahl eines virtuellen Maschinenansatzes Speicherplatz und Implementierungsaufwand, obwohl die darauf ablaufenden BASIC-Programme etwas langsam ausgeführt wurden. (Siehe Tiny BASIC: Implementierung in einer virtuellen Maschine für einen Auszug und Beispielbefehle.) Während die Absicht des Entwurfs darin bestand, dass Tiny BASIC eine virtuelle Maschine verwendet, tat dies nicht jede Implementierung; Zu denen, die dies taten, gehörten Tiny BASIC Extended, 6800 Tiny BASIC und NIBL.

Texas Instruments entwarf für seinen TI-99 eine virtuelle Maschine mit einer Sprache namens GPL, für "Graphic Programming Language". (Obwohl allgemein für die langsame Leistung von TI-BASIC verantwortlich gemacht wurde, bestand ein Teil des Problems darin, dass die virtuelle Maschine im Grafik-ROM gespeichert war, das eine langsame 8-Bit-Schnittstelle hatte.)

Ein Missverständnis der Apple II-ROMs führte zu der Annahme, dass Integer BASIC eine virtuelle Maschine verwendete, eine benutzerdefinierte Assembler-Sprache, die in den Apple-ROMs enthalten und als SWEET16 bekannt ist . SWEET16 basiert auf Bytecodes , die in einer einfachen virtuellen 16-Bit-Maschine ausgeführt werden, sodass der Speicher über indirekte 16-Bit-Zeiger und 16-Bit-Mathematikfunktionen adressiert werden kann, die berechnet werden, ohne dass diese in den zugrunde liegenden 8-Bit-6502 mit mehreren Anweisungen übersetzt werden müssen Code. SWEET16 wurde jedoch nicht vom Kern-BASIC-Code verwendet, obwohl es später verwendet wurde, um mehrere Dienstprogramme zu implementieren, wie z. B. eine Routine zur Neunummerierung von Zeilen.

Programmbearbeitung und -speicherung

Programmbearbeitung

Die meisten BASIC-Implementierungen der Ära fungierten sowohl als Sprachinterpreter als auch als Zeileneditor . Wenn BASIC ausgeführt wurde, wurde eine > Eingabeaufforderung angezeigt, an der der Benutzer Anweisungen eingeben konnte. Dies wurde als „ Direktmodus “ bezeichnet. Beim Booten ging ein BASIC-Interpreter standardmäßig in den direkten Modus.

Anweisungen, die mit führenden Nummern eingegeben wurden, werden in den Programmspeicher für "verzögerte Ausführung" eingegeben, entweder als neue Zeilen oder als Ersatz für Zeilen, die zuvor möglicherweise dieselbe Nummer hatten. Anweisungen, die ohne Zeilennummer eingegeben wurden , wurden als Befehle bezeichnet und sofort ausgeführt. Zeilennummern ohne Anweisungen (dh gefolgt von einem Carriage Return ) löschen eine zuvor gespeicherte Zeile.

Wenn ein Programm im Speicher vorhanden war und der Benutzer den RUNBefehl eingibt, tritt das System in den "indirekten Modus" ein. In diesem Modus wird ein Zeiger so gesetzt, dass er auf die erste Zeile des Programms zeigt, beispielsweise Zeile 10. Der ursprüngliche Text für diese Zeile wird dann aus dem Speicher abgerufen und ausgeführt, als ob der Benutzer ihn gerade im direkten Modus eingegeben hätte. Der Zeiger rückt dann zur nächsten Zeile vor und der Prozess wird fortgesetzt.

Verschiedene Implementierungen boten andere Möglichkeiten zur Programmbearbeitung. Altair BASIC 8K hatte einen EDITBefehl, um in einen Bearbeitungsmodus für eine Zeile zu wechseln. Integer BASIC enthielt auch den AUTOBefehl, automatisch Zeilennummern bei einer bestimmten Startnummer einzugeben, z. B. AUTO 100, wobei bei jeder neuen Zeile 10 zur letzten Nummer hinzugefügt wird. AUTO 300,5würde bei Zeile 300 mit Fünfern beginnen zu nummerieren; 300, 305 usw. Die automatische Nummerierung wurde durch die Eingabe von ausgeschaltet MAN. Einige Interpreter boten Befehle oder Dienstprogramme zur Neunummerierung von Zeilen an.

Tokenisierung und Kodierung von Leitungen

Um RAM zu sparen und die Ausführung zu beschleunigen, würden alle BASIC-Interpreter einige ASCII- Zeichen von Zeilen in andere Darstellungen codieren. Beispielsweise wurden Zeilennummern in Ganzzahlen konvertiert, die als Bytes oder Wörter gespeichert wurden , und Schlüsselwörtern konnten Einzelbyte- Token zugewiesen werden (in MS-BASIC beispielsweise PRINTals Bytewert 145 gespeichert werden). LISTDiese Darstellungen würden dann beim Ausführen des Programms wieder in lesbaren Text umgewandelt .

Kodierung und Tokenisierung in prominenten BASIC-Interpretern
Dialekt von BASIC Linien Nummern Schlüsselwörter Numerische Konstanten Variablennamen
Winziges BASIC Ja NEIN NEIN NEIN
Altair BASIC Ja Ja NEIN NEIN
Ganzzahl BASIC Ja Ja Ja NEIN
Atari BASIC Ja Ja Ja Ja

Abkürzungen

Als Alternative zur Tokenisierung, um RAM zu sparen, haben frühe Tiny BASIC-Implementierungen wie Extended Tiny BASIC, Denver Tiny BASIC und MINOL abgeschnittene Schlüsselwörter: PRfor PRINT, INfor INPUT, RETfor RETURN. Die vollständigen, traditionellen Schlüsselwörter wurden nicht akzeptiert.

Im Gegensatz dazu akzeptierte Palo Alto Tiny BASIC traditionelle Schlüsselwörter, erlaubte jedoch, dass jedes Schlüsselwort mit einem nachgestellten Punkt auf seine minimale eindeutige Zeichenfolge abgekürzt wurde. Zum Beispiel PRINTkönnte getippt werden P., obwohl PR.und andere Variationen auch funktionierten. Dieses System wurde in Level I BASIC für den TRS-80 beibehalten , der PATB verwendete, und war auch in Atari BASIC und dem BASIC verschiedener Sharp Pocket Computer zu finden .

Um eine Abkürzung zu erweitern, durchsucht der Atari BASIC-Tokenizer seine Liste reservierter Wörter, um das erste zu finden, das mit dem gelieferten Teil übereinstimmt. Häufiger verwendete Befehle erscheinen zuerst in der Liste der reservierten Wörter, mit REMam Anfang (kann als geschrieben werden .). Wenn das Programm später LISTbearbeitet wird, schreibt es normalerweise die vollständigen Wörter aus. MS BASICs erlaubten auch ?eine Kurzform für PRINT, erweiterten es jedoch beim Auflisten und behandelten es als Abkürzung, nicht als Synonym.

Tokenisierung

Die meisten BASIC-Interpreter führen zumindest einige Konvertierungen von der ursprünglichen Textform in verschiedene plattformspezifische Formate durch. Tiny BASIC war am einfachen Ende: Es konvertierte nur die Zeilennummer von ihrem Dezimalformat in ein Binärformat. Beispielsweise wurde die Zeilennummer "100" zu einem Einzelbytewert, $64, wodurch sie kleiner im Speicher zu speichern und im Maschinencode einfacher nachzuschlagen ist ( einige Designs von Tiny BASIC erlaubten Zeilennummern von nur 1 bis 254 oder 255, obwohl die meisten verwendeten Double-Byte-Werte und Zeilennummern von mindestens 1 bis 999). Der Rest der Zeile wurde in seinem ursprünglichen Textformat belassen. Tatsächlich argumentierte Dennis Allison, dass die Tokenisierung angesichts der Speicherbeschränkungen mehr Code zur Implementierung benötigen würde, als sie einsparen würde.

MS-BASICs ging noch etwas weiter und konvertierte die Zeilennummer in einen Zwei-Byte-Wert und konvertierte auch Schlüsselwörter wie FORoder PRINTin einen Ein-Byte-Wert, das "Token". Der Token-Wert hatte das High-Bit gesetzt, damit sie zur Laufzeit leicht unterschieden werden können. Alles andere in einer Zeile wurde in seinem ursprünglichen Format belassen, also zum Beispiel die Zeile:

 10 FOR I=1 TO 10

würde wie folgt tokenisiert werden:

 $64$81 I$B211$A410

Beachten Sie, dass das Leerzeichen zwischen FORund Iin der tokenisierten Zeile verbleibt und die Variablennamen und Konstanten nicht tokenisiert werden. Der Code, der diese Tokenisierung durchführte, bekannt als „Chunker“, kopierte einfach alles, was er nicht als Token erkannte, zurück in die Ausgabe, wobei Leerzeichen unverändert beibehalten wurden. Dies bedeutete, dass es PRINTAin zwei Bytes gespeichert wurde, während PRINT Aes in drei Bytes gespeichert wurde, und das Entfernen von Leerzeichen war eine gängige Methode, um die Speichernutzung zu verbessern. Sinclair BASIC modifizierte dies leicht, entfernte Leerzeichen aus dem gespeicherten Code und fügte sie während eines in den Code ein LIST, so dass es PRINTAso aussah, als ob PRINT Adas zusätzliche Byte im Speicher noch nicht belegt wäre.

Im Gegensatz dazu würde Integer BASIC die Zeile 10 GOTO 100vollständig in Token umwandeln, die sofort gelesen und ausgeführt werden könnten. In MS-BASIC würde die Zeile , erzeugen $64 $89 100, und zur Laufzeit müsste die "100" jedes Mal in das 16-Bit-Format konvertiert werden, wenn sie angetroffen wird. Im Gegensatz dazu hat Integer BASIC auch numerische Variablen tokenisiert, wodurch diese Konvertierung vermieden und die Ausführung beschleunigt wird. Der resultierende Zwei-Byte-Wert wurde zusammen mit einem Präfix-Byte, das eine gefolgte Zahl angibt, in den tokenisierten Code eingefügt. Das Präfix war ein Wert zwischen $B0 und $B9 , wobei das letzte Halbbyte des Werts die erste Dezimalziffer im ursprünglichen Wert war. Zeichenfolgenliterale wie „HELLO WORLD“ wurden stattdessen codiert, indem das hohe Bit jedes Zeichens so gesetzt wurde, dass es Aals $C1 gespeichert wurde . Variablennamen wurden auf die gleiche Weise konvertiert, wobei die Buchstaben so codiert wurden, dass ihr High-Bit eingeschaltet war, und alle Ziffern im Namen durch die entsprechenden $B0 bis $B9 dargestellt wurden , sodass die Variable A5als $C1B5 (nicht auf ein Token reduziert). Es gab zahlreiche andere Optimierungen; Während Microsoft BASIC ein Token für das Schlüsselwort hatte PRINT, hatte Integer BASIC drei Token: eines, wenn auf das Schlüsselwort keine Argumente folgten, eines, wenn ein arithmetischer Ausdruck folgte, und eines, wenn ein Zeichenfolgenliteral folgte.

Um dies noch weiter zu führen, analysiert der Tokenizer von Atari BASIC die gesamte Zeile, wenn sie eingegeben oder geändert wird. Numerische Konstanten werden in ihre interne 48-Bit-Form geparst und dann in diesem Format in die Zeile eingefügt, während Zeichenfolgen in ihrem ursprünglichen Format belassen werden, denen jedoch ein Byte vorangestellt ist, das ihre Länge beschreibt. Variablen haben Speicherplatz reserviert, wenn sie angetroffen werden, anstatt zur Laufzeit, und ihr Name wird durch einen Zeiger auf ihren Speicherort im Arbeitsspeicher ersetzt. Shepardson bezeichnete dieses Konzept der frühen Tokenisierung als „Pre-Compiling Interpreter“; Anweisungen mit Syntaxfehlern konnten eigentlich nicht gespeichert werden und der Benutzer wurde sofort aufgefordert, diese zu korrigieren.

Tokenisierung an der Tastatur

Sinclair ZX Spectrum-Tastatur
Tastenkombinationen werden verwendet, um BASIC-Schlüsselwörter einzugeben.

Einige Interpreter, wie z. B. die Sinclair-Systeme, ließen den Benutzer im Grunde die Tokenisierung durchführen, indem er spezielle Tastenanschläge zur Eingabe reservierter Wörter bereitstellte. Die gängigsten Befehle benötigen nur einen Tastendruck; B. nur Pam Anfang einer Zeile auf einem Spectrum zu drücken, erzeugt den vollständigen Befehl PRINT. Weniger häufige Befehle erfordern komplexere Tastenfolgen. Da jede Zeile mit einem Schlüsselwort beginnt, LETist dies nicht optional, nachdem ein Schlüsselwort eingegeben wurde, fällt das System darauf zurück, Text Zeichen für Zeichen zu akzeptieren. Ein Vorteil dieses Ansatzes ist, dass der Tokenizer Zeichenfolgen nicht mit Schlüsselwörtern verwechseln kann. So lässt sich beispielsweise eine Variable benennen PRINTund deren Wert mit ausgeben PRINT PRINT.

Viele " Taschencomputer " verwenden in ähnlicher Weise einen Tastendruck (dem manchmal verschiedene Arten von Umschalttasten vorangehen), um ein Byte (das Schlüsselwort-Token) zu erzeugen, das ein vollständiges BASIC-Schlüsselwort wie EXP, SQR, IF oder PEEK darstellt , wie z. B. Sharp pocket Computerzeichensätze und TI-BASIC . Die BASIC-Erweiterung für den Bally Astrocade nutzt dies ebenfalls.

Linienführung

Gültige Zeilennummern in frühen BASIC-Implementierungen
Bereich Dialekt
1 bis 254 MINOL
1 bis 255 Winzige BASIC Design Note
2 bis 255 Denver Winziges BASIC
0 bis 999 UIUC BASIS
1 bis 2045 DEZ BASIC-8
0 bis 32767 LLL BASIC, NIBL
1 bis 32767 Apple I BASIC , Level I BASIC , Palo Alto Tiny BASIC
1 bis 65535 Altair 4K BASIC , MICRO BASIC 1.3, 6800 Tiny BASIC, Tiny BASIC Extended
1 bis 99999 Dartmouth BASIC
1 bis 999999 SZELBAL

Gültige Zeilennummern variierten von Implementierung zu Implementierung, lagen aber typischerweise zwischen 1 und 32767.

Der größte Teil des von BASIC-Interpretern verwendeten Speichers wurde zum Speichern der Programmliste selbst verwendet. Nummerierte Anweisungen wurden in sequentieller Reihenfolge in einem als lineare Sammlung implementierten Sparse-Array gespeichert (technisch gesehen keine Liste , da keine Zeilennummer mehr als einmal vorkommen konnte).

Viele Tiny BASIC-Implementierungen speicherten Zeilen wie folgt:

  • Binäres Äquivalent der Zeilennummer (ein oder zwei Bytes, abhängig vom Bereich der unterstützten gültigen Zeilennummern)
  • ASCII-Quellanweisung (variable Länge)
  • Wagenrücklauf (ein Byte, auf 13 gesetzt)

Microsoft BASIC, beginnend mit Altair BASIC, speicherte Zeilen wie folgt:

  • Zeiger auf die nächste Zeile (zwei Bytes)
  • Binäres Äquivalent der Zeilennummer (zwei Bytes, ohne Vorzeichen)
  • Tokenisierte Quellanweisung (variable Länge)
  • Null (ein Byte, auf 0 gesetzt)

LLL BASIS:

  • Binäres Äquivalent der Zeilennummer (zwei Bytes)
  • Vorwärtszeiger auf die nächste Folgezeile (zwei Bytes)
  • Länge der ASCII-Quellanweisung (ein Byte)
  • ASCII-Quellanweisung (variable Länge)

Die maximale Länge einer Zeile variierte: 64 Zeichen in Palo Alto Tiny BASIC, einschließlich der Dezimaldarstellung der Zeilennummer; 120 Zeichen in Atari BASIC; 128 Zeichen in Integer BASIC; und 255 Zeichen in MS-BASIC (ohne Zeilennummer).

Dolmetscher durchsuchten das Programm Zeile für Zeile und sahen sich jede Zeilennummer an. Wenn sie niedriger als die neue Zeilennummer wäre, würden die späteren Zeilen im Speicher verschoben werden, um Platz für den Platz zu schaffen, der für die neue Zeile erforderlich ist. Wenn es dieselbe Zeilennummer und nicht genau dieselbe Länge wäre, müssten nachfolgende Zeilen nach vorne oder hinten verschoben werden. (Da die sequentielle Reihenfolge immer im Speicher beibehalten wurde, waren dies keine verknüpften Listen .)

In Tiny BASIC erforderten diese Suchen das Überprüfen jedes Bytes in einer Zeile: Der Zeiger wurde immer wieder inkrementiert, bis ein Wagenrücklauf gefunden wurde, um das Byte vor der nächsten Zeile zu finden. In Altair BASIC und LLL BASIC hingegen würde der Zeiger stattdessen auf den Beginn der nächsten sequentiellen Zeile gesetzt werden; Dies war viel schneller, erforderte jedoch zwei Bytes pro Zeile. Da angenommen wurde, dass Tiny BASIC-Programme eine Größe von 4 KB oder weniger haben, entsprach dies der allgemeinen Designphilosophie von Tiny BASIC, die Leistung zugunsten der Minimierung der Speichernutzung einzuschränken.

Wenn der Benutzer LISTin die Befehlszeile eintippte, durchlief das System mit einer dieser Methoden das Array von Zeilen, konvertierte die Zeilennummer zurück in das Dezimalformat und druckte dann den Rest des Textes in der Zeile, wobei alle Token decodiert wurden oder andere codierte Darstellungen.

Als Entwickler BASIC strukturierte Programmierkonstrukte hinzufügten, entfernten sie häufig die Notwendigkeit von Zeilennummern vollständig und fügten Texteditoren und später integrierte Entwicklungsumgebungen hinzu .

Variablen und Datentypen

Variablennamen

Dartmouth BASIC und HP-BASIC beschränkten Variablennamen auf höchstens zwei Zeichen (entweder ein einzelner Buchstabe oder ein Buchstabe gefolgt von einer Ziffer; zB A bis Z9). MS-BASIC erlaubte Variablennamen mit einem Buchstaben gefolgt von einem optionalen Buchstaben oder einer Ziffer (z. B. A bis ZZ), ignorierte jedoch nachfolgende Zeichen: Daher war es möglich, versehentlich ein Programm mit den Variablen "LOSS" und "LOAN" zu schreiben, was wäre als gleich behandelt; Das Zuweisen eines Werts zu "LOAN" würde den als "LOSS" beabsichtigten Wert stillschweigend überschreiben.

Integer BASIC unterstützte ungewöhnlicherweise Variablennamen beliebiger Länge (z. B. SUMME, GAMEPOINTS, PLAYER2), vorausgesetzt, es enthielt kein reserviertes Wort. Schlüsselwörter konnten in vielen frühen BASICs nicht in Variablen verwendet werden; „SCORE“ würde als „SC“ OR „E“ interpretiert, wobei OR ein Schlüsselwort war.

Zeichenfolgenvariablen werden in vielen Mikrocomputerdialekten von BASIC normalerweise dadurch unterschieden, dass an ihren Namen ein $ angehängt ist, und Werte werden häufig als Zeichenfolgen identifiziert, indem sie durch "doppelte Anführungszeichen" begrenzt werden. Spätere Implementierungen würden andere Satzzeichen verwenden, um den Typ einer Variablen anzugeben: A% für Ganzzahl, A! für einfache Genauigkeit und A# für doppelte Genauigkeit .

Mit Ausnahme von Arrays und (bei einigen Implementierungen) Strings und anders als bei Pascal und anderen strukturierteren Programmiersprachen erfordert BASIC nicht, dass eine Variable deklariert wird, bevor auf sie verwiesen wird. Werte sind normalerweise standardmäßig 0 (mit der entsprechenden Genauigkeit) oder die Nullzeichenfolge.

Symboltabelle

Da Tiny BASIC nur 26 Einzelbuchstaben-Variablen verwendete, konnten Variablen als Array gespeichert werden, ohne ihre entsprechenden Namen zu speichern, wobei eine Formel verwendet wurde, die auf dem ASCII-Wert des Buchstabens als Index basiert. Palo Alto Tiny BASIC ging noch einen Schritt weiter: Variablen 'Zwei-Byte-Werte befanden sich im RAM innerhalb des Programms, von Bytes 130 (ASCII 65, 'A', mal zwei) bis 181 (ASCII 90, 'Z', mal zwei). , plus eins für das zweite Byte).

Die meisten BASICs boten die Möglichkeit, weit mehr als 26 Variablen zu haben, und benötigten daher Symboltabellen , die Speicherkapazität nur für die verwendeten Variablen reservieren würden.

In LLL BASIC wurde jeder Eintrag in der Symboltabelle wie folgt gespeichert:

  • Variablenname (Byte 1: ASCII-Buchstabe; Byte 2: 0-9 ASCII oder binäre 0)
  • Vorwärtszeiger (2 Byte)
  • Wert (4 Bytes pro Element, 1 Element bei Skalarvariablen, ansonsten so viele Elemente wie DIMensioned für ein Array)

Im Gegensatz zu den meisten BASIC-Interpretern hatte UIUC BASIC eine Hash- Funktion, die nach dem Buchstaben des Variablen-/Funktions-/Array-Namens hashte und dann von dort aus eine lineare Suche durchführte. In UIUC BASIC lautete ein Symboltabelleneintrag:

  • Flag (Bit 0: Eintrag in Verwendung; Bit 6: benutzerdefinierte Funktion; Bit 7: Array}
  • Variablenname (Byte 1: ASCII-Buchstabe; Byte: 0-9 ASCII, " ", oder "(") oder Funktionsname (Byte 1: ASCII-Buchstabe oder Token 154 für FN; ASCII-Buchstabe)
  • Wert (5 Bytes):
    • Gleitkommawert für einen Skalar
    • Array-Definition (letzte 3 Bytes: obere Dimension der ersten, zweiten, dritten Dimension, alle beginnen bei 0)
    • Benutzerfunktion (erste 2 Bytes mit der Adresse der Funktion; Byte 3 ist Symboltabellenverschiebung zum Dummy-Variablenparameter in der Funktionsdefinition).

In Atari BASIC zeigte ein Satz von Zeigern (Adressen) verschiedene Daten an: Variablennamen wurden in der Variablennamenstabelle (VNTP – 82, 83 16 ) gespeichert und ihre Werte wurden in der Variablenwerttabelle gespeichert (zeigt auf VVTP – 86, 87 16 ). Durch die Umleitung der Variablennamen auf diese Weise benötigte ein Verweis auf eine Variable nur ein Byte, um ihren Eintrag in die entsprechende Tabelle zu adressieren. String-Variablen hatten einen eigenen Bereich.

Eine BBC BASIC-Leistungsoptimierung umfasste die Verwendung mehrerer verknüpfter Listen für die Variablensuche anstelle einer einzelnen langen Liste wie in Microsoft BASIC .

Speicherverwaltung

Aufgrund der geringen RAM-Kapazität der meisten Systeme, die ursprünglich zum Ausführen von BASIC-Interpretern verwendet wurden, mussten clevere Speicherverwaltungstechniken eingesetzt werden. Altair BASIC ermöglichte es Benutzern, den Platz für Trigonometriefunktionen zurückzugewinnen, wenn diese während einer Sitzung nicht verwendet wurden. PATB platzierte den Start der gängigsten Unterroutinen an den Anfang des Programms, damit sie vom 1-Byte- RST8080-Opcode anstelle des 3-Byte- CALLOpcodes verwendet werden können. In LLL BASIC belegten einige Variablen dieselben Speicherplätze, wenn die verschiedenen Variablen nur im Befehlsmodus oder nur zur Laufzeit verwendet wurden.

Video war oft speicheradressierbar, und bestimmte esoterische Funktionen waren durch Manipulieren von Werten bei bestimmten Speicherwerten verfügbar. Beispielsweise enthielten die Adressen 32 bis 35 die Abmessungen des Textfensters (im Gegensatz zum Grafikfenster) in Applesoft BASIC. Der POKEBefehl und die PEEKFunktion (angepasst von Maschinencode-Monitoren wie dem DECsystem-10- Monitor) boten direkten Speicherzugriff für eine Vielzahl von Zwecken, insbesondere zum Ändern spezieller speicherabgebildeter Hardwareregister , um bestimmte Funktionen des Computers wie die Eingabe zu steuern /Ausgabeperipherie. "Memory Maps" (im archaischen Sinne von Listen von Speicheradressen und ihren Funktionen) waren beliebt für die Verwendung mit PEEK und POKE , wobei eine der bekanntesten Memory Maps das von Ian Chadwick geschriebene Buch Mapping the Atari ist .

Einige Implementierungen des Microsoft-Interpreters, zum Beispiel diejenigen, die auf den TRS-80- Modellen I/III laufen, erforderten, dass der Benutzer die vom Interpreter zu verwendende Speichermenge angibt. Dies sollte ermöglichen, dass ein Speicherbereich für die Installation von Unterprogrammen in Maschinensprache reserviert wird, die vom interpretierten Programm aufgerufen werden können, um die Ausführungsgeschwindigkeit zu erhöhen. Wenn die Modelle I/III eingeschaltet werden, wird der Benutzer mit der Aufforderung „Speichergröße?“ begrüßt. für diesen Zweck.

Mathematik

Integer BASIC verwendet, wie der Name schon sagt, ganze Zahlen als Grundlage für sein Mathematikpaket. Diese wurden intern als 16-Bit-Zahl, Little-Endian gespeichert (wie die 6502). Dies ermöglichte einen Maximalwert für jede Berechnung zwischen –32767 und 32767. Berechnungen, die zu Werten außerhalb dieses Bereichs führten, erzeugten einen Fehler.

Die meisten Tiny BASIC-Interpreter (sowie Sinclair BASIC 4K) unterstützten Mathematik nur mit Ganzzahlen, ohne Gleitkommaunterstützung . Durch die Verwendung von Ganzzahlen konnten Zahlen in einem viel kompakteren 16-Bit-Format gespeichert werden, das schneller gelesen und verarbeitet werden konnte als die 32- oder 40-Bit-Gleitkommaformate, die in den meisten BASICs der Ära zu finden waren. Dies schränkte jedoch seine Anwendbarkeit als Allzwecksprache ein.

Business BASIC- Implementierungen wie Data General Business Basic waren ebenfalls nur Ganzzahlen, aber typischerweise mit einer höheren Genauigkeit: „doppelte Genauigkeit“, dh 32 Bit (plus oder minus 2.147.483.648) und „dreifache Genauigkeit“ (plus oder minus 1,4 x 10 ^14).

Manchmal wurden andere Computernummernformate verwendet. Beispielsweise unterstützte das MINOL Tiny BASIC nur unsigned bytes , und das MICRO-BASIC Tiny BASIC verwendete Binary Coded Decimal . Aber Gleitkommazahlen würden überwiegen.

Fließkomma

Eine Geschichte fasst zusammen, warum Gleitkommazahlen als so wichtig angesehen wurden. Auf dem ursprünglichen Prototyp des TRS-80-Modells I lief Li-Chen Wangs Public-Domain-Version von Tiny BASIC . Dies erforderte nur 2 KB Speicher für den Interpreter , wodurch durchschnittlich weitere 2 KB für Benutzerprogramme in üblichen 4-KB-Speicherlayouts früherer Maschinen frei blieben. Während einer Demonstration vor Führungskräften versuchte der damalige Präsident der Tandy Corporation , Charles Tandy, sein Gehalt einzugeben, was ihm jedoch nicht gelang. Dies lag daran, dass Tiny BASIC vorzeichenbehaftete 2-Byte-Ganzzahlen mit einem Maximalwert von 32.767 verwendete . Das Ergebnis war eine Anfrage nach Fließkomma- Mathematik für die Produktionsversion. Dies führte dazu, dass der vorhandene 16-Bit-Ganzzahlcode durch eine Version ersetzt wurde, die 32-Bit- Gleitkommazahlen mit einfacher Genauigkeit durch Tandy-Mitarbeiter Steve Leininger verwendete.

SCELBAL verwendete Gleitkommaroutinen , die 1975 von Wadsworth in Machine Language Programming für den 8008 veröffentlicht wurden, basierend auf einem 32-Bit-Format (4 Byte) für numerische Berechnungen, mit einer 23-Bit- Mantisse , einem 1-Bit-Zeichen für die Mantisse, einem 7- Bit-Exponent und 1-Bit-Vorzeichen für den Exponenten. Diese waren in umgekehrter Reihenfolge organisiert, mit dem niederwertigsten Byte der Mantisse im ersten Byte, gefolgt vom mittleren und dann höchstwertigen Byte mit dem Vorzeichen im hohen Bit. Der Exponent kam zuletzt, wieder mit dem Vorzeichen im hohen Bit. Das Handbuch enthält gut dokumentierten Assemblercode für das gesamte Mathematikpaket, einschließlich Einstiegspunkten und Verwendungshinweisen.

Berater wurden in der Regel mit der Gleitkommaarithmetik befasst , einem Fachbereich, der für die wissenschaftlichen und kommerziellen Anwendungen, die Mainframes geprägt hatten, gut untersucht und entwickelt wurde. Als Allen und Gates Altair BASIC entwickelten, überzeugte ihr Harvard-Student Monte Davidoff sie, von der Integer-Arithmetik abzuweichen . Sie stellten Davidoff ein, um ein Floating-Point-Paket zu schreiben, das immer noch in die 4-KB-Speichergrenzen passt. Steve Wozniak wandte sich an Roy Rankin von der Stanford University , um die transzendentalen Funktionen LOG, LOG10 und EXP zu implementieren; Wozniak hat jedoch nie die Gleitkommaunterstützung für Integer BASIC hinzugefügt. LLL BASIC , das an der University of Idaho von John Dickenson, Jerry Barber und John Teeter entwickelt wurde, wandte sich an David Mead, Hal Brand und Frank Olken für ihre Gleitkommaunterstützung. Für UIUC BASIC wurde ein Datapoint 2200- Gleitkommapaket lizenziert.

Im Gegensatz dazu waren Timesharing-Systeme oft auf Hardware angewiesen. Zum Beispiel wurde das GE-235 speziell für die Implementierung der ersten Version von Dartmouth BASIC ausgewählt, weil es eine " Auxiliary Arithmetic Unit " für Gleitkomma- und Double-Precision-Berechnungen enthielt.

Frühe Interpreter verwendeten 32-Bit-Formate, ähnlich dem binären Gleitkommaformat IEEE 754 mit einfacher Genauigkeit , das Folgendes angibt:

Hier ist der Wert 0,15625, wie er in diesem Format gespeichert ist: Float-Beispiel.svg

Während 32-Bit-Formate in dieser Zeit üblich waren, übernahmen spätere Versionen von BASIC, beginnend mit Microsoft BASIC für den MOS 6502 , im Allgemeinen ein 40-Bit-Format (fünf Byte) für zusätzliche Präzision.

Operatoren und Funktionen

Infix-Operatoren enthalten normalerweise +(Addition), -(Subtraktion), *(Multiplikation), /(Division) und Exponenten, die das ^Zeichen verwenden. Zu den relativen Operationen gehörten der Standardsatz von =, >, <, >=, <=, und für "ungleich" entweder <>oder das von HP-TSB inspirierte #. Binäre Operatoren wie AND, ORund NOTwaren nicht in jeder Implementierung vorhanden, und einige verwendeten boolesche Algebra , andere nicht.

Die Erstausgabe von Dartmouth BASIC enthielt die folgenden Funktionen: ABS( Absolutwert ), ATN( Arkustangens ), COS( Kosinus ), EXP( e potenziert), INT(jeden Bruchwert abschneiden, eine ganze Zahl zurückgeben), LOG( Logarithmus ), RND( Pseudozufallszahlengenerator ) . , SIN( Sinus ), SQR( Quadratwurzel ) und TAN( Tangens ). Es enthielt auch die DEF FNAnweisung, einzeilige Funktionen zu deklarieren, die dann als FNA(), FNB(), usw. bezeichnet würden.

Die RNDFunktion war die am weitesten verbreitete Funktion, die in frühen BASICs unterstützt wurde, obwohl die Implementierungen unterschiedlich waren:

  • Dartmouth's RNDignorierte den Parameter und gab immer eine neue Pseudozufallszahl zwischen 0 und 1 zurück.
  • Altair BASIC und spätere Microsoft BASICs verwendeten das Vorzeichen des Parameters: Für RND(X) beginnt „X<0 eine neue Folge von Zufallszahlen mit X. Der Aufruf von RND mit demselben X startet dieselbe Zufallszahlenfolge. X=0 ergibt die letzte generierte Zufallszahl."
  • Da es nicht möglich ist, eine Dezimalzahl zurückzugeben, verwendeten nur ganzzahlige BASICs stattdessen den Wert des Parameters, typischerweise um eine Obergrenze für die Randomisierung anzugeben. würde beispielsweise in Integer BASIC selbst RND(6)+1einen Würfelwurf simulieren und Werte von 1 bis 6 zurückgeben.
  • Im Gegensatz dazu war der Parameter in einigen TRS-80 BASICs die obere Grenze, die zurückgegeben werden konnte; würde beispielsweise RND(6)einen Wert von 1 bis 6 zurückgeben und RND(1)würde immer 1 zurückgeben.

Arrays

Die zweite Version von Dartmouth BASIC unterstützte Matrizen und Matrixoperationen , die für die Lösung von Sätzen simultaner linearer algebraischer Gleichungen nützlich sind; MATMatrixoperationen wie Zuweisung, Addition, Multiplikation (kompatibler Matrixtypen) und Auswertung einer Determinante wurden unterstützt.

Im Gegensatz dazu hatte Tiny BASIC, wie es ursprünglich entworfen wurde, nicht einmal Arrays, aufgrund des begrenzten Hauptspeichers, der auf frühen Mikrocomputern verfügbar war , oft 4 KB, der sowohl den Interpreter als auch das BASIC-Programm enthalten musste. Palo Alto Tiny BASIC fügte ein einzelnes Array von Integern variabler Länge hinzu, dessen Größe nicht dimensioniert werden musste, aber RAM verwendete, das nicht vom Interpreter oder der Programmauflistung verwendet wurde, A().

SCELBAL unterstützte mehrere Arrays, aber zusammengenommen konnten diese Arrays nicht mehr als 64 Elemente enthalten. Integer BASIC-unterstützte Arrays mit einer einzigen Dimension, deren Größe nur durch den verfügbaren Speicher begrenzt ist. Tiny BASIC Extended unterstützte zweidimensionale Arrays von bis zu 255 x 255. Altair BASIC 4K unterstützte nur Arrays (eine Dimension), während die 8K-Version Matrizen mit bis zu 34 Dimensionen unterstützte.

Viele Implementierungen unterstützten die Dartmouth-BASIC-Praxis, bei der keine Dimensionierung eines Arrays erforderlich war. In diesem Fall wurde angenommen, dass es 11 Elemente (0 bis 10) hat. B. {{{1}}}würde als Nebeneffekt das 11-Elemente-Array erzeugen.

Der Dope-Vektor von Arrays variierte von Implementierung zu Implementierung. Zum Beispiel der Dope-Vektor eines Altair BASIC 4K-Arrays:

  • Variablenname (2 Byte)
  • Größe der Array-Elemente in Bytes (2 Bytes, also 4 mal die Anzahl der Elemente, also die Obergrenze plus eins)

Dann die Array-Werte selbst:

  • Element 0 Wert (4 Byte)
  • Element 1 Wert (4 Byte)
  • ...
  • Element N-Wert (4 Byte)

Implementierungen, die Matrizen unterstützten, mussten die Anzahl der Dimensionen und die Obergrenze jeder Dimension aufzeichnen. Da einige Interpreter nur einen Datentyp hatten (entweder Fließkomma oder Ganzzahl), musste der Dope-Vektor lediglich die Anzahl der Dimensionen und die Obergrenze jeder Dimension aufzeichnen. Interpreter mit mehreren Datentypen mussten den Datentyp des Arrays aufzeichnen.

Obwohl Microsoft und andere BASICs Matrizen unterstützten, waren Matrixoperationen nicht eingebaut, sondern mussten explizit für Array-Elemente programmiert werden.

Saiten

Dem ursprünglichen Dartmouth BASIC, einigen seiner unmittelbaren Nachkommen und Tiny BASIC-Implementierungen fehlte die Handhabung von Zeichenfolgen. Es entwickelten sich zwei konkurrierende Schulen für die Handhabung von Zeichenfolgen, die von HP und DEC entwickelt wurden, obwohl andere Ansätze später kamen. Diese erforderten unterschiedliche Umsetzungsstrategien.

String-Handling in prominenten BASIC-Interpretern
Dialekt von BASIC Typ Teilzeichenfolgen
HP Time-Shared BASIC Feste Länge Schneiden
DEZ BASIC-PLUS Variable Länge Funktionen
Dartmouth BASIC Vierte Ausgabe Variable Länge Array-Indizierung
Winziges BASIC Ganzzahliges Array Array-Indizierung

Die einfachste Zeichenfolgenbehandlung kopierte HP Time-Shared BASIC und definierte Zeichenfolgenvariablen als Arrays von Zeichen, die DIMvor der Verwendung geändert werden mussten. Zeichenfolgen in HP TSB werden als ein Array von Zeichen mit insgesamt bis zu 72 Zeichen behandelt und nicht als ein einzelnes Objekt mit mehreren Zeichen. Standardmäßig wird ihnen ein Zeichen im Speicher zugewiesen, und wenn eine längere Zeichenfolge benötigt wird, müssen sie deklariert werden. Beispielsweise wird eine Zeichenfolge eingerichtet, die maximal 10 Zeichen enthalten kann. DIM A$[10]

Auf Teilstrings innerhalb von Strings wird mit einer „ Slicing “-Notation zugegriffen : oder , wobei der Teilstring mit dem Zeichen ganz links beginnt, das durch den Index L angegeben ist, und bis zum Zeichen ganz rechts fortgesetzt wird, das durch den Index R angegeben ist, oder die Form, in der der Teilstring mit dem Zeichen ganz links beginnt angegeben durch den Index L und wird bis zum Ende der Zeichenfolge fortgesetzt. TSB akzeptiert () oder [] austauschbar. Array- und Substring-Indizes beginnen mit 1. A$(L,R)A$[L,R]A$[L]

Dies steht in scharfem Kontrast zu BASICs, die dem DEC-Muster folgen und Funktionen wie LEFT$(), MID$(), und verwenden RIGHT$(), um auf Teilstrings zuzugreifen. Später von ANSI BASIC übernommen, kann die Notation von HP auch auf der Zielseite einer LETor INPUT-Anweisung verwendet werden, um einen Teil eines vorhandenen Zeichenfolgenwerts zu ändern, z. B. oder , was mit frühen Implementierungen von nicht möglich ist . 100 A$[3,5]="XYZ"120 B$[3]="CHANGE ALL BUT FIRST TWO CHARS"LEFT$/MID$/RIGHT$

Spätere Versionen von Dartmouth BASIC enthielten String-Variablen. Sie verwendeten jedoch nicht die LEFT$/MID$/RIGHT$Funktionen zum Bearbeiten von Zeichenfolgen, sondern verwendeten stattdessen den CHANGEBefehl, der die Zeichenfolge in und aus äquivalenten ASCII-Werten konvertierte. (Später unverändert von DEC übernommen und von HP angepasst, wodurch das Schlüsselwort in geändert wurde CONVERT.) Außerdem könnte man das einfache Anführungszeichen verwenden, um eine numerische Konstante in ein ASCII-Zeichen umzuwandeln, wodurch man eine Zeichenfolge in Teilen aufbauen könnte; A$='23 '64 '49 "DEF"erzeugte die Zeichenfolge "ABCDEF", ohne dass die Funktion benötigt wurde CHR$(). Dartmouth BASIC Sixth Edition unterstützt SEG$(für MID$) und POS(für INSTR).

Integer BASIC, North Star BASIC und Atari BASIC ahmten den Ansatz von HP nach, was wiederum im Gegensatz zu dem Stil steht, der in BASICs zu finden ist, die von DEC abgeleitet sind , einschließlich Microsoft BASIC , wo Zeichenfolgen ein intrinsischer Typ mit variabler Länge sind.

Einige der Tiny BASIC- Implementierungen unterstützten ein oder mehrere vordefinierte Integer-Arrays, die zum Speichern von Zeichencodes verwendet werden konnten, vorausgesetzt, die Sprache hatte Funktionen zum Ein- und Ausgeben von Zeichencodes (z. B. hatte Astro BASICKP und TVfür diesen Zweck).

Müllabfuhr

Ein Beispiel für externe Fragmentierung

Dass Strings unabhängig von der Anzahl der darin verwendeten Zeichen eine feste Menge an Speicher verwenden, bis zu einem Maximum von 255 Zeichen, hat möglicherweise Speicher verschwendet, hatte aber den Vorteil, dass die Notwendigkeit der Implementierung der Garbage Collection des Heap , einer Form der automatischen , vermieden wurde Speicherverwaltung zur Rückgewinnung von Speicher, der von Zeichenfolgen belegt ist, die nicht mehr verwendet werden. Freigegebene kurze Zeichenfolgen könnten in der Mitte anderer Zeichenfolgen gespeichert werden, wodurch verhindert wird, dass dieser Speicher verwendet wird, wenn eine längere Zeichenfolge benötigt wird.

Auf frühen Mikrocomputern mit ihrem begrenzten Speicher und ihren langsamen Prozessoren konnte die BASIC-Garbage-Collection oft scheinbar zufällige, unerklärliche Pausen mitten im Programmbetrieb verursachen. Einige BASIC-Interpreter, wie z. B. Applesoft BASIC in der Apple II- Familie, scannten wiederholt die String-Deskriptoren nach dem String mit der höchsten Adresse, um ihn in Richtung des hohen Speichers zu komprimieren, was zu einer O(n 2 ) -Leistung führte, die minutenlang dauern konnte Pausen bei der Ausführung von String-intensiven Programmen. Die Garbage Collection war in anderen Versionen von Microsoft BASIC notorisch langsam oder sogar defekt. Einige Betriebssysteme, die unterbrechungsgesteuerte Hintergrundaufgaben unterstützten, wie z. B. TRSDOS/LS-DOS 6.x auf dem TRS-80 Model 4 , nutzten Zeiträume der Benutzerinaktivität aus (z. B. die Millisekunden langen Zeiträume zwischen Tastenanschlägen und Zeiträume nach der Aktualisierung des Videobildschirms ), um die Garbage Collection während der Ausführung des BASIC-Programms zu verarbeiten.

Andere Funktionalität

Grafik und Ton

Die meisten BASIC-Interpreter unterschieden sich stark in Grafik und Sound, die sich von Mikrocomputer zu Mikrocomputer dramatisch unterschieden. Altair BASIC fehlten jegliche Grafik- oder Soundbefehle, ebenso wie die Tiny BASIC-Implementierungen, während Integer BASIC einen reichhaltigen Satz lieferte.

Level I BASIC für das TRS-80 hatte so wenig Set wie möglich: CLS, für CLear Screen; SET(X,Y), die eine Stelle auf dem Display beleuchtete; RESET(X,Y), wodurch es ausgeschaltet wurde; und POINT(X,Y), die 1 zurückgab, wenn ein Ort beleuchtet war, 0, wenn dies nicht der Fall war. Die Koordinaten konnten beliebige Ausdrücke sein und reichten von 0 bis 127 für die X-Achse und 0 bis 47 für die Y-Achse . Es wurde nur die Schwarz-Weiß-Anzeige unterstützt.

Im Gegensatz dazu unterstützte Integer BASIC Farbgrafiken, einfachen Sound und Gamecontroller. Der Grafikmodus wurde mit der Anweisung eingeschaltet GRund mit ausgeschaltet TEXT. Das Zeichnen war modal und begann normalerweise mit der Ausgabe eines Befehls zum Ändern der Farbe, was durch Setzen einer Pseudovariablen erreicht wurde. COLOR=12würde die Zeichnungsfarbe auf 12 hellgrün setzen. Man könnte dann PLOT 10,10einen einzelnen Fleck dieser Farbe erzeugen, HLIN 0,39 AT 20eine horizontale Linie in Zeile 20 zeichnen, die den Bildschirm überspannt, oder VLIN 5,15 AT 7eine kürzere vertikale Linie in Spalte 7 ziehen. A=SCRN X,Ydie Farbe des Bildschirms bei X, Y zurückgeben.

Textblock-Grafiksatz des ZX-81

Hardwarehersteller haben oft proprietäre Unterstützung für Halbgrafiken , einfache Formen und als Sonderzeichen behandelte Symbole integriert . Beispiele waren die Blockgrafiken des ZX-81 und die Kartensymbole ♠, ♣, ♥ und ♦ im PETSCII- Zeichensatz von Commodore International . BASIC könnte diese Symbole mit erzeugen . PRINT CHR$();

Microsoft hat IBM BASIC viele Grafikbefehle hinzugefügt : LINE, PSET(Pixel SET), PRESET(Pixel RESET), GET(speichert ein Rechteck des Bildschirms in einem Array), PUT(zeigt ein gespeichertes rechteckiges Segment an), LOCATE(um den Textcursor zu bewegen) und DRAW, das Formen mit einer LOGO -ähnlichen Syntax skizziert. Bill Gates und Neil Konzen schrieben DONKEY.BAS , ein gebündeltes Spiel, um die Farbgrafik und den Sound des Interpreten zu demonstrieren .

Input-Output

Ein weiterer Bereich, in dem die Implementierungen voneinander abwichen, waren Schlüsselwörter für den Umgang mit Medien (Kassetten und Disketten), Tastatureingaben und Gamecontroller (falls vorhanden).

Da ROM-basierte BASIC-Interpreter oft als Shells zum Laden in andere Anwendungen fungierten, fügten Implementierungen Befehle hinzu, die sich auf Kassettenbänder (z. B. CLOADund CSAVE), binäre Plattendateien (z. B. BLOAD, BSAVE, und BRUN) und BASIC-Programme auf der Platte (z. B. LOAD, SAVE, und CATALOG). Business BASIC- Implementierungen fügten Befehle für Dateien mit wahlfreiem Zugriff hinzu. (Sogar ROM-basierte BASIC-Interpreter waren nicht als Betriebssysteme konzipiert oder vorgesehen, und kleineren Mikrocomputern fehlte einfach jegliches Betriebssystem.)

Dartmouth BASIC fehlte ein Befehl, um Eingaben von der Tastatur zu erhalten, ohne das Programm anzuhalten. Um Videospiele zu unterstützen , fügten BASICs dafür proprietäre Befehle hinzu: INKEY$war eine Funktion in Microsoft BASIC , die eine leere Zeichenfolge zurückgab, wenn keine Taste gedrückt wurde, oder ansonsten ein einzelnes Zeichen; KP(für KeyPress ) gab den ASCII-Wert der Eingabe in Astro BASIC zurück .

Palo Alto Tiny BASIC fehlten Zeichenfolgen, aber Benutzer konnten mathematische Ausdrücke als Antwort auf INPUTAnweisungen eingeben. Durch das Setzen von Variablen, wie z. B. Y=1; N=0, könnte der Benutzer bei einer Ja/Nein-Aufforderung mit „Y“ oder „1“ oder sogar „3*2-5“ antworten.

Einige Systeme unterstützten Gamecontroller. Astro BASIC wird unterstützt JX()(angegebene horizontale Position des Joysticks), JY()(vertikale Position des Joysticks), KN()(Knopfstatus) und TR()(Triggerstatus). Integer BASIC unterstützte einen Gamecontroller , einen Paddle-Controller , der zwei Controller an einem einzigen Anschluss hatte. Die Position des Controllers könnte mit der PDLFunktion gelesen werden, indem die Controller-Nummer 0 oder 1 übergeben wird, wie A=PDL(0):PRINT A, und einen Wert zwischen 0 und 255 zurückgibt.

Integer BASIC fehlten alle benutzerdefinierten Eingabe-/Ausgabebefehle und auch die DATAAnweisung und die zugehörige READ. Um Daten in ein und aus einem Programm zu bekommen, wurde die Input/Output-Funktionalität zu einem ausgewählten Kartensteckplatz mit dem PR#xund umgeleitet IN#x, was die Ausgabe oder Eingabe (jeweils) auf den nummerierten Steckplatz umleitete. Fortan konnten Daten mit herkömmlichen PRINTBefehlen an die Karte gesendet und mit von ihr gelesen werden INPUT. Die Erzeugung von Tönen wurde durch PEEKdie speicherabgebildete Position eines einfachen "Piepsers", −16336, erreicht.

Strukturierte Programmierung

Während Kemeny und Kurtz die strukturierte Programmierung durch die Beispiele von ALGOL 58 und ALGOL 60 kannten, als sie BASIC entwarfen, passten sie nur die for-Schleife an und ignorierten die else-Anweisung, while-Schleife, Wiederholungsschleife, benannte Prozeduren, Parameter Übergabe und lokale Variablen. Infolgedessen unterschieden sich nachfolgende Dialekte oft dramatisch in der Formulierung, die für strukturierte Techniken verwendet wurde. Zum Beispiel WHILE...WEND(in Microsoft BASIC ), WHILE...ENDWHILE(in Turbo-Basic XL ) DO...LOOP WHILEund sogar WHILEKlauseln (beide in BASIC-PLUS ).

Von den Tiny BASIC-Implementierungen bot nur die National Industrial Basic Language (NIBL) einen Schleifenbefehl irgendeiner Art, DO/UNTIL. Und das, obwohl der Erfinder von Tiny BASIC, Dennis Allison, öffentlich den Zustand von BASIC beklagte.

BBC BASIC war einer der ersten Mikrocomputer-Interpreter, der eine strukturierte BASIC-Programmierung mit benannten DEF PROC/ DEF FN-Prozeduren und -Funktionen, REPEAT UNTILSchleifen und IF THEN ELSEStrukturen anbot, die von COMAL inspiriert waren . BASICs der zweiten Generation – zum Beispiel SBASIC (1976), BBC BASIC (1981), True BASIC (1983), Beta BASIC (1983), QuickBASIC (1985) und AmigaBASIC (1986) – führten eine Reihe von Funktionen in das Sprache, hauptsächlich im Zusammenhang mit strukturierter und prozedurorientierter Programmierung. Normalerweise wird die Zeilennummerierung aus der Sprache weggelassen und durch Bezeichnungen (für GOTO ) und Verfahren ersetzt , um ein einfacheres und flexibleres Design zu fördern. Außerdem wurden Schlüsselwörter und Strukturen zur Unterstützung von Wiederholung, Auswahl und Verfahren mit lokalen Variablen eingeführt.

Das folgende Beispiel ist in Microsoft QBASIC, Microsofts dritter Implementierung eines strukturierten BASIC (nach Macintosh BASIC im Jahr 1984 und Amiga BASIC im Jahr 1985).

REM QBASIC example

REM Forward declaration - allows the main code to call a
REM    subroutine that is defined later in the source code
DECLARE SUB PrintSomeStars (StarCount!)

REM Main program follows
DO
   INPUT "How many stars do you want? (0 to quit) ", NumStars
   CALL PrintSomeStars(NumStars)
LOOP WHILE NumStars>0
END

REM subroutine definition
SUB PrintSomeStars (StarCount)
   REM This procedure uses a local variable called Stars$
   Stars$ = STRING$(StarCount, "*")
   PRINT Stars$
END SUB

Objektorientierte

Anfängliche Unterstützung für objektorientierte Programmierung bot nur die Wiederverwendung von Objekten, die mit anderen Sprachen erstellt wurden, wie beispielsweise Visual Basic und PowerBASIC das Windows Component Object Model unterstützten . Als sich BASIC-Interpreter weiterentwickelten, fügten sie Unterstützung für objektorientierte Funktionen wie Methoden , Konstruktoren , dynamische Speicherzuweisung , Eigenschaften und temporäre Zuweisung hinzu.

Inklusive Assembler

Die Integer BASIC ROMs enthielten auch einen Maschinencode-Monitor , einen "Mini- Assembler " und einen Disassembler, um Programme in Assemblersprache zu erstellen und zu debuggen .

Eines der einzigartigen Merkmale von BBC BASIC war der Inline-Assembler , der es Benutzern ermöglichte , Programme in Assemblersprache für den 6502 und später für Zilog Z80 , NS32016 und ARM zu schreiben . Der Assembler wurde vollständig in den BASIC-Interpreter integriert und damit gemeinsam genutzte Variablen, die zwischen den Zeichen [ und ] eingeschlossen, über *SAVE und *LOAD gespeichert und über die CALL- oder USR-Befehle aufgerufen werden konnten. Dies ermöglichte es Entwicklern, nicht nur Code in Assemblersprache zu schreiben, sondern auch BASIC-Code, um Assemblersprache auszugeben, wodurch es möglich wurde, Techniken zur Codegenerierung zu verwenden und sogar einfache Compiler in BASIC zu schreiben.

Ausführung

Debuggen

Wie in den meisten BASICs wurden Programme mit dem RUNBefehl gestartet und konnten wie üblich auf eine bestimmte Zeilennummer wie RUN 300. Die Ausführung konnte jederzeit mit Ctrl+ C(oder BREAK wie beim TRS-80) angehalten und dann mit CONTinue ( CONin Integer BASIC) neu gestartet werden. Unter Ausnutzung der einzigartigen Fähigkeiten interpretierter Programme (Code wird im Gegensatz zu Compilern Anweisung für Anweisung in Echtzeit verarbeitet ) könnte der Benutzer an der Konsole variable Daten mit der PRINT-Anweisung untersuchen und diese Daten im laufenden Betrieb ändern , dann die Programmausführung fortsetzen.

Für die schrittweise Ausführung kann die TRONor- TRACEAnweisung an der Eingabeaufforderung verwendet oder in das Programm selbst eingefügt werden. Beim Einschalten wurden Zeilennummern für jede vom Programm besuchte Zeile ausgedruckt. TROFFMit oder kann die Funktion wieder ausgeschaltet werden NOTRACE.

Einige Implementierungen wie die Microsoft-Interpreter für die verschiedenen Marken von TRS-80 enthielten den Befehl ON ERROR GOSUB. Dies würde die Programmausführung zur speziellen Fehlerbehandlung auf eine bestimmte Zeilennummer umleiten.

Im Gegensatz zu den meisten BASICs scannte Atari BASIC die gerade eingegebene Programmzeile und meldete sofort Syntaxfehler. Wenn ein Fehler gefunden wurde, zeigte der Editor die Zeile erneut an und markierte den Text in der Nähe des Fehlers in inverser Darstellung .

In vielen Interpretern, einschließlich Atari BASIC, werden Fehler als numerische Codes angezeigt, wobei die Beschreibungen im Handbuch abgedruckt sind. Viele MS-BASIC verwendeten zweistellige Abkürzungen (z. B. SN für SYNTAX ERROR). Palo Alto Tiny BASIC und Level I BASIC verwendeten drei Wörter für Fehlermeldungen: "WAS?" bei Syntaxfehlern "HOW?" für Laufzeitfehler wie GOTOs zu einer nicht existierenden Zeile oder numerische Überläufe und "SORRY" für Speicherprobleme.

Parsing

Während die BASIC-Sprache eine einfache Syntax hat, ist dies bei mathematischen Ausdrücken nicht der Fall, da verschiedene Vorrangregeln für Klammern und verschiedene mathematische Operatoren unterstützt werden. Um solche Ausdrücke zu unterstützen, muss ein rekursiver Abstiegsparser implementiert werden .

Dieser Parser kann auf verschiedene Arten implementiert werden:

  • Als virtuelle Maschine, wie oben für viele Tiny BASIC-Implementierungen diskutiert. Der Wert der Tiny BASIC-Initiative lag in der Spezifizierung einer Implementierung eines Parsers.
  • Als endlicher Automat , wie in UIUC BASIC IUC, wo es als Steuertabelle implementiert wurde .
  • Direkt im Code, wie in Palo Alto Tiny BASIC und Integer BASIC. In Integer BASIC verwendete der Laufzeitinterpreter zwei Stacks für die Ausführung: einen für Anweisungsschlüsselwörter und den anderen für die Auswertung der Parameter. Jeder Anweisung wurden zwei Prioritäten zugewiesen: eine, die angab, wo sie in einer mehrstufigen Operation auftreten sollte, wie eine Reihe mathematischer Operationen, um die Reihenfolge der Operationen bereitzustellen , und eine andere, die vorschlug, wann die Auswertung erfolgen sollte, z. B. die Berechnung interner Werte von a Klammerformel. Wenn Variablen angetroffen wurden, wurde ihr Name geparst und dann in der Symboltabelle nachgeschlagen. Wenn es nicht gefunden wurde, wurde es am Ende der Liste hinzugefügt. Die Adresse des Speichers der Variablen, vielleicht frisch erstellt, wurde dann auf dem Bewertungsstapel abgelegt.

Leistung

Die Bandbreite der Designentscheidungen, die in die Programmierung eines BASIC-Interpreters einflossen, wurde oft durch Leistungsunterschiede offenbart.

Line-Management-Implementierungen wirkten sich häufig auf die Leistung aus und verwendeten typischerweise die lineare Suche . Das Begrenzen jeder Zeile mit einem CR würde dazu führen, dass ein GOTO oder GOSUB zu einer späteren Zeile länger dauern würde, da das Programm alle Zeilen durchlaufen müsste, um die Zielzeilennummer zu finden. In einigen Implementierungen wie Atari BASIC wurde die Länge jeder Zeile aufgezeichnet und nach der Zeilennummer gespeichert, sodass das Programm nicht jedes Zeichen der Zeile scannen musste, um den nächsten Wagenrücklauf zu finden. Viele Implementierungen würden immer nach einer Zeilennummer suchen, zu der vom Start des Programms verzweigt werden soll; MS-BASIC würde ab der aktuellen Zeile suchen, wenn die Zielzeilennummer größer wäre. Pittman fügte seinem 6800 Tiny BASIC einen Patch hinzu, um eine binäre Suche zu verwenden.

Die ausschließliche Arbeit mit ganzzahliger Mathematik bietet einen weiteren großen Geschwindigkeitsschub. Da viele Computer-Benchmarks der Ära klein waren und oft einfache Berechnungen durchführten, die keine Fließkommazahlen erforderten, schlug Integer BASIC die meisten anderen BASICs. Bei einem der frühesten bekannten Mikrocomputer-Benchmarks, den Rugg/Feldman-Benchmarks , war Integer BASIC weit mehr als doppelt so schnell wie Applesoft BASIC auf derselben Maschine. In Byte Sieve , wo Mathematik weniger wichtig war, aber Array-Zugriff und Schleifenleistung dominierten, dauerte Integer BASIC 166 Sekunden, während Applesoft 200 brauchte. Es erschien nicht im Creative Computing Benchmark , der erstmals 1983 veröffentlicht wurde, zu diesem Zeitpunkt Integer BASIC wurde nicht mehr standardmäßig geliefert. Die folgenden Testreihen, die den beiden Originalartikeln von Rugg/Feldman entnommen sind, zeigen die Leistung von Integer im Vergleich zum von MS abgeleiteten BASIC auf derselben Plattform.

System Zentralprozessor BASIC Prüfung 1 Prüfung 2 Prüfung 3 Prüfung 4 Prüfung 5 Prüfung 6 Prüfung 7
Apfel II 6502 bei 1 MHz Ganzzahl BASIC 1.3 3.1 7.2 7.2 8.8 18.5 28.0
Apfel II 6502 bei 1 MHz Applesoft BASIC 1.3 8.5 16.0 17.8 19.1 28.6 44.8

Theoretisch hätte Atari BASIC schneller laufen sollen als moderne BASICs nach dem Microsoft-Muster. Da der Quellcode bei der Eingabe vollständig tokenisiert ist, sind die gesamten Tokenisierungs- und Parsing-Schritte bereits abgeschlossen. Sogar komplexe mathematische Operationen sind sofort einsatzbereit, wobei alle numerischen Konstanten bereits in das interne 48-Bit-Format konvertiert sind und Variablenwerte anhand der Adresse nachgeschlagen werden, anstatt danach gesucht zu werden. Trotz dieser theoretischen Vorteile ist Atari BASIC in der Praxis langsamer als andere Heimcomputer- BASICs, oft um einen großen Betrag. In der Praxis hat sich dies nicht bestätigt. Bei zwei weit verbreiteten Benchmarks der Ära, dem Sieve of Eratosthenes des Byte- Magazins und dem von David H. Ahl verfassten Creative Computing-Benchmark- Test , landete der Atari in Bezug auf die Leistung fast am Ende der Liste und war viel langsamer als der zeitgenössische Apple II oder Commodore PET , obwohl er die gleiche CPU hat, aber ungefähr doppelt so schnell läuft wie beide. Es endete hinter relativ langsamen Maschinen wie dem Sinclair ZX81 und sogar einigen programmierbaren Taschenrechnern.

Der größte Teil der Langsamkeit der Sprache rührte von drei Problemen her. Das erste ist, dass die Gleitkomma-Mathematikroutinen schlecht optimiert waren. Im Ahl-Benchmark war eine einzelne Exponentenoperation, die intern die langsame Multiplikationsfunktion überschleift, für einen Großteil des schlechten Abschneidens der Maschine verantwortlich. Zweitens war die Konvertierung zwischen dem internen Fließkommaformat und den 16-Bit-Ganzzahlen, die in bestimmten Teilen der Sprache verwendet werden, relativ langsam. Intern wurden diese Ganzzahlen für Zeilennummern und Array-Indizierung sowie für einige andere Aufgaben verwendet, aber Zahlen im tokenisierten Programm wurden immer im binärcodierten Dezimalformat (BCD) gespeichert. Immer wenn einer davon auftritt, beispielsweise in der Zeilennummer in GOTO 100, muss der tokenisierte BCD-Wert in eine ganze Zahl konvertiert werden, eine Operation, die bis zu 3500 Mikrosekunden dauern kann. Andere BASICs vermieden diese Verzögerung, indem sie die Konvertierung von Zahlen, die möglicherweise nur ganze Zahlen sein konnten, wie die Zeilennummer nach einem GOTO, in Sonderfällen umwandelten und zu einem speziellen ASCII-zu-Ganzzahl-Code wechselten, um die Leistung zu verbessern. Drittens implementierte Atari BASIC Verzweigungen und FORSchleifen. Um eine Verzweigung in a GOTOoder auszuführen GOSUB, durchsucht der Interpreter das gesamte Programm nach der passenden Zeilennummer, die er benötigt. Eine geringfügige Verbesserung, die in den meisten von Microsoft abgeleiteten BASICs zu finden ist, besteht darin, die Zielzeilennummer mit der aktuellen Zeilennummer zu vergleichen und von diesem Punkt aus vorwärts zu suchen, wenn sie größer ist, oder von oben zu beginnen, wenn sie kleiner ist. Diese Verbesserung fehlte in Atari BASIC. Im Gegensatz zu fast allen anderen BASICs, die einen Zeiger auf die Position von FORauf einem Stapel schieben würden, so dass, wenn es erreicht hat, es in einer einzigen Verzweigungsoperation NEXTleicht zu wieder zurückkehren könnte , hat Atari BASIC stattdessen die Zeilennummer verschoben. FORDies bedeutete, dass das System jedes Mal, wenn ein NEXTgefunden wurde, das gesamte Programm durchsuchen musste, um die entsprechende FORZeile zu finden. Infolgedessen verursachen alle Schleifen in einem Atari-BASIC-Programm einen großen Leistungsverlust im Vergleich zu anderen BASICs.

Siehe auch

Anmerkungen

Verweise

Literaturverzeichnis

Weiterlesen

Quellcode und Designdokumente, in chronologischer Reihenfolge der Veröffentlichung der BASIC-Implementierungen: