BASIC-Kompaktor

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Ein BASIC-Kompaktor ist ein Computerprogramm zur Verkleinerung von BASIC-Programmen. Der Quellcode des BASIC-Programms wird dabei nicht strukturell neu geschrieben oder kompiliert. Als weiterer Effekt ergibt sich bei BASIC V2 eine leichte Beschleunigung.

Funktion[Bearbeiten | Quelltext bearbeiten]

Ein BASIC-Kompaktor kann unter anderem die folgenden Kompaktierungsmethoden anwenden (siehe Beispiel):

  • Entfernen überflüssiger BASIC-Befehle wie END, REM oder LET.
  • Entfernen von Zeichen, die im Anschluss von Zeilennummern bei GOTO, GOSUB und THEN zu finden sind, aber nicht mehr zur Zeilennummer gehören und daher vom Interpreter überlesen werden.
  • Abkürzung überlanger Variablennamen (länger als zwei Zeichen).
  • Entfernung überflüssiger Leerzeichen oder mehrfacher Trennzeichen (Doppelpunkt).
  • Reduzierung der Anzahl von BASIC-Zeilen durch das Verschmelzen mehrerer separater Zeilen in eine möglichst lange Zeile mit einer Gesamtlänge bis zu 255 Zeichen (wobei hier bereits tokenisierte Darstellung einer BASIC-Zeile zugrunde liegt).
  • Renumber der Zeilen, um kürzere Zeilennummern zu erhalten, mit Anpassung der Sprungziele in den Befehlen GOTO, GOSUB (auch bei der ON-Variante) und THEN.

Der kompaktierte Quellcode hat die Vorteile

  • Platzersparnis,
  • leicht beschleunigte Ausführung, da der Interpreter weniger Daten lesen muss

aber auch die Nachteile

  • Lesbarkeit des Programms und eine Fehlersuche darin ist erschwert,
  • Programmänderungen sind nur noch bedingt möglich (da im Wesentlichen der BASIC-Editor das bearbeiten von 255 Zeichen langen Zeilen nicht vorsieht).

Allerdings lassen sich große Programme ohne Verlust der Lesbarkeit z.B. in Paradoxon-Basic erstellen und bearbeiten, und mit Compilern gibt es wesentlich größere Geschwindigkeitsgewinne als durch Kompaktierung.

Beispiel[Bearbeiten | Quelltext bearbeiten]

Ausgangsprogramm:

0 REM Wuerfelspiel fuers C64-Wiki (W) by Jodigi 2007
10 POKE 53280, 0: POKE 53281, 0: POKE 646, 15 : REM Farben setzen
20 PRINT CHR$(147) ; "Mein 1. BASIC-Programm" : REM Bildschirm löschen
30 LET COMMODORE$ = "C64": REM Variable COMMODORE definieren
40 PRINT "Hallo, ich bin der " ; COMMODORE$ ; " und wie heisst Du? ";
50 INPUT NAME$: REM Abfrage des Benutzers in NAME$
60 PRINT "Hallo" ; NAME$ : REM NAME$-Ausgabe
70 FOR X=0 TO 255 : REM Bildschirmflackern
80 POKE 53280,X
90 NEXT X
100 POKE 53280,6 : REM Farbaenderung fuer Wuerfelspiel
110 PRINT : PRINT "Wie waere es mit einem Wuerfelspiel? (Y/N)"
120 GET ABFRAGE$: IF ABFRAGE$="" THEN GOTO 120 : REM Tastaturabfrage
130 IF ABFRAGE$ <> "Y" THEN GOTO 230 : REM Ende wenn keine Taste Y
140 LET WUERFEL = INT ( RND (1) *6 ) + 1 : REM 1. Wuerfel
150 PRINT "Ich habe"; WUERFEL : REM Ausgabe 1. Wuerfel
160 LET W2 = INT ( RND (1) *6 ) + 1 : REM 2. Wuerfel
170 PRINT "Du hast"; W2 : REM Ausgabe 2. Wuerfel
180 POKE 53280,15 : REM Farbaenderung fuer Spielende und Gewinnerausgabe
190 IF  WUERFEL = W2 THEN PRINT "Ungleich - Wir wuerfeln nochmal...": GOTO 130
200 IF WUERFEL > W2 THEN PRINT "Ich gewinne *Freude*": GOTO 220
210 PRINT "Du gewinnst"
220 PRINT "Wollen wir nochmal wuerfeln? ": GOTO 120 : REM Erneutes Wuerfeln?
230 END

Nach einer Kompaktierung:

10 POKE53280,0:POKE53281,0:POKE646,15:PRINTCHR$(147)"Mein 1. BASIC-Programm":CO$="C64"
11 PRINT"Hallo, ich bin der "CO$" und wie heisst Du? ";:INPUTNA$:PRINT"Hallo"NA$:FORX=0TO255:POKE53280,X
12 NEXT:POKE53280,6:PRINT:PRINT"Wie waere es mit einem Wuerfelspiel? (Y/N)"
13 GETAB$:IFAB$=""THEN13
14 IFAB$<>"Y"THENEND
15 WU=INT(RND(1)*6)+1:PRINT"Ich habe"WU:W2=INT(RND(1)*6)+1:PRINT"Du hast"W2:POKE53280,15
16 IFWU=W2THENPRINT"Ungleich - Wir wuerfeln nochmal...":GOTO15
17 IFWU>W2THENPRINT"Ich gewinne *Freude*":GOTO19
18 PRINT"Du gewinnst"
19 PRINT"Wollen wir nochmal wuerfeln? ":GOTO13

Implementierungen[Bearbeiten | Quelltext bearbeiten]