Zum Inhalt springen

PLA

Programming Language A (kurz PLA) ist eine Assemblersprache mit C-ähnlicher Syntax für x86-Prozessoren. Die Sprache ist zur Systemprogrammierung besonders gut geeignet, da sie die Freiheit von Assembler und die kompakte Notation der Programmiersprache C besitzt.

Die alten Versionen werden seit 2015 nicht mehr weiterentwickelt und sind nur noch als Referenz vorhanden. Die komprimierten Verzeichnisse enthalten alle Source- und ausführbaren Dateien:

  • PLA_VOLL_2015 mit 32 bit Unterstützung und reichlich Listen durch den Compiler. Der Quellcode ist komprimiert, NASM erforderlich.
  • PLA_2009 als erste lauffähige Version, die sich selbst übersetzen kann. NASM wird benötigt.

Die aktuellen Versionen finden sich auf Github:

  1. Abgespeckter und neu sortierter Compiler aus dem Jahr 2017, nur noch 15 KByte groß.
  2. Neuer NASM kompatibler Assembler für obigen Compiler, sehr eingeschränkter Befehlssatz, nur real mode. 12 KByte groß. Die erzeugten .COM-Dateien sind mit NASM identisch. NASM wird nicht mehr benötigt.
  3. Angefangene Entwicklung von CMD (COMMAND.COM). Nur einige eingebaute Befehle und exec für COM-Dateien. Später BAT-Dateien.

Alle Systeme sind lauffähig unter DOS-BOX und Boxer. Nativ unter MS-DOS müsste auch möglich sein.


(Aus Wikipedia kopiert)

Von Assembler erhält PLA die hohe Ausführungsgeschwindigkeit, die geringe Codegröße und Möglichkeit, die Hardware direkt anzusprechen. Weiterhin werden nur sehr geringe Anforderungen an die Laufzeitumgebung gestellt, falls eine Laufzeitumgebung überhaupt benutzt wird.

Von C erhält PLA die Portabilität, die flexible und kompaktere Struktur des Quelltextes mit der besseren Verständlichkeit und die Checks eines zusätzlichen Parsers. Der im Quelltext verfügbare Compiler erzeugt NASM-Code.

Geschichte


Inspiriert wurde die Sprache von der portablen, high level Assemblersprache risC[1], the terse Programming Language[2] und HLA[3]. Die Entwicklung fand in Richtung der Sprache C statt, neue Low-Level-Sprachelemente wurden eingefügt und die Erweiterung von 8/16 bit auf 32 bit vorgenommen. Weitere Projekte wie C Intermediate Language (CIL)[4] und Low Level Virtual Machine (LLVM) beeinflussten die Entwicklung. Weiterhin fand ein Wechsel auf den für mehrere Plattformen verfügbaren freien Assembler NASM statt.

Eigenschaften

Für die systemnahe Programmierung wird die C-Syntax um die folgenden Elemente geändert:

  • Alle Prozessorregister sind reservierte Namen und können wie Basisdatentypen ohne Adresse angesprochen werden.
  • Die fast orthogonale Schnittstelle der X86-CPU erlaubt nur 2-Adress-Anweisungen.
  • Assembler-Quellcode ist zeilen- oder blockweise einstreubar.
  • Zusätzliche Schlüsselwörter wie ifzero, if carry, inth, emit erleichtern die Kommunikation mit BIOS oder Betriebssystem.
  • Zusätzliche Syntax- und Parserchecks vor Übergabe an den Assembler.
  • Einstellbare Speicherorte für initialisierte oder Felder-Datentypen.
  • Falls ein Betriebssystem vorhanden ist, werden nur die Dateifunktionen für create, open, read, write benötigt.
  • Funktionen für BIOS-Aufrufe oder Direkt-I/O für die textuelle Ein- und Ausgabe sind vorhanden.
  • Benötigte Funktionen werden aus einer Quellcodebibliothek automatisch eingebunden.
  • Im Zwischencode sind Datentypen, Funktionen und Aufrufe gelistet und kommentiert.
  • Als Output wird Zwischencode für NASM erzeugt, der leicht für unterschiedliche Betriebssysteme geändert werden kann.
  • Die minimalen Softwareanforderungen sind DOS in allen Versionen oder Virtualisierer wie VirtualBoxDOSBox oder VirtualPC.

Einschränkungen

Es bestehen die folgenden Einschränkungen:

  • Keine 3 oder mehr Adress-Operationen. Lange Ausdrücke müssen zerlegt werden.
  • Nur ein Teilbereich der C-Schlüsselwörter wird unterstützt.
  • Keine Gleitkommazahlen, keine komplexen Zahlen und keine komplexen Datentypen.

Beispielprogramm in PLA

Mit der cdecl-Aufrufkonvention werden Parameter, lokale Variablen und Funktionsergebnisse compiliert. Ebenfalls entsprechen der C-Syntax die Deklaration von Variablen, #defineInclude-Dateien, Schleifen-Konstrukte wie if..then..else, do, while, goto oder Labels.

Die wesentlichen Änderungen betreffen die Ausdrücke, welche durch die 2-Adressmaschine limitiert werden. Siehe die folgenden Codeschnipsel:

1. Addition einer Konstante an eine Bytevariable
charvar += 7;
-> add byte [charvar], 7

2. Zuweisung einer Konstanten an den Inhalt einer Zeigervariablen. Dies wird üblicherweise zum Abschluss eines string benutzt. Der Compiler verwendet automatisch das ebx-Register zum Zwischenspeichern der Adresse, da in einem Befehl nicht zwei Speicherzugriffe vorkommen dürfen.
*ptrvar = 0;
-> mov word ebx, [ptrvar] ; Adresse der Variablen in ebx
-> mov byte [ebx], 0  ; Ein Byte wird im Hauptspeicher mit der Adresse, welche sich in ebx befindet, gespeichert.

3. Zuweisung einer lokalen Variablen an eine globale Variable, Der Compiler nimmt automatisch den Akkumulator als Zwischenspeicher.
globalvar = localvar;
-> mov eax, dword [bp-8]
-> mov dword [globalvar], eax

4. Addition einer Variable auf eine Variable
var1 += var2;
-> mov al, byte [var2] ; Der Akkumulator wird als Zwischenspeicher benutzt.
-> add byte [var1], al

Weblinks

Einzelnachweise

  1.  risC, The portable, object oriented, high level assembler programming tool with a flexible C-like syntax, 1987 by International Microcomputer Software Inc. (IMSI)
  2. The TERSE Programming Language, 1996 Jim Nail, ISBN 0-9652660-0-1.
  3.  HLA (High Level Assembly) in: Randall Hyde:The Art of Assembly Language, ISBN 1-886411-97-2.
  4.  C Intermediate Language