MAD (Programmiersprache) - MAD (programming language)

VERRÜCKT
Paradigma Imperativ
Entwickler Galler, Arden und Graham
Erstmals erschienen 1959
Betriebssystem UMES , MTS , CTSS , andere
Wichtige Implementierungen
IBM 704 , IBM 7090 , UNIVAC 1108 , Philco 210-211, IBM S/360 und IBM S/370
Dialekte
MAD, MAD/I, GOM
Beeinflusst von
IAL , ALGOL 58

MAD ( Michigan Algorithm Decoder ) ist eine Programmiersprache und ein Compiler für die IBM 704 und später die IBM 709 , IBM 7090 , IBM 7040 , UNIVAC 1107 , UNIVAC 1108 , Philco 210-211 und schließlich die IBM S/370 Mainframe-Computer. MAD wurde 1959 an der University of Michigan von Bernard Galler , Bruce Arden und Robert M. Graham entwickelt und ist eine Variante des ALGOLSprache. Es wurde weithin zu lehren Programmierung an Hochschulen und Universitäten in den 1960er Jahren verwendet und spielte eine untergeordnete Rolle bei der Entwicklung von CTSS , Multics , und die Michigan - Terminal - System Computer - Betriebssysteme .

Die Archive der Bentley Historical Library der University of Michigan enthalten Referenzmaterialien zur Entwicklung von MAD und MAD/I, darunter drei Meter lange Ausdrucke mit handschriftlichen Aufzeichnungen und gedruckten Originalhandbüchern.

MAD, MAD/I und GOM

Es gibt drei MAD-Compiler:

  1. Original MAD , der Compiler, der 1959 an der University of Michigan für die IBM 704 und später die IBM 709 und IBM 7090 Mainframe- Computer entwickelt wurde, auf denen die Betriebssysteme University of Michigan Executive System (UMES) und Compatible Time-Sharing System (CTSS) laufen . Mitte der 1960er Jahre wurde MAD an der University of Maryland auf die UNIVAC 1108 portiert . Versionen von MAD waren auch für Philco 210-211 und UNIVAC 1107 erhältlich .
  2. MAD/I , eine "erweiterte" Version von MAD für die IBM System/360- Computerserie, die unter dem Michigan Terminal System (MTS) läuft . Die Arbeit an dem neuen Compiler begann 1965 als Teil des von der ARPA gesponserten CONCOMP-Projekts an der University of Michigan. Im Laufe der Arbeit wurde allmählich klar, dass MAD/I eine neue Sprache war, die unabhängig von der ursprünglichen 7090-Version von MAD war.
  3. GOM ( G ute O ld M AD), eine Neuimplementierung des ursprünglich 7090 MAD für das IBM System / 370 - Serie von Großrechnern des laufenden Michigan - Terminal - Systems (MTS). GOM wurde in den frühen 1980er Jahren von Don Boettner am Computing Center der University of Michigan entwickelt.

Geschichte

Während MAD durch ALGOL 58 motiviert wurde , ähnelt es ALGOL 58 in keiner Weise.

Zu den in MAD geschriebenen Programmen gehörten MAIL, RUNOFF , eines der ersten Textverarbeitungssysteme und mehrere andere Dienstprogramme, die alle unter dem Compatible Time-Sharing-System (CTSS) standen. Es wurde an einem Entwurf für einen MAD-Compiler für Multics gearbeitet , der jedoch nie implementiert wurde.

Das Folgende ist ein interessantes Zitat aus Ein Interview mit Brian Kernighan, als er gefragt wurde "Was hat Sie am Programmieren gefesselt?":

Ich glaube, der größte Spaß, den ich beim Programmieren hatte, war ein Sommerjob bei Project MAC am MIT im Sommer 1966, wo ich an einem Programm arbeitete, das in den Anfangstagen von Multics ein Jobband für den brandneuen GE 645 erstellte. Ich schrieb in MAD, was viel einfacher und angenehmer war als die von mir zuvor geschriebenen FORTRAN und COBOL, und ich benutzte CTSS, das erste Time-Sharing-System, das unendlich einfacher und angenehmer war als Lochkarten.

