QB64

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

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

QB64 IDE Screenshot

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

QB64 InForm Designer
QB64 InForm TestForm
QB64 InForm TestForm Ergebnis der Beispiel-Quellzeilen

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

QB64 vWATCH64 Debugger

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, Mac OS 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 muss sich im Stamm-Ordner von Qb64 befinden. Sie kann 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 abzulegen. Nach der Kompilierung eines Programms sind sie 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

  1. Fellippe Heitor et al.: InForm Wiki. In: github.com. Abgerufen am 19. Oktober 2021.
  2. PlayMidi32.dll, auf qb64.org

Weblinks

Wikibooks: Quick Basic – Lern- und Lehrmaterialien