QB64
QB64 (ursprünglich QB32) ist ein BASIC-Compiler für Windows, Linux und Mac OS X, der für die Kompatibilität mit Microsoft QBasic und QuickBASIC entwickelt wurde. QB64 emittiert C-Quellcode und integriert selbst einen C++-Compiler, um die letztendliche Kompilierung des generierten Zwischencodes mit gcc-Optimierung zu ermöglichen. Mit der derzeit technisch genauesten Nachbildung des originalen Microsoft-Produkts zählt QB64 zu den Anwendungen im Bereich Retrocomputing.
QB64 | |
---|---|
Basisdaten | |
Entwickler | Rob Galleon, QB64Team |
Erscheinungsjahr | 2007 |
Aktuelle Version | 2.0.2 |
Betriebssystem | Windows, Linux, macOS |
Kategorie | BASIC-Compiler und Entwicklungsumgebung |
Lizenz | MIT |
deutschsprachig | nein |
www.qb64.org |
QB64 implementiert die meisten QBasic-Funktionen und kann viele QBasic-Programme ausführen, einschließlich der Beispielprogramme Gorillas und Nibbles, die von Microsoft geschrieben und dem Originalprodukt beigelegt waren. Darüber hinaus enthält QB64 eine Entwicklungsumgebung, die der QBasic-Entwicklungsumgebung ähnelt. QB64 erweitert auch die QBASIC-Programmiersprache um 64-Bit-Datentypen, bessere Sound- und Grafikunterstützung und bessere Anbindung an Betriebssystemfunktionen. Es kann auch einige DOS/x86-spezifische Funktionen wie Mauszugriff über den Interrupt 33h und mehrere Timer emulieren.
Hintergrund
Der Beginner's All-Purpose Symbolic Instruction Code war sowohl Programmiersprache als auch Betriebssystem für die meisten der in den 1980er Jahren verbreiteten Heimcomputer, wodurch in dem entstehenden Massenmarkt für Mikroelektronik praktisch alle Konsumenten dieser Computer Kontakt mit dieser Programmiersprache hatten. Die meisten dieser BASIC-Dialekte waren eine Version des Microsoft BASIC von 1976, welches für zahlreiche damals erhältlichen Plattformen lizenziert und angepasst wurde. Außerdem wurde BASIC gezielt für Anfänger entwickelt. Aus diesen beiden Gründen war BASIC in den 80er Jahren bei Programmieranfängern beliebt und entwickelte sich durch die professionellen Microsoft-Produkte QBasic, QuickBASIC und Visual Basic in den 90er Jahren zu einem leistungsstarken, professionellen Werkzeug der Anwendungsentwicklung. Die meisten professionellen Entwickler der 90er Jahre und der ersten Dekade des 21. Jahrhunderts lernten das Programmieren zuerst mit einem BASIC-Dialekt.
QB64 wurde (als QB32) von Rob Galleon im Jahr 2007 das erste Mal veröffentlicht, als sich mit der Veröffentlichung von Windows Vista abzeichnete, dass MS-DOS-Programme unter modernen Betriebssystemen bald nicht mehr lauffähig sein würden. QB64 wird von Anfang an selbst in QuickBASIC programmiert. Der Quellcode diente bis zur Version 0.63 der Emittierung von C++-Quellcode, welcher anschließend durch einen Compiler übersetzt wurde. Der Codegenerator wurde zunächst in der Originalversion von QuickBASIC 4.5 ausgeführt, bevor die bekannten Einschränkungen des originalen QuickBASIC-Interpreters mit dem Arbeitsspeicher ein Problem für die Weiterentwicklung von QB64 wurden. Für eine kurze Zeit wechselte Galleon daher zu Microsoft BASIC PDS 7.1, bevor QB64 sich ab seiner Version 0.63 unter Verwendung einer Vorgängerversion vollständig selbst kompilieren konnte.
Der Haupt-Quellcode der Version 2.01 von QB64 enthält mehr als 26.000 Zeilen ausschließlichen QuickBASIC-Codes in einer mehr als ein Megabyte großen Textdatei.
Der pädagogische Wert der Entstehungsgeschichte und der Softwarearchitektur von QB64, des Projekts und der Software, wird von Bildungseinrichtungen und -projekten wahrgenommen. Die Software findet in der Lehre und unter einigen professionellen Entwicklern Anwendung. Schülern im Informatikunterricht wird durch QB64, im Vergleich zu moderner Applikationsentwicklung, ein leichterer und unkomplizierter Zugang zum Erlernen des Programmierens mit zügig zu erreichenden Erfolgserlebnissen geboten, da weiterführende Teilschritte des Arbeitsprozesses wie die Einrichtung einer Entwicklungsumgebung und einer Laufzeitumgebung entfallen und das Basissystem, in dem und mit dem die Anwendung ausgeführt wird, sich auf einfache Text-, Sound- und Farbgrafik-Ausgabe beschränkt, ohne vom Entwickler weitergehende Kenntnisse der Systemprogrammierung zu erfordern.
Im Gegensatz zu herkömmlichem BASIC- und QBasic-Code werden die mit QB64 geschriebenen Anwendungen in ausführbare Dateien kompiliert und ausgeführt, was eine gesteigerte Rechenleistung und eine einfache Verteilung ermöglicht. Die Sprache wurde um die Möglichkeit erweitert, Quellcode mit externen C/C++-Programmierbibliotheken sowie (unter Windows) den dynamischen Windows-Bibliotheken zu verknüpfen.
Mit Funktionen für OpenGL und Anbindungen an moderne Betriebssystemfunktionen, wie etwa die Drucker-Schnittstelle des Betriebssystems, ist es möglich, die ursprünglichen Beschränkungen des MS-DOS-basierten Ausführungsumfelds zu verlassen und modernere Anwendungen zu programmieren. Ereignisgesteuerte und dialogorientierte Programmierung mit grafischen Benutzeroberflächen werden in QB64 mit der freien Erweiterung InForm ermöglicht.[1]
Syntax
Die Syntax von QB64 ist vollständig abwärtskompatibel mit QuickBASIC. Zeilennummern sind nicht erforderlich, und Anweisungen werden durch Zeilenlinien beendet oder durch Doppelpunkte getrennt (:).
Ein Beispiel "Hallo, Welt!" Programm ist:
PRINT "Hello, World!"
Ein QB64-Beispiel für eine VGA-Speicheremulation
CLS
S$ = "Hello, World!"
DEF SEG = &HB800 'das Segment des Videospeichers setzen
FOR I = 1 TO LEN(S$)
POKE 160 + (I - 1) * 2, ASC(MID$(S$, I, 1))
NEXT
DEF SEG 'auf das Standard-Segment zurücksetzen
Ein QB64-Beispiel und Audio-Dateien abzuspielen:
sound_effect& = _SNDOPEN("sound.wav") 'WAV, OGG oder MP3
_SNDPLAY sound_effect&
Ein QB64-Beispiel mit Bild-Dateien zu arbeiten:
SCREEN _NEWIMAGE(800, 600, 32) 'einen 800x600 Bildschirmausschnitt mit 32-bit Farben erstellen
imagename& = _LOADIMAGE("image__name.png") 'BMP, JPG, PNG, etc.
_PUTIMAGE (0, 0), imagename&
_FREEIMAGE imagename& 'zugewiesenen Speicher freigeben
Ein QB64-Beispiel für mehrere Timer:
t1 = _FREETIMER
t2 = _FREETIMER
ON TIMER(t1, 1) GOSUB Timer.Trap 'die Quellzeilen von Timer.Trap Sprungziel werden einmal in der Sekunde ausgeführt
ON TIMER(t2, .5) mySub 'QB64 kann auch eine Unter-Prozedur mit einem TIMER ausführen;
'in diesem Beispiel wird mySUB alle 500 Millisekunden aktiviert
'Aktiviert die TIMER
TIMER(t1) ON
TIMER(t2) ON
DO 'Dauerschleife, bis das Fenster geschlossen wird
_LIMIT 1 'Die Schleife wird einmal pro Sekunde durchlaufen, um zuziehen,
' dass die beiden TIMER unabhängig voneinander laufen
LOOP
Timer.Trap:
PRINT "1s; ";
RETURN
SUB mySub
PRINT "500ms; ";
END SUB
Erweiterungen zu QBasic
Die erweiterten Befehle von QB64 beginnen mit einem Unterstrich, um Konflikte mit Namen zu vermeiden, die in einem QuickBASIC-Programm verwendet werden können. Ab Version 1.4 kann das Unterstrichpräfix mit dem Metabefehl $NOPREFIX gelöscht werden. QB64 erweitert die QuickBASIC-Sprache auf verschiedene Weise. Es fügt die neuen Datentypen hinzu, einschließlich _BIT, _BYTE, _INTEGER64 und _FLOAT sowie vorzeichenlose Datentypen. Die neuen Datentypen haben Suffixe wie die herkömmlichen BASIC-Datentypen. QB64 enthält auch eine Audiobibliothek, die das Abspielen der gängigsten Audioformate, einschließlich MP3-, Ogg Vorbis- und WAV-Dateien, sowie Bibliotheken, die es Benutzern ermöglichen, Grafiken mit höherer Auflösung als die 640×480 von QuickBASIC sowie verschiedene Schriftarten zu verwenden und Bilder in BMP-, PNG- und JPEG-Formaten zu zeichnen. Es ermöglicht auch die Verwendung von 32-Bit-Farben im Gegensatz zu den begrenzten 16 bzw. 256 Farben, die ursprünglich angeboten wurden. Der Programmierer hat die Möglichkeit, genau wie bei QuickBASIC eine eigene Bibliothek über den $INCLUDE Befehl zu inkludieren.
Kommandozeile
QB64 lässt sich auch über die Kommandozeile aufrufen. Mittels Argumenten kann die Übersetzung von BASIC Quellzeilen-Dateien darüber gesteuert und in Skripten eingebettet werden.
Abruf der Schalter
Aufruf der Schalter-Übersicht von QB64:
qb64 --help
Übersicht der Schalter
Allgemeiner Aufruf von qb64 über die Kommandozeile
qb64 [Schalter] <Datei>
Übersicht der QB64-Schalter Schalter:
<Datei> zu ladende Quellzeilen-Datei
-v Erweiterte Ausgabe
-q Keine Ausgabe
-c Übersetzen anstatt bearbeiten
-x Übersetzen anstatt bearbeiten und die Ausgabe wird auf der Konsole ausgegeben
-p Alle Inhalte vor der Übersetzung werden entfernt
-z Erzeugt C-Quellzeilen ohne eine Übersetzung in eine ausführbare Datei
-o <Ausgabe-Datei> Erzeugt eine ausführbare Datei mit dem angegebenen Namen <Ausgabe-Datei>
-e Schaltet OPTION _EXPLICIT ein, erzwingt die Deklaration von Variablen, aber das nur pro Übersetzung, die nicht die Quellzeilen-Datei selber oder globale Einstellungen verändert
-s[:switch=true/false] Ausgabe/Setzen von Übersetzer-Einstellungen
-l:<Zeilennummer> Startet die IDE an der angegebenen Zeilennummer
Beispiel-Aufruf
Beispiel einer QB64-Übersetzung mittels Kommandozeile:
qb64 -x untitled.bas
Dieser Aufruf erzeugt die folgende Ausgabe auf der Kommandozeile:
QB64 Compiler V2.0
Beginning C++ output from QB64 code... first pass finished.
Translating code...
[..................................................] 100%
Compiling C++ code into executable...
Output: untitled
Zusätzliche Programme
QB64 InForm
InForm ist ein Rapid-Application-Development-Werkzeug für QB64 mit einem WYSIWYG-Editor und einer grafischen Bibliothek, mit dem dialogorientierte Software für grafische Betriebssysteme entworfen werden kann, um ein ereignisgesteuertes QB64-Programm zu generieren.
Im folgenden Beispiel-Code wird das Ereignis Click auf der Schaltfläche mit der Beschriftung „OK“ ausgewertet, um damit den Text des Eingabefeldes dem Label zuzuweisen:
SUB __UI_Click (id AS LONG)
SELECT CASE id
CASE Form1
CASE OKBT
Caption(Label1) = Text(TextBox1)
CASE Label1
CASE TextBox1
END SELECT
END SUB
QB64 vWATCH64
vWATCH64 ist ein Dienstprogramm zum Debuggen von QB64-Programmen. vWATCH64 generiert eine modifizierte Version der Quelldatei und unterstützt sowohl Haltepunkte, als auch die Echtzeit-Beobachtung von Variablen ermöglicht.
vWATCH64 ist kompatibel mit Windows, MacOS X und Linux.
Bibliotheken
QB64 integriert FreeGLUT für Grafiken und Texte.
QB64 kann auch DLL-Bibliotheken für Windows-, C++- und SDL-Funktionen und -Anweisungen verwenden, wie in den folgenden Beispielen verdeutlicht wird.
Dynamik Link Library, kurz DLL
QB64 unterstützt Dynamik Link Library-Anweisungen und -Funktionen, kurz DLL und haben in den allermeisten Fällen die Dateiendung .DLL. Die angegebene DLL-Datei ist entweder im Windows-Systemordner (C:\WINDOWS\System32) oder im Stamm-Ordner von QB64 vorhanden.
DECLARE DYNAMIC LIBRARY "DLL-Dateiname ohne die Dateiendung .DLL"
END DECLARE
Ein Beispiel für den Zugriff auf eine DLL-Datei:
DECLARE DYNAMIC LIBRARY "playmidi32"
FUNCTION PlayMIDI& (filename AS STRING)
END DECLARE
' Hinweis: Der Dateiname muss mit einem CHR$(0) beendet werden.
result = PlayMIDI(".\Samples\test_midi.mid" + CHR$(0))
PRINT result
Die im Beispiel genutzte DLL-Datei in den Stamm-Ordner von Qb64 kopieren und aus dem heruntergeladen werden.[2]
C/C++-Bibliotheken
Benutzer können auch auf C-Headerdateien zugreifen, um C-Funktionen auszuführen.QB64 verwendet C++, um ein Basic-Programm in ein ausführbares Programm zu kompilieren. Dabei ist wichtig, C++-Header-Dateien in den Stamm-Ordner von QB64 abgelegt werden sollten und sind nach der Kompilierung eines Programms nicht mehr erforderlich.
DECLARE LIBRARY
END DECLARE
Ein Beispiel für die Deklaration auf C-Routinen:
DECLARE LIBRARY
'ctime.h
FUNCTION clock () 'arithmetic type elapsed processor representing time.
FUNCTION difftime# (BYVAL time2 AS _UNSIGNED LONG, BYVAL time1 AS _UNSIGNED LONG) 'seconds between time2 and time1
END DECLARE
Einzelnachweise
- Fellippe Heitor et al.: InForm Wiki. In: github.com. Abgerufen am 19. Oktober 2021.
- PlayMidi32.dll, auf qb64.org