Compilerbauhome Compilerbau: Sprachanforderung: ppl Prof. Dr. Uwe Schmidt FH Wedel

Sprachanforderung: ppl


weiter

picture programming language

Sprachelemente
Motivation
Die kleine Sprache ppl soll eine Spezialsprache für die Erzeugung von Bildern sein. Es soll an diesem kleinen aber nichttrivialen Beispiel die Arbeitsweise der einzelnen Phasen eines Compilers und die eines Interpretierers demonstriert werden.
weiter
Datentypen
Diese Spezialsprache zur Erzeugung und Manipulation von Bildern soll zur einfachen Bildbearbeitung einen eingebauten Datentyp für Bilder besitzen. Dieser wird sowohl Graustufenbilder als auch RGB-Bilder unterstützen (mit externer Speicherung als .ppm oder .pgm).
weiter
Operationen
als Operationen sollen pixelweise Farbwertmanipulationen, zum Beispiel Gammakorrektur oder Invertieren der Helligkeit unterstützt werden. Bilder sollen gespiegelt oder gedreht werden können und sie sollen kombiniert werden können. Bilder können nebeneinander oder übereinander angeordnet werden, Farbwerte können pixelweise addiert, subtrahiert und multipiziert werden, oder es können das Minimum oder das Maximum gewählt werden, ...
 
Der Satz an Bildoperationen soll nach einem einfachen Schema erweiterbar sein.
weiter
Koordinaten
Zur Berechnung von Koordinaten sind ganze Zahlen und einfache Operationen auf ganzen Zahlen nötig. Die Sprache muss also einen Datentyp für ganze Zahlen unterstützen.
weiter
Farben
Die Farben (oder Grauwerte) sollen durch Fließkommazahlen im Intervall 0.0 (schwarz) bis 1.0 (weiß) dargestellt werden. Die Sprache muss also einen Fließkomma-Datentyp und einfache Operationen darauf unterstützen.
weiter
Dateinamen
Zum Laden und Speichern werden Dateinamen benötigt. Es muss also eine einfache Unterstützung von Zeichenketten realisiert sein.
weiter
Listen
zur Konstruktion von zusammengesetzten Daten, zum Beispiel für einen Polygonzug als Parameter oder für mehrere Werte als Resultat werden entweder records oder Felder benötigt. Hier sollen Listen als Verallgemeinerung von Feldern und einfache Operationen auf Listen realisiert werden.
weiter
Kontrollstrukturen
weiter
Zuweisungen
Es soll eine einfache imperative Sprache entwickelt werden, also eine Sprache mit Programmvariablen und Zuweisungen. Es sollen mehrfache (parallele) Zuweisungen unterstützt werden. Variablen müssen deklariert sein. Variablen sollen statisch getypt sein.
weiter
Verzweigungen und Schleifen
Als Verzweigung soll ein if-then-else Konstrukt dienen, als Schleifen sollen while- und repeat- Schleife realisiert werden.
weiter
Prädikate
In Schleifen und Verzweigungen kommen Prädikate vor, die Sprache muss also einen Datentyp für Boolesche Werte und die entsprechenden Operationen darauf unterstützen.
weiter
Blöcke
für die Verwendung von lokalen Variablen soll ein Block-Konstrukt zur Verfügung stehen.
weiter
Funktionen
sollen ebenfalls unterstützt werden, da sie ein unverzichtbares Mittel zur Strukturierung von Programmen sind. Außerdem soll die Technik der Implementierung von rekursiven Funktionen durch einen Laufzeitkeller demonstriert werden.
weiter

weiter

Implementierung

Anforderungen
Haskell
wird als Implementierungssprache eingesetzt. Diese rein funktionale Sprache stellt zur Verfügung, was man für die saubere Konstruktion von Compilern benötigt: Die Datentypen für die verschiedenen Baumstrukturen zur Repräsentation der Programmbäume, das mächtige Typkonzept für die Sicherheit und Abstraktionsmechanismen zur Wiederverwendung, und damit zur produktiven Entwicklung von Software.
weiter
Fehlermeldungen
Um den Umfang des Compilers in überschaubaren Grenzen zu halten, wird die Fehlerbearbeitung nur sehr rudimentär realisiert: Das Programm wird nach dem ersten entdeckten Fehler abgebrochen.
weiter
Modularisierung
Die einzelnen Phasen des Übersetzungsprozesses werden durch eigenständige Funktionen realisiert, dadurch ist die Trennung der einzelnen Aufgaben auch im Programmtext sichtbar, und nicht wie in einem Einphasen-Compiler häufig beliebig vermischt.
weiter
die virtuelle Maschine
Die Zielmaschine ist eine virtuelle Kellermaschine, ähnlich der des ursprünglichen Pascal-Compilers von Wirth und auch ähnlich der Java Virtual Machine. Die Auswertung von Ausdrücken erfolgt mittels eines Kellers, auf dem Operanden und Zwischenergebnisse abgelegt werden. Die Variablen werden in einem globalen Datensegment oder für Funktionen auf einem Laufzeitkeller abgespeichert. Dieses ist ein Keller für Funktionsdatensegmente (procedure activation records).
weiter
Lösung
Die aktuellen Quellen des ppl-Systems stehen auf GitHub in dem ppl Repository.
weiter

Letzte Änderung: 18.12.2019
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel