Einschränkungen des Compilers gegenüber einem 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 in einem Interpreter:
1. CALL und USR
Grundsätzlich bestehen bei der CALL-Anweisung und der USR-Funktion
keine Einschränkung gegenüber dem Interpreter.
Jedoch rufen manche BASIC-Programme mit CALL oder USR
Maschinenunterprogramme des BASIC-Interpreters auf.
Andere Programme enthalten in REM-Zeilen Maschinencode, der 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- oder USR-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 oder mit der
ASM-Anweisung direkt
in das BASIC-Programm zu integrieren.
2. GOTO und GOSUB
Wird hinter GOTO oder GOSUB eine Zeilennummer angegeben,
muss es eine konstante Zahl (Literal) sein.
Ein variabler Ausdruck, wie bei manchen Interpretern 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 dann das Programm ziemlich aufgebläht werden.
Da das aber nicht das Ziel des BASIC-Compilers ist,
werden variable Sprungziele eben nicht unterstützt.
Mit gewissen Einschränkungen lassen sich jedoch solche Anforderungen
mit den Anweisungen ON...GOTO
und ON...GOSUB realisieren.
Des Weiteren müssen die hinter GOTO und GOSUB stehenden
Zeilennummern bzw. Marken auch existieren.
Manche BASIC-Interpreter springen bei einer nicht existierenden
Zeilennummer zur nächst höheren existierenden Zeile.
Der JKCEMU-BASIC-Compiler unterstützt soetwas jedoch nicht.