Zurück zum Content

PLA

(Aus Wikipedia kopiert)

 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.

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