MAD war im Vergleich zu einigen anderen Compilern seiner Zeit ziemlich schnell. Da viele Leute an der FORTRAN- Sprache interessiert waren und dennoch die Geschwindigkeit des MAD-Compilers erreichen wollten, wurde ein System namens MADTRAN (in MAD geschrieben) entwickelt. MADTRAN war einfach ein Übersetzer von FORTRAN nach MAD, der dann Maschinencode erzeugte. MADTRAN wurde über SHARE vertrieben .

MAD/I hat eine syntaktische Struktur ähnlich der von ALGOL 60 zusammen mit wichtigen Merkmalen aus dem ursprünglichen MAD und von PL/I . MAD/I wurde als erweiterbare Sprache konzipiert. Es war für die Verwendung unter MTS verfügbar und lieferte viele neue Ideen, die ihren Weg in andere Sprachen fanden, aber MAD/I-Kompilationen waren langsam und MAD/I wurde im Vergleich zum ursprünglichen 7090 MAD nie weit verbreitet.

GOM ist im Wesentlichen die 7090 MAD-Sprache, die für die 360/370-Architektur modifiziert und erweitert wurde, mit einigen sorgfältigen Anpassungen, um den aktuellen Programmierpraktiken und -problemen besser zu entsprechen. Das MTS- Nachrichtensystem wurde in GOM geschrieben.

MAD, MAD Magazine und Alfred E. Neuman

Zeilendruckerausgabe nach einem MAD-Compilerfehler auf einem IBM 704-Computer an der University of Michigan, c. 1960

In einer Vorabversion des ursprünglichen MAD, als Verweis auf den Namensgeber von MAD , das MAD-Magazin , druckte der Compiler, wenn ein Programm zu viele Kompilierzeitfehler enthielt, ein ganzseitiges Bild von Alfred E. Neuman unter Verwendung von ASCII-Grafiken . Die Bildunterschrift lautete: "Sehen Sie sich diesen Mann wegen Ihres Programms an - er möchte es vielleicht veröffentlichen. Er macht sich keine Sorgen - aber so wie Ihr Programm aussieht, sollten Sie es." Diese Funktion war in der endgültigen offiziellen Version nicht enthalten. Es war jedoch in der Produktionsversion für die IBM 7040 enthalten.

Und Bernie Galler erinnert sich:

Als wir die Sprache entwarfen, von der wir dachten, dass sie sich lohnen würde und für die wir einen Compiler entwickeln konnten, konnten wir sie nicht mehr Algol nennen; es war wirklich anders. Zu diesem Zeitpunkt haben wir den Namen MAD für den Michigan Algorithm Decoder angenommen. Wir hatten eine lustige Interaktion mit den Leuten des Mad Magazine, als wir um Erlaubnis baten, den Namen MAD zu verwenden. In einem sehr lustigen Brief sagten sie uns, dass sie uns vor Gericht bringen würden und alles andere, beendeten die Drohung jedoch mit einem PS am Ende - "Klar, mach weiter." Leider ist dieser Brief verloren.

Beispiel "Hallo Welt"

Das Beispielprogramm " hello, world " gibt die Zeichenfolge "Hello, world" an ein Terminal oder eine Bildschirmanzeige aus.

PRINT FORMAT HELLOW
VECTOR VALUES HELLOW=$13h0Hello, world*$
END OF PROGRAM

Das erste Zeichen der Zeile wird als logische Wagensteuerung behandelt , in diesem Beispiel das Zeichen "0", das bewirkt, dass eine Zeile mit doppeltem Zeilenabstand gedruckt wird.

Alternativ können Kontraktionen verwendet werden, die der Compiler in der Auflistung erweitert:

