Blitz! (BASIC-Compiler)

Aus C64-Wiki
(Weitergeleitet von Blitz! Compiler)
Zur Navigation springenZur Suche springen
Blitz!
Blitz! Hauptmenü
Entwickler Peter Schwartz, Bob Skyles (Handbuch)
Verleger Skyles Electric Works Inc., Supersoft
Release 1984
Lizenz Vollversion
Plattform(en) C64, C128, CBM 8032
Genre Programmierung
Steuerung Icon tastatur.png
Medien Icon disk525 1.png
Sprache(n) Programm: Sprache:englisch
Information aka Skyles-Blitz, Blitz 64

Beschreibung[Bearbeiten | Quelltext bearbeiten]

Blitz! (bis auf den Namen identisch mit Austro-Speed 88) ist ein 2-Pass-Compiler für den Commodore 64, der BASIC-Programme in P-Code übersetzt. Die Ergebnisdatei beinhaltet zusätzlich zum P-Code eine 6 kBytes große Runtime, die den P-Code ausführen kann.

Blitz! führt beim Kompilieren folgende Optimierungen durch (genaueres siehe Compiler):

  • Variablen und Sprungziele werden vom Code direkt über ihre Stelle im Speicher referenziert; der Lookup über den Variablennamen bzw. Zeilennummer entfällt.
  • Zahlenkonstanten werden in ihre native Integer- bzw. Floating Point-Darstellung konvertiert und nicht als PETSCII gespeichert, was Geschwindigkeit bringt und Speicherplatz spart.
  • Integer-Berechnungen werden als solche ausgeführt und nicht der Umweg über die langsamen Floating Point-Routinen gemacht.
  • Ausdrücke werden in umgekehrte polnische Notation umgeformt, was Zwischenwerte einspart.

Interessanterweise ist Blitz! in BASIC geschrieben und mit sich selbst kompiliert worden; nur eine relativ kleine in Assembler geschriebene Hilfsroutine wird beim Einlesen des Eingabeprogramms genutzt.

Laut der Eigenwerbung des Herstellers ist Blitz! schneller als PETSPEED 64 und bis zu 20-mal schneller als BASIC V2.[1]

Hinweis: Das heutige Blitz BASIC, das Anfang der 1990er Jahre für den Amiga entwickelt wurde, und später ebenfalls für den PC umgesetzt wurde, hat mit diesem BASIC-Compiler gar nichts gemein!

Nutzung[Bearbeiten | Quelltext bearbeiten]

Die Benutzung ist relativ simpel; im Gegensatz zu vielen anderen Compilern gibt es kaum Einstellungsmöglichkeiten. Beim Kompilieren wird eine weitere Datei erzeugt, in der sich die Zuordnung "Speicherstelle (des P-Codes) zu Original-BASIC-Zeilennummer" befindet. Mit Hilfe dieser Datei lassen sich Fehlermeldungen im Kompilat wieder dem originalen BASIC-Programm zuordnen. Außerdem lässt sich mit der Datei ein Eindruck gewinnen, welche BASIC-Befehle wieviele Bytes als P-Code beanspruchen.

Hinter den Compile-Optionen mit mehreren Laufwerken verbirgt sich auch die Option, mehrere Dateien nacheinander zu übersetzen; sie werden dann so erzeugt, dass die Kompilate sich gegenseitig unter Beibehaltung der BASIC-Variablen laden können (Overlays). Dabei ist zu beachten, dass String-Konstanten nicht zwischen den Overlays geteilt werden, bei String-Variablen also sichergestellt werden muss, dass sie auch auf den String-Heap zeigen (z.B. A$="KONSTANTE"+""[2]).

