Einschränkungen des Compilers gegenüber
dem AC1-Mini- und dem Z1013-Tiny-BASIC
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 die beiden originalen BASIC-Interpreter nicht kennen.
2. GOTO und GOSUB
Die hinter GOTO und GOSUB angegebene Zeilennummer muss eine Zahl sein.
Ein variabler Ausdruck,
wie im 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 bieten die beiden originalen
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.