1.1        PostScript

linguaggio per descrivere pagine

PostScript è l’evoluzione di un linguaggio, il Design System simile al Forth, sviluppato nel 1976 da John Gaffney per elaborare dati grafici. Nel 1978 Johon Warnock, allo Xerox PARC riscrisse Design System chiamandolo JaM (John and Martin (Newell)); una sua evoluzione divenne nota come Interpress. Alla fine del 1982 Warnock e Chuck Geschke fondano l’Adobe Systems, che inizia a vendere Interpress nel 1985 col nome di PostScript. Il linguaggio fu poi adottato da Steve Jobs per le stampanti Apple Laserwriter.

PostScript ha una sintassi semplice basata sull’utilizzo di stack, fra i quali l’Operator stack, il Dictionary stack ed il Graphic stack. Altra componente essenziale è il dizionario per ospitare variabili e procedure. L’Operator stack può contenere indifferentemente numeri, stringhe di caratteri (delimitate da una coppia di parentesi tonde), array e definizioni. Le istruzioni prelevano dallo stack i dati che utilizzano, e vi depositano l’eventuale risultato.

PostScript è relativamente povero, rispetto a Forth, di istruzioni per manipolare l’Operator stack, fra queste: pop per eliminare il primo dato, dup e n copy rispettivamente per duplicare il primo o i primi n dati sullo stack, exch per scambiare il posto dei primi due dati ed index n che copia l’n-esimo elemento in cima allo stack.

=

visualizza il top e lo elimina

==

visualizza il top e lo elimina (*)

stack

visualizza lo stack

pstack

visualizza lo stack  (*)

(*)

visualizza anche il contenuto degli array

Alcune istruzioni sono essenzialmente utilizzate per la messa a punto dei programmi come clear che svuota lo stack o le istruzioni, riportate qui di fianco, che permettono di esaminarne il contenuto. Inoltre con print si possono visualizzare le stringhe.

PostScript tratta dati numerici, stringhe, e font; numeri e stringhe possono aggregarsi in matrici, per trattare le quali sono disponibili le istruzioni length, get e put.

Variabili e procedure si definiscono (quasi) allo stesso modo: /nome ... def, ad esempio:

/fatt {dup 1 le {1} {dup 1 sub fatt} ifelse mul} def  % x -- x!

/a a 1 add def           % incrementa la variabile a

/root exch def           % assegna alla variabile root il top stack

Si noti la possibilità di ricorsione, usata per calcolare il fattoriale di un numero intero. L’istruzione def inserisce la variabile o la procedura nel dizionario corrente cioè in cima al Dictionary stack, che può essere quello di default o uno definito nel programma e reso accessibile tramite l’istruzione begin (l’istruzione end lo rimuove dallo stack); tuttavia l’utilizzo dei vari dizionari, pur non essendo complicato, diventa macchinoso qualora uno stesso nome di variabile sia presente in dizionari diversi.

Come si può notare i blocchi di istruzioni sono individuati da {...},  anche essi vanno sull’Operator stack a disposizione di istruzioni che li utilizzano, quali def, le istruzioni di ciclo e le istruzioni condizionali. if ed ifelse:

condizione {...} if                  % se condizione è verificata esegue {...}

condizione {...} {...} ifelse

condizione è un valore booleano derivante da operazioni di confronto o logiche, rispettivamente fra valori numerici o booleani.

Per i cicli sono disponibili for, che lascia, ad ogni ciclo, il valore attuale sullo stack, repeat (n {...} repeat), loop interrompibile solo tramite il comando exit e forall che esegue il blocco di istruzioni per ogni valore di un vettore.

PostScript è dotato delle usuali funzioni numeriche, compresa la generazione di numeri casuali; per le operazioni aritmetiche sono previsti nomi di funzione, add, sub, mul e div, piuttosto che gli usuali simboli,

