Einschränkungen des Compilers gegenüber dem originalen Z1013-BASIC-Interpreter

Das Ziel des BASIC-Compilers ist es, schnelle und möglichst kleine Maschinencodeprogramme zu erzeugen, die keine unnötigen Funktionen enthalten. Der BASIC-Quelltext und nicht benötigte BASIC-Funktionalitäten sind im Maschinencodeprogramm nicht vorhanden. Daraus resultieren einige Einschränkungen gegenüber der Ausführung eines BASIC-Programms im Interpreter:

1. CALL

Grundsätzlich besteht bei der CALL-Anweisung keine Einschränkung gegenüber dem Interpreter. Jedoch rufen manche BASIC-Programme mit CALL Maschinenunterprogramme des BASIC-Interpreters auf. Andere Programme dagegen enthalten in REM-Zeilen Maschinencode, der mit CALL aufgerufen wird. Untergrogramme des BASIC-Interpreters beziehungsweise in REM-Zeilen versteckter Maschinencode sind im erzeugten Maschinencodeprogramm nicht (mehr) vorhanden und können somit auch nicht aufgerufen werden. Wird dennoch so ein CALL-Befehl ausgeführt, führt das wahrscheinlich zum Absturz des Programms.

Eine Lösung des Problems besteht darin, die benötigten Maschinencoderoutinen vor ihrem Aufruf mit POKE-Befehlen zu erzeugen. Gegebenfalls können hierfür auch die Anweisungen DATA, READ und DOKE verwendet werden, die jedoch der originale BASIC-Interpreter nicht kennt.

2. GOTO und GOSUB

Die hinter GOTO und GOSUB angegebene Zeilennummer muss eine Zahl sein. Ein variabler Ausdruck, wie im originalen Z1013-BASIC-Interpreter möglich, ist nicht erlaubt. Da im erzeugten Maschinencodeprogramm kein BASIC-Quelltext und somit auch keine Zeilennummern mehr vorhanden sind, muss bereits der Compiler die Sprungziele auflösen. Das kann er jedoch nur tun, wenn die Ziele eindeutig feststehen, d.h., wenn sie nicht variabel sind.

Der Compiler könnte zwar in das erzeugte Maschinencodeprogramm auch eine Zuordnung von Zeilennummern zu Maschinencodeadressen einbauen und so auch variable Sprungziele ermöglichen, jedoch würde dadurch das Programm ziemlich aufgebläht werden. Da das aber nicht das Ziel des BASIC-Compilers ist, werden variable Sprungziele eben nicht unterstützt.

Die hinter GOTO und GOSUB stehende Zeilennummer muss auch existieren. Der BASIC-Interpreter springt bei einer nicht existierenden Zeilennummer zu der Zeile, die anstelle der nicht existierenden steht. Das ist logischerweise die Zeile mit der nächst höheren Nummer. Da aber der BASIC-Compiler auch Zeilen ohne eine Zeilennummer gestattet, ist das nicht mehr so eindeutig:

100 GOTO 220
200 PRINT "Das"
PRINT "ist"
PRINT "ein"
PRINT "Beispiel."
240 PRINT "Alles klar?"


Zu welcher Zeile soll nun in Zeile 100 gesprungen werden? Zur ersten Zeile ohne Zeilennummer oder zur Zeile 240? Damit solche Ungereimtheiten nicht auftreten können, gilt die Festlegung: Als Sprungziele angegebene Zeilennummern müssen existieren.

3. INPUT

Bei der Eingabe von numerischen Werten bietet der originale Z1013-BASIC-Interpreter die Möglichkeit, komplexe numerische Ausdrücke einschließlich Funktionsaufrufen anzugeben, so wie sie auch im BASIC-Quelltext erlaubt sind. Das erzeugte Maschinencodeprogramm enthält jedoch diese typische Interpreter-Funktionalität nicht. Aus diesem Grund können nur ganze Dezimalzahlen eingegeben werden.