BLISS (Programmiersprache)
BLISS ist eine Systemprogrammiersprache, die um 1970 an der Carnegie Mellon University von W. A. Wulf, D. B. Russell und A. N. Habermann entwickelt wurde. Es war die bekannteste Systemprogrammiersprache, bevor einige Jahre später C aufkam. Von da an wurde C wichtiger als BLISS. In den ersten Jahren der Existenz von C gab es bei den Bell Labs einige Projekte, die BLISS gegenüber C im Vorteil sahen.
BLISS | |
---|---|
Paradigmen: | strukturiert, imperativ (prozedural) |
Erscheinungsjahr: | 1970 |
Designer: | William Wulf |
Entwickler: | Carnegie Mellon University |
Aktuelle Version: | BLISS-64 () |
Typisierung: | ungetypt |
Dialekte: | Common BLISS |
Beeinflusst von: | ALGOL |
Betriebssystem: | Cross-platform: PDP-10, PDP-11, DEC Alpha, DEC PRISM, Intel IA-32, Intel IA-64, VAX |
pdp-10.trailing-edge.com/bb-m836d-bm/ |
BLISS ist eine untypisierte blockstrukturierte Programmiersprache, bei der Ausdrücke im Vordergrund stehen und nicht Anweisungen. Sie enthält Konstrukte für Ausnahmebehandlung, Koroutinen und Makros. BLISS bietet keine GOTO-Anweisung an.
Der Name BLISS steht für „Basic Language for Implementation of System Software“; manchmal wird die Abkürzung wegen des Autors William Wulf auch als „Bill's Language for Implementing System Software“ interpretiert.
Der ursprüngliche Compiler der Carnegie-Mellon-Universität war berühmt wegen seiner weitreichenden Optimierungen und bildete den Hintergrund des Lehrbuchs The Design of an Optimizing Compiler.
Die Digital Equipment Corporation entwickelte und pflegte BLISS-Compiler für die PDP-10, PDP-11, DEC Alpha, DEC PRISM, Intel IA-32, Intel IA-64 und VAX und verwendete sie in den 1980er Jahren intensiv hausintern. Die meisten Dienstprogramme für das Betriebssystem VMS waren in BLISS-32 geschrieben.
Eigenschaften der Sprache
Aus dem Handbuch:
„BLISS hat viele Vorrichtungen anderer moderner Hochsprachen: Blockstruktur, eine automatische Stapelverarbeitung und Mechanismen für Definition und Aufruf rekursiver Prozeduren. […] Es bietet eine Vielzahl vordefinierter Datenstrukturen und […] Einrichtungen für Tests und Iteration. […]
Andererseits fehlen in BLISS bestimmte Vorrichtungen anderer Hochsprachen. Es hat keine eingebauten Vorrichtungen für Ein-/Ausgabe, weil ein Betriebssystemprojekt normalerweise seine eigene Ein-/Ausgabe entwickelt […] Es erlaubt den Zugriff auf maschinenspezifische Vorrichtungen, weil Systemsoftware dies oft verlangt. BLISS hat Eigenschaften, die unter Hochsprachen ungewöhnlich sind. Ein Name […] wird durchgängig als die Adresse einer Speichereinheit interpretiert und nicht als Wert in einer Speichereinheit. […] Außerdem ist BLISS eine ‚Ausdruckssprache‘ und keine „Anweisungssprache“. Das heißt, dass jedes Konstrukt der Sprache außer den Deklarationen ein Ausdruck ist. Ausdrücke liefern einen Wert und verursachen möglicherweise auch eine Aktion wie etwa eine Änderung des Speichers, einen Wechsel der Steuerung oder die Ausführung einer Programmschleife. Das Gegenstück zu einer Wertzuweisung beispielsweise ist in BLISS strenggenommen ein Ausdruck, der selbst einen Wert hat. Der Wert eines Ausdrucks kann in BLISS entweder benutzt oder ignoriert werden. […] Schließlich verfügt BLISS über eine Makro-Vorrichtung, die eine Flexibilität erlaubt, wie man sie sonst nur in Makro-Assemblern findet.“
Grundlegende Eigenschaften von BLISS sind die folgenden:
- Alle Konstanten sind Ganzwortwerte für die verwendete Maschine, das heißt also, auf einer 16-bit-Maschine wie der PDP-11 umfasst eine Konstante 16 Bit, auf einer VAX 32 Bit und auf einer PDP-10 36 Bit.
- An den Namen einer Variablen wird immer die Adresse der Variablen gebunden, nicht ihr Wert. Beispielsweise bedeutet die Instruktion
Z+8
, dass die Zahl 8 auf die Adresse von Z addiert wird, nicht auf ihren Wert. Wenn der Wert von Z erhöht werden soll, muss die Adresse erst durch Voranstellen eines Punkts dereferenziert werden, das heißt also.Z+8
.
- Bezeichner für Variablen und Konstanten müssen vor ihrer Verwendung deklariert werden, typischerweise mit dem Schlüsselwort
OWN
. Der Compiler wird dann normalerweise einen Speicherplatz dafür allozieren; eine Variable kann aber auch mit der DeklarationBIND
an eine bestimmte Speicheradresse oder ein Maschinenregister gebunden werden. - Eine Wertzuweisung wird mit dem Symbol
=
notiert. Die AnweisungZ=8
spezifiziert eine Ganzwortkonstante mit dem Wert 8 und speichert sie an der Adresse vonZ
. Im Licht anderer Programmiersprachen ungewöhnlich ist, dass auch die AnweisungZ+12=14
oder12+Z=14
zulässig ist, welche den Wert 14 an die um 12 erhöhte Adresse vonZ
speichert. - Für den Vergleich werden Schlüsselwörter wie
EQL
(„gleich“),GTR
(„größer“) undNEQ
(„ungleich“) verwendet. Das folgende Programmstück weist den Absolutwert vonZ
an die Adresse vonQ
zu:
Q = (IF .Z GTR 0 THEN .Z ELSE -.Z);
- Blöcke (zusammengesetzte Anweisungen) sind ähnlich zu denen von ALGOL: Ein Block beginnt mit
BEGIN
, endet mitEND
und kann eigene lokale Variablen definieren. Eine besondere Rolle spielt das Semikolon („;“). In Algol dient es dazu, einzelne Anweisungen voneinander zu trennen; in BLISS bestimmt es, ob der Wert eines Ausdrucks erhalten bleibt oder nicht. Das folgende Beispiel stammt aus dem Bliss Language Manual:
Z = BEGIN
LOCAL TEMP;
TEMP = .X;
X = .Y;
Y = .TEMP;
.X EQL .Y
END
Hier wird eine lokale Variable TEMP
definiert, mit deren Hilfe die Inhalte zweier Variablen ausgetauscht werden. Anschließend werden die Variablen noch auf Gleichheit getestet und, weil hinter dieser Anweisung kein Semikolon steht, bleibt das Ergebnis des Vergleichs (0 oder 1) erhalten und wird der Variablen Z
zugewiesen.
- Unterprogramme werden mit dem Schlüsselwort
ROUTINE
eingeleitet.
- Makros werden mit dem Schlüsselwort
MACRO
eingeleitet.
- BLISS kennt arrays, die hier als structures bezeichnet und mit dem Schlüsselwort
VECTOR
deklariert werden.
- Komplexe Fallunterscheidungen mit Hilfe von
CASE
-Ausdrücken - Zählschleifen mit Hilfe von
INCR
-Ausdrücken - Eingebaute Funktionen zur Verarbeitung von Zeichenketten
- Automatische Datenkonvertierungen, zum Beispiel zwischen Zahlen und Zeichenketten
Beispiel
Das folgende Beispiel stammt aus dem Bliss Language Manual:
MODULE E1 (MAIN = CTRL) =
BEGIN
FORWARD ROUTINE
CTRL,
STEP;
ROUTINE CTRL =
!+
! This routine inputs a value, operates on it, and
! then outputs the result.
!-
BEGIN
EXTERNAL ROUTINE
GETNUM, ! Input a number from terminal
PUTNUM; ! Output a number to terminal
LOCAL
X, ! Storage for input value
Y; ! Storage for output value
GETNUM(X);
Y = STEP(.X);
PUTNUM(.Y)
END;
ROUTINE STEP(A) =
!+
! This routine adds 1 to the given value.
!-
(.A+1);
END
ELUDOM
Versionen
- BLISS-10
- BLISS-11 – ein Crosscompiler für die PDP-11
- BLISS-16
- BLISS-16C – die DEC-Version von BLISS-11
- BLISS-32
- BLISS-36
- BLISS-64
- Common BLISS – eine portable Teilmenge
Literatur
- Wulf, W. A.; Russell, D. B.; Habermann, A. N. (1971). BLISS: A Language for Systems Programming. CACM 14(12):780-790, Dec 1971
- Wulf, W. A.; Johnson, R. K.; Weinstock, C. B.; Hobbs, S. O.; Geschke, C. M. (1975). The Design of an Optimizing Compiler. New York: Elsevier, ISBN 0-444-00158-1.
Weblinks
- PDF-Dateien mit Handbüchern (englisch)
- Alan Lehotsky berichtet über die Verwendung von BLISS bei DEC (englisch)
- Language Reference Manual
- „BLISS: A Language for Systems Programming“ von W.A. Wulf, D.B. Russell, und A.N. Habermann. (PostScript)
- Session notes for „Introduction to BLISS“ von Matthew D. Madison. (PostScript)
Downloads
Einzelnachweise
- Bliss Language Manual (Memento des Originals vom 29. September 2007 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis. (PDF, 1987).