logo_90
Uni ZH | Informatikdienste | PostScript

Der Operanden-Stack

PostScript ist eine Stack-orientierte Programmiersprache. Die PostScript-Operatoren nehmen ihre Operanden vom Stack und stellen allfällige Resultate ebenfalls in den Stack. Es gilt das LIFO-Prinzip (Last In, First Out). Das Objekt, welches zuletzt in den Stack gestellt wurde, wird zuerst wieder herausgenommen.

PostScript verwendet die Postfix-Notation. Beispiel:

   10 10 moveto
Die beiden Operanden stehen also links vom Operator.
   10 10 moveto 100 100 lineto
ist gleichbedeutend mit
   100 100 10 10 moveto lineto
Der moveto Operator nimmt sich die beiden 10, weil diese zuletzt in den Stack gestellt wurden.

10 heisst übrigens 10 typografische Punkte = 10/72 Zoll. 10 10 moveto macht eine Bewegung zum Punkt (10,10) im Koordinatensystem. Der Nullpunkt befindet sich auf dem Papierblatt links unten. Mit 100 100 lineto definieren wir eine Linie vom aktuellen Punkt (10,10) zur neuen Position (100,100). Damit haben Sie allerdings noch keinen Strich ausgezogen, sondern erst einen sogenannten Pfad gebildet.

Rechnen mit PostScript

   70 90 add 2 div
ergibt

(70 + 90) over 2 = 80.

Für die Berechnung dieses Mittelwertes könnte man auch eine Formel definieren:

   /mittelwert { add 2 div } def
Der Aufruf der Formel erfolgt nun mit:
   70 90 mittelwert
Als Resultat wird wieder 80 in den Stack gestellt.

Auch Variablen lassen sich definieren:

   /x 100 def
Nun erhöhen wir den Wert der Variable x um 1:
   /x x 1 add def
Im folgenden Beispiel verwenden wir die Variable zahl als Zähler. Immer wenn der Zähler 5 erreicht hat, führen wir eine bestimmte Aktion durch (show) und wir setzen den Zähler wieder auf Null zurück.
/zahl 0 def         % Zaehler
/@m { moveto
   /zahl zahl 1 add def
   zahl 5 ge        % groesser/gleich 5 ?
   {gsave
        (XXX) show
        /zahl 0 def
    grestore} if
   } def

Stack manipulieren

Die meisten PostScript-Programme verwenden Operatoren, mit denen sich der Stack manipulieren lässt. Der dup Operator dupliziert ein Objekt, der exch Operator vertauscht zwei Objekte, der pop Operator nimmt ein Objekt aus dem Stack und vernichtet es. Weitere Stack-Operatoren: copy, index, roll, clear, count, mark.

Formel für die Berechnung des Tangens:

/tan { dup sin exch cos div } def
Rufen wir diese Formel auf:
30 tan   % Aufruf
Zuerst wird der Operand dupliziert: 30 30. Der Operator sin nimmt nun die oberste 30 und gibt als Resultat 0.5 zurück. Stack-Zustand: 30 0.5. exch vertauscht die beiden Objekte: 0.5 30. Jetzt kommt der Operator cos zum Zug: 0.5 0.866. Und zuletzt dividiert der Operator div 0.5 durch 0.866:

0.5 over 0.866 = 0.577

Als Ergebnis enthält der Stack den Wert 0.577.

Noch ein Beispiel für die Stack-Manipulation

/zentrieren
   { dup
     stringwidth pop 2 div   % Laenge halbieren
     4 -1 roll
     exch sub                % und subtrahieren
     3 -1 roll
     moveto
   }
def
% Aufruf:
128 72 (Dampfschiffseilanbinder) zentrieren
Mit diesem Aufruf möchten wir den String, d.h. die Zeichenkette, an der Koordinatenposition (128,72) zentrieren. Zustand des Stacks nach Ausführung des dup Operators:
          128 
           72 
(Dampfschiffseilanbinder)
(Dampfschiffseilanbinder)
Wir nehmen an, der String (Dampfschiffseilanbinder) sei 100 typografische Punkte lang. Zustand des Stacks nach stringwidth pop 2 div:
          128 
           72 
(Dampfschiffseilanbinder) 
           50
Zustand des Stacks nach 4 -1 roll:
           72 
(Dampfschiffseilanbinder) 
           50 
          128
Zustand des Stacks nach exch sub:
           72 
(Dampfschiffseilanbinder) 
           78
Zustand des Stacks nach 3 -1 roll:
(Dampfschiffseilanbinder) 
           78 
           72
Die zwei numerischen Objekte werden nun vom moveto Operator konsumiert. Zustand des Stacks nach der Ausführung der Prozedur zentrieren:
(Dampfschiffseilanbinder)

Andere Stacks

Neben dem Operanden-Stack gibt es noch weitere Stacks, und zwar den Dictionary-Stack und den Grafikstatus-Stack. Das Dictionary ist ein komplexes Konstrukt, das in anderen Programmiersprachen nicht bekannt ist. Der grafische Status dient dazu, ein grafisches Objekt mit bestimmten Attributen wie Farben, Fonts etc. wiederzugeben. Siehe Die PostScript-Sprache (pdf).

Literatur

Vollenweider, Peter: PostScript, 2. Auflage, Carl Hanser Verlag, München und Wien, 1991. Buchdeckel (jpeg).
Uni ZH | Informatikdienste | PostScript
HTML 3.2 Last update: 20-MAR-00/vo