tuttavia, l’ampia libertà di scelta nei nomi di variabile, permette di definire l’elevazione a potenza come **:

    /** {exp} def

e di usarla ( in grassetto il prompt di AFPL Ghostscript 7.03):

GS>100 .5 ** 16 .5 exp add =

14.0

Ma la parte più ricca del linguaggio è naturalmente quella relativa alla gestione della pagina che geometricamente è il primo quadrante cartesiano con l’origine in basso a sinistra. La visualizzazione dei contenuti della pagina si basa su una matrice numerica di 6 elementi (currentmatrix) che rappresenta il sistema di riferimento cartesiano, modificabile essenzialmente tramite le istruzioni:

x y traslate       % l’origine si sposta in (x, y)

a b scale          % modifica la scala, ed eventualmente l’ortogonalità

g rotate           % ruota gli assi di g gradi

Il listato  che segue offre un esempio di manipolazione delle coordinate e degli effetti sulla pagina.

% AFPL Ghostscript 7.03 (2001-10-20)
/cerchio {     % x1 y1 raggio --
  0 360 arc fill
  stroke
} def
/lista {3 1 roll moveto show} def
/assi { 0 setgray
-100 0 moveto 100 0 lineto 
0 -100 moveto 0 100 lineto stroke
} def
/Times-Roman findfont
16 scalefont
setfont
0 100 moveto 720 100 lineto 720 650 lineto 0 650 lineto 0 100 lineto
0.9 setgray fill stroke
300 500 translate              % spostamento degli assi
1 0 0 setrgbcolor              % rosso
0 0 50 cerchio
assi
-100 -100 translate            % spostamento degli assi
30 rotate                      % rotazione degli assi
1 0.5 scale                    % schiacciamento
0 1 0 setrgbcolor
0 0 30 cerchio
assi
0 0 1 setrgbcolor
1 2 scale                      % riporto a scala originale
-45 55 (Ellisse con) lista
-30 rotate                     % orientamento originale
-2 63 (Cerchio) lista
showpage

Nell’esempio sono utilizzate funzioni grafiche primitive quali moveto, lineto e arc per tracciare linee, setrgbcolor, setgray, fill per impostare colori, findfont, scalefont e setfont per lavorare con testi. Le istruzioni show e stroke rendono visibili rispettivamente testi ed oggetti grafici. Sono disponibili inoltre moltissime funzioni grafiche specializzate.

Non manca la possibilità, seppure poco sofisticata, di gestire file.

Nonostante la struttura sintattica di PostScript sia simile a quella del Forth, PostScript ha un livello di indipendenza dalla macchina più elevato, non fosse altro che per il trattamento dei numeri, e per la più semplice gestione delle strutture di controllo.

La versione corrente di PostScript è il Level 3.

 

Il listato sottostante produce un bosco di felci.

%!PS-Adobe-1.0

%%Title:Random Fern

%%Creator:Eric Wicklund

%Modificato da Bellecombe

/m1 [ 0.00 0.00  0.00  0.16  0.00 0.00 ] def

/m2 [ 0.85 -0.04   0.04  0.85  0.00 1.60 ] def 

% invertendo -0.04 e 0.04 volge a sinistra

/m3 [ 0.20 0.23 -0.26  0.22  0.00 1.60 ] def

/m4 [-0.15 0.26  0.28  0.24  0.00 0.44 ] def

/point 72 def

/length 0.001 def

/casual {           % lim_inf lim_sup -- val_casuale_intermedio

  2 copy sub neg    % intervallo

  exch pop          % lim_inf differenza --

  rand 1000 mod

  mul 1000 div

  add

} def               % fine casual

/felce {                    % variabile di ciclo --

  -0.3 0.3 casual           % distanzio le radici

  add 0.25 add point mul

  0 2 casual                % sposto radice verticalmente

  1.5 add point mul translate

  -0.1 0.1 casual 0.4 add point mul % cambio dimensioni

  -0.1 0.1 casual 0.4 add point mul % cambio dimensioni

  scale 0 0

  150000 {

    % trasforma la matrice casualmente

    /r rand 100 mod def

      r  1 lt { /m m1 def}      % prima parte stelo

    { r 86 lt { /m m2 def}      % parte terminale

    { r 93 lt { /m m3 def}      % prima foglia a sinistro

              { /m m4 def}      % prima foglia a destra

           ifelse } ifelse } ifelse          

    red green 0 setrgbcolor

    m transform 2 copy moveto

    length length rlineto

    stroke

    } repeat pop pop            % elimino coord. residue   

  } def % fine felce

/zzz save def

% sfondo

0 100 moveto 720 100 lineto 720 650 lineto 0 650 lineto 0 100 lineto

0.7 0.9 1 setrgbcolor fill stroke

1.3 1.1 7 {

  gsave

  newpath    

  1 setlinecap

  0.005 setlinewidth

  /red 0 0.5 casual def

  /green 0.5 1 casual def

  felce

  grestore

  } for

showpage

zzz restore

 


 

 

 

 

 

 

 

 

1.1.1             Varianti

Ghostscript è un interprete di PostScript della Aladdin Enterprises. Ghostscript genera una immagine bitmap da un file PostScript, per stampanti non-PostScript.

PDF (Portable Document Format) è un formato, largamente basato sulla tecnologia PostScript, per rappresentare testi in formato indipendente dall’hardware e dal software che li ha generati. L’indipendenza è ottenuta inglobando nel documento i font originali. L’interprete PDF contiene un sottoinsieme dell’interprete PostScript, dal quale, in particolare, mancano le strutture di controllo di flusso.

I file PDF possono includere dei tag XML.

EPS (Encapsulated PostScript) è un normale sorgente PostScript a cui sono stati aggiunti dei commenti conformi DSC (Document Structuring Conventions). Il sorgente deve iniziare con il commento: %!PS-Adobe 3.0. I commenti caratterizzati da %% forniscono informazioni per elaborazioni successive, fra questi %%BoundingBox: llx lly urx ury che indica il rettangolo contenente l’immagine e %%Pages.

Display PostScript è una implementazione di PostScript per un utilizzo in ambiente grafico interattivo.