PS 440 ist eine Systemprogrammiersprache für den TR 440. Sie vereint die Vorteile höherer Programmiersprachen gegenüber Assemblersprachen, wie größere Übersichtlichkeit, verminderte Fehleranfälligkeit, höheren Dokumentationswert des Quellprogramms und größere Bequemlichkeit beim Programmieren, mit der Möglichkeit, die Hardware des TR 440 in allen Einzelheiten zu nutzen.
PS 440 wurde an der TU München entwickelt als Hilfsmittel für die Programmierung eines Betriebssystems. Der Hersteller des TR 440 hat den PS‑440-Compiler nicht selbst eingesetzt und auch nicht als Standard-Software vertrieben, aber die Dokumentation in der Schriftenreihe System TR 440 veröffentlicht. Der Compiler wurde von der STARG verbreitet und weiterentwickelt.
Geschichte
PS 440 wurde von der Arbeitsgruppe für Betriebssysteme der TU München entwickelt als Hilfsmittel zur Programmierung eines Betriebssystems für den TR 440.
Gerhard Goos schrieb die Syntax-Analyse des PS‑440-Compilers mit Hilfe des von ihm entwickelten Parsergenerators SMG (Syntax-Maschinen-Generator). Klaus Lagally schrieb die Codegenerierung. Gerd Sapper brachte den Compiler auf den Betriebssystemen zum Ablauf. Das Ergebnis ist in Bericht 7002 (I. Teil des PS‑440-Handbuchs) dokumentiert.
Helgrit Wich erstellte ein Skriptum zu einem Programmierkurs von Klaus Lagally und Gerd Sapper, daraus ist dann Bericht 7106 (II. Teil des PS‑440-Handbuchs) entstanden.
In der Software-Entwicklung für Großrechner bei AEG-Telefunken wurde PS 440 nicht eingesetzt, da hier schon frühzeitig die Verwendung der höheren Programmiersprache BCPL an Stelle einer Assemblersprache verfolgt wurde. 1972 erschien das PS‑440-Handbuch in der Serie System TR 440 bei Telefunken Computer. Der Compiler wurde über den Arbeitskreis Programmaustausch der STARG verbreitet.
1976 wurde in Stuttgart im Rahmen einer studentischen Semesterarbeit die Testhilfe Trace für PS 440 ergänzt, wie von anderen Compilern des TR 440 gewohnt.
Mit der Ausmusterung der letzten TR 440 Mitte bis Ende der 80er-Jahre endete naturgemäß die Anwendung der Sprache PS 440.
Programmstruktur
Der Compiler bildet die PS‑440-Quelle auf die Telefunken-Assemblersprache TAS ab; die nicht durch die Sprachmittel von PS 440 abgedeckten SystemfunktionenHardwarebefehle; Steuerung von Assembler-, Montierer- und Überwacherfunktionen können durch Einschübe von TAS-Sequenzen genutzt werden. Die erzeugte TAS-Quelle kann anschließend in der üblichen Weise assembliert und montiert werden. Der PS‑440-Compiler ist ein Single-Pass-Compiler; der TAS-Assembler fungiert als zweiter Durchlauf der Compilation. Diese Konstruktion hat folgende Konsequenzen: Ein PS‑440-Programm besteht aus einem oder mehreren, an einander gereihten (nicht geschachtelten), Segmenten. Bezeichner sind lokal in einem Segment gültig; Bezeichner, die als global gekennzeichnet sind, gelten im gesamten Quellprogramm. Bezeichner aus anderen Programmmoduln können per Extern-Vereinbarung erreicht werden, selbständige globale Bezeichner können als Eingang gekennzeichnet und so für andere Programmmoduln erreichbar gemacht werden; die Externbezüge werden den Eingangsbezeichnern beim Montieren zugeordnet. Anweisungen, Deklarationen und Spezifikationen können, getrennt durch Semikolon, in gemischter Reihenfolge niedergeschrieben werden.Der TAS-Assembler legt Konstanten, Variable und Befehle jeweils in eigenen Adresszonen ab, die dann beim Montieren mit gleichartigen Adresszonen aus anderen Programmmoduln jeweils zu Gebieten zusammengefasst werden. Mit anderen Worten: Auch wenn in der PS‑440-Quelle zwischen den Anweisungen Variablen- oder Konstanten-Deklarationen eingestreut sind, landen die den Anweisungen entsprechenden Befehle schließlich fortlaufend im Maschinenprogramm und werden – abgesehen von Sprungbefehlen und Prozeduraufrufen – fortlaufend ausgeführt. Dies gilt natürlich nur, soweit dieser Mechanismus nicht durch einen STARR- oder ABLAGE-Pseudobefehl in einem TAS-Einschub unterdrückt ist. Alle Bezeichner müssen vor ihrer ersten Verwendung deklariert oder wenigstens spezifiziert sein, sofern ihre Art nicht aus der Verwendung hervorgeht. Beispiele: eine Marke braucht nicht vorab spezifiziert zu werden, wenn sie in einer Sprung-Anweisung verwendet wird; eine Variable, die in einer konstanten Referenz verwendet wird, kann auch weiter hinten im Programm deklariert sein. Selbständige Bezeichner aus PS‑440-Deklarationen können in den TAS-Einschüben verwendet werden. In TAS deklarierte Bezeichner sind dagegen außerhalb der TAS-Einschübe unbekannt. Am besten deklariert man alle benötigten Bezeichner mit PS‑440-Sprachmitteln (außerhalb von TAS-Einschüben). Als quellsprachbezogener Dump kann der TAS-Dump verwendet werden.
In PS 440 gibt es 97 reservierte Schlüsselwörter, die als Delimiter, Deklaratoren, Operatoren und Bezeichnungen der Hardware-Register fungieren.
Die Syntax in der Tradition der Algol-ähnlichen Sprachen macht insbesondere Anleihen bei Algol 68 und umfasst die üblichen Bausteine der strukturierten Programmierung.
Datentypen
Entsprechend der Datenstruktur des TR 440 kennt PS 440 nur drei Datentypen: SHORT Halbwort mit 24 Bit Länge, FULL Ganzwort mit 48+2 Bit Länge, LONG Doppelwort mit 2×(48+2) Bit Länge. Größen dieser Typen können in einem passenden Register oder im Hauptspeicher liegen; im Speicher haben die Halbwörter fortlaufende, die Ganz- und Doppelwörter gerade Adressen. Für alle Operatoren ist festgelegt, auf welche dieser Typen sie anwendbar sind und welchen dieser Typen sie als Ergebnis liefern. Für Zwischenergebnisse in komplexen Ausdrücken wählt der Compiler Register oder Speicherzellen passender Länge aus.
Weitere Datentypen differenzieren anhand des Zugriffsmechanismus: INDEX wird zur Deklaration von Halbwörtern im Index-Speicher benutzt: In Ausdrücken verhalten sie sich wie SHORT-Größen, der Speicherzugriff erfolgt jedoch über spezielle Befehle. PART ist ein beliebiger, durch eine Bitmaske gesteuerter, Ausschnitt aus einer FULL-Größe; in Ausdrücken wird eine PART-Größe als Ganzwort (wie eine FULL-Größe) weiter verarbeitet. LABEL, PROC und PROCSFB beziehen sich auf Halbwort-Adressen in der Befehlszone; sie können Ziel eines Sprunges oder eines Prozeduraufrufs sein. Den Datentypen im Sinne höherer Programmiersprachen, wie bool, int, real und bytes in Algol 68, sind in PS 440 keine unterschiedlichen Datentypen zugeordnet; vielmehr wird die Interpretation der Daten teils anhand ihres aktuellen Wertes (nämlich ihrer Typenkennung) bestimmt, teils anhand der Operationen, die man auf sie anwendet.
Typenkennung
Jedes Ganzwort enthält neben den 48 Bit der eigentlichen Information noch 2 Bit als Typenkennung mit folgender Bedeutung: Gleitkommazahlen haben im Ganzwort TK=0 (im Doppelwort TK=0 im ersten, TK=1 im zweiten Teil); Festkommazahlen haben TK=1 (im Doppelwort zweimal); Befehle belegen Halbwörter innerhalb von Ganzwörtern mit TK=2; je sechs Textzeichen belegen normalerweise ein Ganzwort mit TK=3.
Literale legen durch ihre Form die Typenkennung implizit fest, so erzeugen etwa die Literale 1.618 und 6.022⏨23 Ganzwörter mit TK=0, die Literale 5 und -2 Ganzwörter mit TK=1 und das Literal "PS 440" ein Ganzwort mit TK=3; Bits-Angaben wie '2H 0003 AFFE' enthalten (links vom H) die gewünschte Typenkennung.Literale können auch mit einer Längen-Angabe versehen werden, etwa SHORT 42 oder LONG 3.14159265358979323846264338.
Typenkennungen können mit den Operationen TK0, TK1, TK2 und TK3 gesetzt und mit der Operation TK abgefragt werden.
Operationen und Operanden
Einige Operationen verhalten sich unterschiedlich, je nach der Typenkennung ihrer Operanden. So vergleichen etwa die Vergleichs-Operationen >, ≥ =, ≠, ≤ und < zwei Operanden mit TK=0 als Gleitkommazahlen (mit Berücksichtigung von Exponent und Vorzeichen), zwei Operanden mit TK=1 als Festkommazahlen (mit Berücksichtigung des Vorzeichens) und zwei Operanden mit TK=2 oder TK=3 als positive Festkommazahlen.Der Programmierer muss dafür Sorge tragen, dass möglichst nur Operanden mit gleicher Typenkennung verglichen werden. Bei Operanden unterschiedlicher Typenkennungen geht die Transitivität der Vergleichsoperatoren verloren; so ergibt sich beispielsweise die widersprüchliche Situation, dass −1<1, 1<"1" und "1"<−1 alle gleichermaßen zutreffen! Auch die Wirkung der Verschiebe-Operationen LEFT, RIGHT, LEFTC und RIGHTC hängt von der Typenkennung ihres linken Operanden ab.
Bei anderen Operationen entscheidet die Wahl des Operator-Zeichens, welche Variante gewünscht ist. So gibt es beispielsweise unterschiedliche Operatoren für die arithmetischen Operationen, etwa * für die Festkomma-Multiplikation und ** für die Gleitkomma-Multiplikation. Diese Operationen lösen eine Programmunterbrechung, den TK-Alarm, aus, wenn ihre Operanden die falsche Typenkennung haben.Vorsicht ist auch geboten bei den Operatoren + und −: Die führen stets eine Festkomma-Addition bzw. ‑Subtraktion durch (jeweils mit Berücksichtigung des Vorzeichens), auch wenn ein Operand eine andere Typenkennung als 1 hat. So wird beispielsweise 1.618 bei der (versehentlichen) Festkomma-Addition als 7116039255041 aufgefasst und "PS 440" als −52971178773327. Die Operatoren ET, VEL und AUT verknüpfen ihre Operanden bitweise.
Die Wertoperatoren SVAL, FVAL und LVAL fassen ihren (einzigen) Operanden als Adresse eines Halb-, Ganz- bzw. Doppelworts im Speicher auf und liefern dessen aktuellen Inhalt; entsprechend liefert IVAL den Inhalt einer Indexspeicherzelle (ein Halbwort). Umgekehrt liefert der Referenz-Operator REF, der nur auf einen Operanden im Speicher angewandt werden kann, dessen Adresse.
Ausdrücke
Formeln beschreiben die Berechnung von Werten aus einfachen Operanden. Sie folgen der üblichen Syntax mit Infixnotation für binäre und Präfixnotation für unäre Operatoren mit den üblichen Prioritäten und mit runden Klammern, wo die normalen Operator-Prioriäten nicht passen. Alle Ausgangs-, Zwischen- und Resultatwerte haben eine inhärente Länge gemäß einem der drei Datentypen und werden bei Bedarf verlängert oder verkürzt.Beim Verkürzen eines Wertes auf FULL oder SHORT wird das rechte Ganz- bzw. Halbwort des Ausgangswerts weiter verwendet. Beim Verlängern von SHORT auf FULL wird links mit Vorzeichen-gleichen Bits aufgefüllt, auch bei TK=2 oder TK=3. Beim Verlängern auf LONG wird links ein Ganzwort mit der Festkommazahl 0 ergänzt. Auch das kann zu Überraschungen führen: nach LONG L := −FULL 1 ist L positiv, nach LONG L := −LONG 1 negativ.
Da PS 440 keinen booleschen Datentyp kennt, kann ein Vergleich keine Formel sein, sondern ist eine Bedingung: Bedingungen steuern Fallunterscheidungen und Wiederholungen, liefern aber im Gegensatz zu Formeln keinen Wert, der gespeichert oder mit dem weitergerechnet werden kann. Die Grundbausteine der Bedingungen sind Vergleiche und Tests. Die Alarmtests TKAL (Typenkennungs-Alarm) und ARAL (Arithmetischer Alarm, d. h. Arithmetischer Überlauf erkannt) haben keinen Operanden, die Typenkennungs- und Bit-Tests haben zwischen dem Operatorsymbol und dem Operanden noch eine TK- bzw. Bit-Nummer, zum Beispiel: IF TK 1 RA THEN RA := −RA FI; diese Nummer muss explizit (nicht als Formel) angegeben werden. Vergleiche und Tests können mit den logischen Operatoren ¬, ∧ und ∨ zu komplexen Bedingungen verknüpft werden.
Deklarationen und Spezifikationen Selbständige Vereinbarung
Die mit selbständigen Vereinbarungen definierten Bezeichner können auch in TAS-Einschüben verwendet werden und erscheinen gegebenenfalls im Trace und im TAS-Dump.