P'T HELLOW
V'S HELLOW=$13h0Hello, world*$
E'M

Sprachelemente

MAD und GOM, aber nicht MAD/I, setzen sich aus folgenden Elementen zusammen:

Eingabeformat

MAD-Programme sind eine Reihe von Aussagen, die auf Lochkarten geschrieben sind, im Allgemeinen eine Aussage pro Karte, obwohl eine Aussage auf mehrere Karten fortgesetzt werden kann. Die Spalten 1-10 enthalten ein optionales Statement-Label, Kommentare oder Bemerkungen werden mit dem Buchstaben "R" in Spalte 11 gekennzeichnet und die Spalten 73-80 werden nicht verwendet und könnten einen Sequenzbezeichner enthalten. Leerzeichen sind nur innerhalb von Zeichenkonstanten von Bedeutung. Für GOM ist die Eingabe eine Freiform ohne Sequenzfeld und die Zeilen können bis zu 255 Zeichen lang sein; Zeilen, die mit einem Sternchen (*) beginnen, sind Kommentare; und Zeilen, die mit einem Pluszeichen (+) beginnen, sind Fortsetzungszeilen.

Namen

Variablennamen, Funktionsnamen und Anweisungslabels haben die gleiche Form, ein Buchstabe gefolgt von null bis fünf Buchstaben oder Ziffern. Funktionsnamen enden mit einem Punkt. Alle Namen können tiefgestellt werden (der Name gefolgt von Klammern, wobei mehrere tiefgestellte Zeichen durch Kommas getrennt sind). GOM-Namen können bis zu 24 Zeichen lang sein und den Unterstrich (_) enthalten.

Nur wenige Schlüsselwörter in der Sprache sind reservierte Wörter, da die meisten länger als sechs Buchstaben sind oder von Punkten umgeben sind. Es gibt einen Standardsatz von Abkürzungen, die verwendet werden können, um die längeren Wörter zu ersetzen. Diese bestehen aus dem ersten und letzten Buchstaben der Schlüsselwörter mit einem Apostroph dazwischen, wie W'R für WHENEVER und D'N für DIMENSION.

Datentypen

MAD verwendet den Begriff "Modus" für seine Datentypen. Fünf grundlegende Modi werden unterstützt:

  • Ganzzahl geschrieben mit oder ohne Skalierungsfaktor (1, +1, -1, 1K10, 1K) oder als Oktalkonstante (bis 777777777777K);
  • Gleitkomma mit oder ohne Exponent geschrieben (0., 1.5, -0.05, +100.4, -4., .05E-2, -.05E2, 5E02, 5.E2);
  • Boolean (1B für wahr und 0B für falsch);
  • Statement-Label und
  • Funktionsname geschrieben als Name gefolgt von einem Punkt (SQRT.).

Der Modus einer Konstante kann neu definiert werden, indem das Zeichen M gefolgt von einer einzelnen Ziffer am Ende der Konstante hinzugefügt wird, wobei 0 für Gleitkommazahlen, 1 ganze Zahl, 2 boolesch, 3 Funktionsname und 4 Anweisungsbezeichnung steht.

Für GOM werden sechs zusätzliche Modi hinzugefügt: CHARACTER, SHORT INTEGER, BYTE INTEGER, LONG INTEGER, POINTER und DYNAMIC RECORD.

Alphabetische oder Zeichenkonstanten werden als ganze Zahlen gespeichert und mit dem Dollarzeichen als Trennzeichen ($ABCDEF$) geschrieben, wobei doppelte Dollarzeichen verwendet werden, um ein echtes Dollarzeichen einzugeben ($$$.56$ entspricht 56 ​​Cent). Strings, die länger als sechs Zeichen sind, werden mit Arrays dargestellt.

