BASIC-Compiler

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 im 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.