Die Krankheit BASIC
Die Anregung zu dem heutigen Retro-Blog lieferte mir dieser Kommentar von „Carsten“ zum ZX81, in dem er schreibt:
„Wer damals die Logik eines Basicprogramms verstanden hat, kann auch heute Hochsprachen wie C oder Python leicht erlernen.“
Ich habe wie – wahrscheinlich die meisten, die sich einen „Homecomputer“, wie das damals hieß gekauft haben und ihn nicht zum Spielen benutzten – zuerst BASIC gelernt. Der Interpreter war ja in fast allen Geräten fest eingebaut. Ich habe mir dann Z80 Assembler mit einem Buch angeeignet, in dem auch ein Assembler in BASIC als Listing, meist in schlechter Qualität, da man die Ausdrucke der Matrixdrucker übernahm, war. Auch so eine Spezialität dieser Zeit die einem heute so bizarr vorkommt: Damals waren Computerzeitschriften voll mit Listings, also ausgedruckten Programmen, die man abtippte. Da Fehler bei BASIC erst auftraten, wenn das Programm lief, hatten einige Zeitschriften zum Eintippen sogar Programme geschrieben, die eine Prüfziffer nach jeder Zeile ausspuckten, die man dann mit der in der Zeitschrift verglich. Bei Maschinensprache, der meist als endlose Reihe von Hexadezimalziffern in DATA Zeilen landete, war dies sogar nötig, außer man kannte alle Opcodes auswendig.
Ich bin nach einem oder zwei Jahren, so ganz genau weiß ich das nicht mehr, zu Turbo Pascal gewechselt und dabei auch geblieben.
Der ZX81 war einer dieser Heimcomputer mit eingebautem BASIC-Interpreter, sogar einem mit relativ kleinem Sprachumfang. Ich will mal eruieren was an der obigen Behauptung dran ist. Dabei beziehe ich mich auf diese BASIC Interpreter im ROM, deren charakteristische Eigenschaft es ist, dass die Zeilen alle durchnummeriert sind und diese Zeilen Sprungmarken sind. Es gab in den späten Achtzigern auch leistungsfähigere BASIC-Varianten, als die 16 Bit Rechner aufkamen. Turbo und Quick BASIC auf dem PC oder GFA-BASIC auf dem Atari. Diese spielen in einer anderen Liga und auf sie bezieht sich auch nicht meine Kritik.
Man muss zuerst einmal sehen, wie es zu den Interpretern kam. BASIC ist die Abkürzung von Beginners’ All-purpose Symbolic Instruction Code. Die Sprache wurde von Kenemy und Kurzz 1964 erfunden, um Schüler in die Programmierung einzuführen. Damit diese einen leichten Einstieg hatten, wurde die Einstiegshürde bewusst klein gehalten. Man musste nicht viele Konzepte lernen, bevor man sein erstes Programm schreiben konnte wie bei etablierten Sprachen wie FORTAN. Die Logik war ganz einfach: Jede Zeile enthält einen Befehl. Die Zeilen sind durchnummeriert und werden in der Reihenfolge ihr Nummern ausgeführt, egal in welcher Reihenfolge sie eingegeben werden. Sprünge werden mit GOTO durchgeführt, Unterprogramm mit GOSUB aufgerufen. Beides mit Zeilennummern als Ziele. Die einzige Schleife, die es gab war die FOR-Schleife die in festen Schritten zählt bis ein Endwert erreicht wird, einzige Verzweigung die IF Anweisung.
Man kon nte mit einem Befehl – dem Print Befehl beginnen und dann einfach weitere Befehle lernen. Weitere Konzepte für die Strukturierung des Programms oder die Zusammenarbeit von Programmteilen musste man nicht lernen.
Die einzelnen Dialekte unterscheiden sich denn auch wenig in der Grundsyntax, sondern vielmehr welche Befehle dem Minimalstandard hinzugefügt wurden, für den Bildschirm (Textausgabe, Zeichnen), Datei Ein-/Ausgabe und Töne, da die Heimcomputer als Spielkonsolen genutzt wurden.
Die Verbreitung von BASIC in den Heimcomputern verdanken wir einer Persönlichkeit: Bill Gates. Als er zusammen mit Paul Allen die Ausgabe von Popular Electronics sah, in der der Altair 8800 angekündigt wurde, rief er Ed Roberts, den Firmeneigentümer an und bot an BASIC für den Rechner zu erstellen. Er war nicht der einzige der diesen Vorschlag machte, aber der erste der ein lauffähiges Produkt vorweisen konnte.
Das Altair-BASIC wurde zum schlagkräftigen Verkaufsargument für den Altair 8800. Ed Roberts Firma MITS hatte bisher Bausätze für Elektronik entwickelt und Tischrechner produziert. Der Altair 8800 war denn auch ein Computerbausatz mit minimalem RAM, bei dem der Benutzer über Kippschalter direkt Maschinencode binär eingeben musste. Als erster Computer verkaufte er sich trotzdem gut, aber einen echten Nutzen hatte er nur mit einer Programmiersprache.
Bill Gates reduzierte den Befehlssatz von BASIC soweit, dass es in 4 KByte RAM passte. MITS verkaufte das BASIC meist als Bundle mit einer 4 oder 8 KByte Speichererweiterung. Später gründeten Bill Gates und Paul Allen Microsoft und boten BASIC sowohl für den Endkunden, wie auch Firmen als Produkt an. Sie blieben dabei bei dem ersten minimalistischen Konzept, obwohl die Schöpfer von BASIC Kenemy und Kurtz inzwischen die Sprache zu Structurated BASIC weiter entwickelt. Viele Firmen übernahmen den Microsoft BASIC Interpreter oder ließen von Microsoft den Interpreter programmieren wie z.B. Commodore oder Atari.
Nur wenige Firmen kamen auf die Idee, ihre Computer mit etwas anderem anzubieten. Mir fällt eigentlich nur der Jupiter Ace ein, der Forth einsetzte. Der Sharp MZ80A lies dem Benutzer die Möglichkeit über eine Kassette die Programmiersprache seiner Wahl in den Arbeitsspeicher zu laden, was im Prinzip der Vorgehensweise bei Bürorechnern (meist mit CP/M als Betriebssystem) entsprach. Unter CP/M lief auch die einzige Version von BASIC die sich zumindest etwas von dem Zeilennummernschema entfernte, bis auf die Sprunglabels: CBASIC. Unter CP/M war BASIC denn auch nur eine Programmiersprache. Es gab viele Programmiersprachen. Ich kann mich noch an Algol, Cobol, Fortan und Comal erinnern.
Nach diesem langen Epilog folgt nun die Hauptkritik an dem „Microsoft BASIC“. Das langfristige Ziel der Entwicklung von Programmiersprachen ist es, zum einen sich von dem zu entfernen was der Mikroprozessor nur kann, zu dem was die Menschen an Problemen lösen wollen, also Abstsaktionebenen einzuziehen. Das zweite Ziel ist es Fehlermöglichkeiten zu reduzieren.
Abstraktionsebene zu schaffen bedeutet aber auch Konzepte einzuführen, die das Einsteigerniveau erhöhen. BASIC hat als Datentypen nur Ganzzahlen, Fließkommazahlen, das Array und Zeichenketten. Es kennt keine Konstanten, keine zusammengesetzten oder strukturierten Typen wie C oder Pascal. Eine Variable muss nicht definiert werden. Es reicht ihr einen Wert zuzuweisen, was bei Schreibfehlern natürlich nicht so toll ist. Als Folge gewöhnten sich die meisten die in BASIC programmierten an, sehr kurze Variablennamen zu verwenden, auch weil bei dem Interpreter sich der Quelltext und die vom Programm benötigten Daten den Arbeitsspeicher teilten. Aber mit diesen Typen nähert man sich der Wirklichkeit an. Ein Mensch hat einen Namen und eine Adresse, die wiederum aus Teilen wie Vroname, Nachname, Ort, Postleitzahl, Straße, Hausnummer besteht. Natürlich kann man dies in mehreren Variablen speichern, aber in einem zusammengesetzten Typ kann man alles gemeinsam bearbeiten, was nicht nur bequemer, sondern auch weniger fehlerhaft ist.
Abstraktionsebene sind auch Unterprogramme die nur eine Aufgabe haben und mit dem Hauptprogramm bzw. Aufrufer kommunizieren indem sie Parameter verändern oder als Konstanten übergeben bekommen. Sie verändern aber keine Daten des Hauptprogramms außer denen die sie übergeben bekommen. Das Konzept gibt es in BASIC nicht. Weder dass man Parameter übergibt, noch das Unterprogramme eigene Variablen haben, die nur lokal gelten. Das Aufrufen nur über die Zeilennummern ist die einzige Verzweigung. Der GOTO Befehl für Sprünge ist notwendig, weil von den drei elementaren Schleifen BASIC nur eine beherrscht.
Gut Abstraktionsebenen sind toll, man kommt aber auch ohne sie aus, muss nur phantasievoller programmieren. Was ich für verhängnisvoller halte ist, dass BASIC praktisch keine Hilfestellung bei Fehlern bietet. Es erkennt nur offensichtliche Syntaxfehler. Diese aber auch nur, wenn die Programmzeile ausgeführt wird. Das lag am Interpreterkonzept. Eine Zeile wird erst übersetzt, wenn sie ausgeführt wird. Vieles rutscht einfach durch. Als ich das ct’ Benchmark für andere Rechner in BASIC programmierte, wunderte ich mich, das ein Programmteil viel schneller ausgeführt wurde, als die anderen. Das war der Teil mit den transzendenten Funktionen. Dort kam die Logarithmusfunktion vor, die ich, weil ich jahrzehntelang nicht in BASIC programmiert habe als Ln() wie in Pascal schrieb. In BASIC heißt die Funktion aber Log(). Keiner der Interpreter hat sich über die Verwendung einer nicht definierten Funktion beschwert, sondern einfach 0 als Wert genommen.
Dazu kommt das schon erwähnte Problem, das man mit einem Schreibfehler gleich eine neue Variable anlegt und Zeilennummern als Sprunglabels sind natürlich auch fehleranfälliger als Namen von Prozeduren. Wenn alle Variablen global sind (und es keine Konstanten gibt, die man nicht mit neuem Wert versehen kann) steigt das Fehlerpotenzial natürlich an, wenn man in Unterprogrammen eigene Variablen braucht.
Ich denke das war es, was mich auch von BASIC wegbrachte. Zurück zu dem Kommentar:
„Wer damals die Logik eines Basicprogramms verstanden hat, kann auch heute Hochsprachen wie C oder Python leicht erlernen.“
Also die Logik eines BASIC Programs ist ganz einfach: führe jede Zeile in aufsteigender Reihenfolge aus. Ausnahmen: Mit Goto nn und Gosub nn springe an die entsprechende Programmzeile, mit Return kehre an die Zeile nach Gosub zurück.
Mehr gibt es an Logik nicht. C und Phyton haben da durchaus mehr Logik und man muss nahezu gleich viel lernen, wenn man von Null anfängt, da die BASIC-Logik in zwei Sätze passt. Ich halte BASIC als Einsteigersprache nur bedingt geeignet.
Ich denke so ab der zweiten Generation der Heimcomputer, die nach ZX81, VC-20 oder Ti 99 erschienen war der BASIC-Interpreter nicht mehr der Kaufgrund. Die hatten mehr Speicher, bessere Grafikfähigkeiten und waren so den Spielkonsolen ihrer Zeit ebenbürtig oder überlegen. Man kaufte sie zum Spielen. Hinzu kamen das Spiele meist auf Kassette oder Disc verkauft wurden. Die konnte man anders als Module selbst kopieren und „tauschen“. Spart enorm viel Taschengeld ein. Hier spielte der BASIC Interpreter seinen Vorteil aus. Er ist gleichzeitig Betriebssystem. Ich bin überzeugt, die meisten die damals einen Heimcomputer hatten, kannten vom BASIC Interpreter nur die Befehle, um ein Verzeichnis anzuzeigen und ein Programm zu laden oder zu starten. Der Interpreter war mehr ein Alibi für den Kauf. Schüler brahcten ihre Eletrn zum Kauf, weil sie s „Hausaufgaben erledigen“ können oder „Programmieren lernen“ konnten, damit sind die Sprösslinge dann auch für das kommende Informationszeitalter gerüstet…
Es hätte auch anders kommen können. Wie beschrieben gab es mit CBASIC eine Implementation die bis auf die Sprungziele auf Zeilennummern verzichtete. CBASIC lief unter einem 24 K CP/M, was auf eine Größe von 15 KByte für das BASIC hinausläuft. Turbo Pascal mit Editor und Laufzeitbibliothek war 30 KByte groß. Ich denke das man ein BASIC in zwei 16 K Banks hätte unterbringen können, das strukturiert gewesen wäre, mit echten Unterprogrammen, Parameterübergabe und Konstantendefintion und vor allem einer guten Syntaxprüfung.
Ich möchte noch enden mit einem Zitat von Kenemy aus einem Interview des PM-Computerhefts Ausgabe Oktober/November 1987:
„Es gibt ein berühmtes Zitat von einem prominenten Computerwissenschaftler. Wer seine ersten Freiprogrammierbaren mit BASIC macht, handelt sich eine Krankheit ein, von der sich einige Leute nie erholen. Ich muss ihnen sagen, in Bezug auf das Microsoft-BASIC, das automatisch mit dem IBM-PC kommt, stimme ich dieser Aussage zu! Ich möchte nicht, das mein Kind in dieser Sprache das Programmieren lernt“.
Kenemy und Kurtz hatten BASIC kontinuierlich weiter entwickelt und vertrieben damals die Version „True BASIC“ für die sie auch im Interview Werbung machten. Sie kritisierten die rudimentären Möglichkeiten von Microsoft-BASIC und seine starke Hardwareabhängigkeit (wenn man einen Bildschirmfüllenden Kreis zeichnen will, muss man wissen wie der Bildschrim organisiert ist, so ist ein Programm nur mit Anpassungen auf verschiedene Rechner übertragbar).
Also Kenemy, der Schöpfer von BASIC hält das ZX81 BASIC das ja genauso beschränkt wie das Microsoft BASIC ist nicht für eine gute Wahl um Programmieren zu lernen.
Völlig umstellen musste man sich beim Übergang zur objektorientierten Programmierung. Da half Basic in keiner Weise. Selbst wenn man schon jahrelange Erfahrung mit einer Programmiersprache hatte, die später um Objektorientierung erweitert wurde, hatte man erstmal Probleme damit.
Ja, das ging mir auch so, aber im Wesentlichen ist es ein neues konzept der besseren Verbindung von Code und Daten und eine Reglementierung des Zugriffs. Es geht noch weitaus radikaler: Stichwort funktionale Sprachen.
Gerechterweise erwähnt der Blog Kommentator aber C und Python C ist nur prozedural und in Python kann man auch nur prozedural programmieren, obwohl es eine objektorientierte Sprache ist.
Mit Python kann man objektorientiert programmieren. Man kann auch andere Paradigmen nutzen.