Daten, die im Eingabe-PRG nach dem BASIC-Programm angehängt sind, werden von Blitz! im Kompilat zwischen den P-Code und den Variablenbereich eingefügt. So lassen sich Daten oder auch mit etwas Bastelei (wegen der geänderten Position im Speicher) Assembler-Hilfsroutinen einfügen.[3] Der Blitz!-Compiler selbst macht davon Gebrauch und benutzt als Schnittstelle diverse BASIC-Variablen. Die SYS-Adressen der Hilfsroutinen werden dabei über PEEK(45)+PEEK(46)*256-OFFSET errechnet; auf die BASIC-Variablen wird per lda #$00 ldy #$XX sta ($2d),y iny sta ($2d),y zugegriffen (hier wird eine Integer-Variable auf 0 gesetzt). Beim Zugriff auf Arrays ist dabei zu beachten, dass Blitz! ein internes Array als erstes im Speicher verwaltet (Z*()), in dem die Offsets aller Arrays gespeichert werden. Z*() gibt es in BASIC V2 nicht.

Optimierung[Bearbeiten | Quelltext bearbeiten]

Ein großer Zugewinn an Geschwindigkeit ergibt sich durch die echten Integer-Routinen. Diese werden jedoch nur genutzt, wenn die Variablen auch als Integer (%) gekennzeichnet sind. Das gilt auch für die Zählvariablen in FOR-Schleifen; allerdings ist dabei zu beachten, dass reines BASIC Integer-Variablen nicht als Zählvariablen erlaubt.

Platzbedarf[Bearbeiten | Quelltext bearbeiten]

Der Platzbedarf des erzeugten P-Codes ist speziell bei größeren Programmen meist geringer als für das entsprechende BASIC-Programm, da z.B. Zahlenkonstanten, die von BASIC V2 als PETSCII gespeichert werden, von Blitz! im nativen Format gespeichert werden. Trotzdem kann es vorkommen, dass ein Eingabeprogramm wegen Platzproblemen nicht von Blitz! kompiliert werden kann, was meist daran liegt, dass der Compiler nur P-Code erzeugen kann, der bis maximal $7FFF reicht. Reblitz64 (siehe Weblinks) hat diese Einschränkung nicht.

Die erzeugte Programmdatei besteht aus der Runtime (6 kBytes, also ca. 24 Blöcke), der Liste der impliziten Arrays[4], dem generierten P-Code sowie vorinitialisiertem Variablenspeicher (nur einfache Variablen, keine Arrays).

Eine Abschätzung des Platzbedarfs verschiedener Parametertypen ist im folgenden zu sehen.

q=49152       : rem 7 bytes (im p-code)
poke128,255   : rem 5 bytes
poke512,128   : rem 6 bytes
poke49152,64  : rem 9 bytes
pokeq,12      : rem 3 bytes
sys128        : rem 4 bytes
sys512        : rem 5 bytes
sys49152      : rem 8 bytes
sysq          : rem 3 bytes
print"end"    : rem 5 bytes

Meinung[Bearbeiten | Quelltext bearbeiten]

1570: "Simples, aber schnelles und relativ robustes Tool. Leider wird keine Übersetzung in Maschinencode angeboten, allerdings ist der P-Code auch schon ziemlich schnell und hat weniger Platzprobleme. Echt schade ist, dass es anders als z.B. beim Basic-Boss keine Möglichkeit gibt, Integer-Variablen per Compiler-Direktive als Integer zu deklarieren (Edit: Reblitz64 beherrscht das). Damit ist man gezwungen, im Code überall Prozentzeichen einzustreuen, was das Originalprogramm vergrößert und verlangsamt und im Falle von Zählvariablen dafür sorgt, dass das Programm unkompiliert gar nicht mehr ausführbar ist. Dafür ist wiederum schön, dass es Blitz! auch als PC-Version gibt und Decompiler verfügbar sind."

Weblinks[Bearbeiten | Quelltext bearbeiten]

Quellen[Bearbeiten | Quelltext bearbeiten]

  1. https://www.tpug.ca/tpug-media/tpugmag/TPUG_Issue_04_1984_Jun.pdf TPUG magazine - The offical publication for the world's largest international Commodore users group; June 1984, S.3 Sprache:englisch
  2. Thema: Heute so compiliert... auf Forum64.de - Posting zu Konstanten und Overlays
  3. Thema: Heute so compiliert... auf Forum64.de - Posting von Larry zur Einbindung von ASM-Routinen
  4. Arrays, die ohne DIM im Code referenziert werden