Arrays und Matrizen

  • Die Anzahl der Dimensionen ist nicht begrenzt.
  • Negativ und Null sowie Gleitkomma-Indexe sind erlaubt.
  • Matrizen werden in aufeinanderfolgenden Speicherplätzen in der Reihenfolge gespeichert, die durch Variieren des ganz rechten Index zuerst bestimmt wird.
  • Auf Matrizen kann unter Verwendung eines tiefgestellten Indexes für jede Dimension, NAME(s 1 ,s 2 ,s 3 ) oder unter Verwendung eines einzelnen tiefgestellten Indexes, NAME(s 1 ) verwiesen werden .
  • Eingabe-Ausgabe-Listen, VECTOR VALUES-Anweisungen und einige Unterprogramme ermöglichen die Verwendung der Blocknotation, die die Form A,...,B oder A...B hat, die eine Referenz auf den gesamten Bereich von A nach B ist. inklusive. In Bezug auf einen Vektor wäre A(1)...A(N) A(1), A(2), A(3), ..., A(N).
  • Es gibt Einrichtungen, die eine Änderung der Dimensionen zur Laufzeit ermöglichen; Ermöglichen, dass der Programmierer die Position des Anfangselements in einem Array innerhalb des Gesamtblocks variiert, der für das Array beiseite gelegt wurde; und Ermöglichen, dass eine beliebige Speicherabbildung spezifiziert wird.
Liste der Operatoren, Anweisungen und Funktionen

Betreiber

Erklärungen

Variablen können implizit oder explizit deklariert werden. Standardmäßig werden alle implizit deklarierten Variablen als Gleitkommavariablen angenommen. Die Anweisung NORMAL MODE IS kann verwendet werden, um diesen Standardwert zu ändern.

Ausführbare Anweisungen

Eingabe- und Ausgabeanweisungen

Funktionen

Funktionsnamen enden mit einem Punkt. Interne und externe Funktionen werden unterstützt. Interne Funktionen werden als Teil des Programms, in dem sie verwendet werden, kompiliert und teilen Deklarationen und Variablen mit dem Hauptprogramm. Externe Funktionen werden separat kompiliert und verwenden keine Deklarationen und Variablen. Eine One-Statement-Definition interner Funktionen ist zulässig. Rekursive Funktionen sind erlaubt, obwohl die Funktion einen Teil der erforderlichen Speicher- und Wiederherstellungsarbeit selbst erledigen muss.

Operatordefinition und Neudefinition

Eine der interessantesten Funktionen in MAD ist die Möglichkeit, die Sprache zu erweitern, indem vorhandene Operatoren neu definiert, neue Operatoren definiert oder neue Datentypen (Modi) definiert werden. Die Definitionen werden unter Verwendung von MAD-Deklarationsanweisungen und Mnemoniken der Assemblersprache vorgenommen, die nach der Deklaration bis zum END-Pseudobefehl enthalten sind, der die Operation implementiert.

  • DEFINE BINARY OPERATOR Defined-Op , PRECEDENCE Rang vorhanden-Op MODE STRUCTURE Modus-Optionen
  • DEFINE UNARY OPERATOR Defined-Op , PRECEDENCE Rang vorhanden-Op MODE STRUCTURE Modus-Optionen
  • MODE STRUKTUR mode-no = mode-no vorhanden-op mode-no
  • MODUS STRUKTUR Modus-Nr = Modus-Kein vorhandener-Op Modus-Nr GLEICHE SEQUENZ WIE Modus-Kein vorhandener-Op Modus-Nr

wo:

  • Rang ist einer von SAME AS, LOWER THAN oder HIGHER THAN; und
  • Modusoptionen sind die Optionen, die in der MODE STRUCTURE-Anweisung erscheinen.

Drei vordefinierte Definitionspakete (MATRIX, DOUBLE PRECISION und COMPLEX) stehen für die Einbindung in MAD-Quellprogramme mit der INCLUDE-Anweisung zur Verfügung.

  • Paket einschließen

Siehe auch

Anmerkungen

Verweise

Externe Links