Originariamente pubblicato in data 01/07/2000
A
C
C
O
M
A
Z
Z
I
PS, saluti da LaserWriter
PS, saluti da LaserWriter
PostScript: il linguaggio usato da tutte le migliori stampanti laser. Come funziona? Ecco una introduzione al linguaggio di Adobe
I nostri lettori più fedeli conoscono ormai tutti i segreti delle stampanti laser e ad aghi. Ma forse non sono al corrente di come sia possibile programmare direttamente LaserWriter, utilizzando il linguaggio incorporato dentro la stampante laser: il PostScript.
Una stampante laser LaserWriter, è, (come abbiamo già ricordato su queste pagine), un calcolatore a tutti gli effetti, pur senza possedere schermo e tastiera. È pilotata da un microprocessore ed è programmabile in un linguaggio molto particolare, il PostScript creato da Adobe.Per inciso, va detto che il nome della Adobe si pronuncia "adobi"; la e finale, solitamente muta in inglese, va pronunciata come una i, per imitare l'accento (se ben ricordo, californiano) dei fondatori della ditta.
Il PostScript è un linguaggio di descrizione della pagina. Come i linguaggi di programmazione più diffusi e conosciuti, (Basic, Pascal, C), è dotato di istruzioni matematiche; strutture di controllo e di ripetizione; comandi per l'uso di file; variabili e procedure. Addirittura, è particolarmente ben fornito in molti tra questi aspetti: ad esempio, fornisce una serie di potenti istruzioni per trattare matematicamente le matrici, permettendo di moltiplicarle, dividerle, invertirle e così via utilizzando una sola istruzione.
Tutto questo è comunque finalizzato al trattamento delle immagini, e del testo in particolare. Il programmatore PostScript ha a disposizione una vera messe di istruzioni per creare, traslare, comprimere o espandere, roteare, e infine stampare le immagini create. I caratteri testuali sono manipolabili come le immagini, se il programmatore lo desidera, e sono disponibili in più formati, e in qualunque dimensione: PostScript infatti li memorizza sotto forma di dizionari di forme, e sa ricavare da un dizionario la descrizione del font in qualunque dimensione, dai due ai sessantamila punti tipografici. I grafici, a loro volta, sono descrivibili nel formato bit-mapped che tutti i programmatori di personal computer conoscono, e cioè punto per punto, oppure in formato vettoriale, ovvero descrivendo per ciascun tratto della pagina le sue caratteristiche matematiche: un segmento, un cerchio, un arco...
Naturalmente, non è necessario conoscere il PostScript per utilizzare la LaserWriter, così come non è necessario saper programmare con QuickDraw e il resto del Toolbox per poter sfruttare un Macintosh. Un po' di curiosità, tuttavia, porta ben presto a voler conoscere questi aspetti riposti delle macchine Apple, e in questa puntata di Mela contro Mela muoveremo qualche passo nel mondo del PostScript.
Quando stampiamo un documento con la LaserWriter, l'applicazione esegue una serie di chiamate al Print manager, quel componente del Mac OS che si occupa di stampanti, e passa a disegnare l'immagine di ciò che dovrà apparire sul foglio utilizzando le chiamate del QuickDraw, per i grafici, e del Font manager, per i testi. Il driver della LaserWriter, allora (si tratta di quel programmino chiamato LaserWriter che si trova nella cartelletta di sistema del disco dal quale abbiamo avviato il calcolatore) provvede a tradurre i comandi del Toolbox in comandi PostScript, uno per uno, e passa questi comandi alla stampante. La stampante, infine, esegue i comandi e produce il documento finito come noi lo vediamo.
Il processo funziona perfettamente, ma naturalmente non produce risultati paragonabili a quelli che potremmo ottenere programmando la LaserWriter direttamente, e neppure a quelli che si hanno utilizzando una applicazione che produce direttamente codice PostScript, tralasciando i buoni uffici del Print manager (ad esempio, FreeHand e Illustrator).
I fortunati possessori di una stampante laser PostScript (è il caso di dirlo, dato che il suo costo la mette al di fuori della portata di molte tasche) possono facilmente programmare la LaserWriter. Il metodo più semplice per farlo prevede di collegare un qualsiasi calcolatore alla LaserWriter usando un normale cavetto RS232 oppure RS422, un cavetto dunque in tutto e per tutto simile a quello che si usa per collegare il calcolatore alla ImageWriter (non vanno bene, pertanto, i cavi della rete AppleTalk, quelli che vengono solitamente utilizzati con LaserWriter per poter condividere la stampante tra più computer). Caricando nel calcolatore un programma di comunicazione come ZTerm, lo si regoli perché trasmetta i dati con 9600 baud, protocollo Xon/Xoff, 7 bit di dati e nessuna parità. Siamo pronti per parlare a LaserWriter: a questo punto basta accendere la stampante (se è già accesa è più prudente spegnerla e riaccenderla, per evitare che possa partire in uno stato anormale) e inviarle, battendolo dalla tastiera, il comando PostScript executive. Essa risponderà con un messaggio di benvenuto (che cambia a seconda del modello posseduto).
Una soluzione alternativa, adottabile se non si desidera scollegare la rete AppleTalk, consiste nell'utilizzare SendPS, un programmino per Macintosh in circolazione gratuita, prodotto proprio dalla Adobe per consentire la programmazione in PostScript attraverso la rete. È una soluzione di ripiego, perché richiede che i programmi PostScript vengano scritti a parte con un word processor e poi spediti, mentre la connessione diretta permette di inviare i comandi PostScript uno alla volta, come si può fare con un interprete Basic. Il PostScript infatti, come il Basic, è un linguaggio interpretato: riceve cioè una istruzione per volta, e la esegue; altri linguaggi, come Pascal, richiedono di ricevere tutto il programma prima di eseguirlo, perché lo traducono nella forma eseguibile in una volta sola.
Vediamo di far scrivere qualche cosa alla nostra stampante, tanto per provarla. Un tipico problema di programmazione per principianti è quello suggerito da Kernighan e Ritchie, i creatori del linguaggio C: si tratta di creare un programma che scriva "Salve, mondo!" Naturalmente si tratta di un problema spesso banale, che in molti casi è risolvibile con una sola istruzione del linguaggio, ma è utile per prendere confidenza.
In PostScript il programma Salve è meno banale che in altri linguaggi, poiché per scriverlo dovremo introdurre alcune istruzioni per effettuare la scelta di un font tra quelli disponibili, e della dimensione da utilizzare, nonché per la localizzazione del testo in un determinato punto del foglio.
Iniziamo il nostro programma con l'istruzione che sceglie un font.
/Helvetica findfont
Già con questo primo comando notiamo una curiosa caratteristica del PostScript: tutti i comandi vengono preceduti, e non seguiti, dai parametri. In QuickDraw, ad esempio, e in quasi tutti i linguaggi di programmazione, la scelta di un carattere si effettuerebbe con le istruzioni:
{ Trova il numero corrispondente a Helvetica }
GetFNum ("Helvetica", numeroDelFont);
Nel'istruzione QuickDraw i parametri, e cioè il nome Helvetica e il numero corrispondente, seguono il nome dell'operazione, cioè GetFNum. Per quanti hanno utilizzato una delle diffuse calcolatrici programmabili della Hewlett Packard, possiamo dire in prima approssimazione che il PostScript è un linguaggio che utilizza la notazione polacca inversa: prima i dati e poi le istruzioni.
Veniamo alla scelta delle dimensioni del carattere, e alla sua adozione come carattere in uso:
15 scalefont
setfont
Queste operazioni richiedono, per venire completate, un certo tempo alla stampante laser, poiché essa deve ricavare il carattere Helvetica corpo 15 partendo dalla definizione generale, in forma matematica, che possiede nella memoria permamente. Quando la LaserWriter è pronta, possiamo scegliere un punto del foglio dove la scritta apparirà, e scriverla.
PostScript utilizza come unità di misura il punto tipografico, (ne abbiamo parlato pochi mesi fa introducendo il Font manager), e usa per i riferimenti spaziali un piano cartesiano, con origine nell'angolo in basso a sinistra del foglio. Questo significa che l'angolo in basso a sinistra è caraterizzato dalla coppia di punti zero, zero. La prima cifra cresce quando ci spostiamo verso la destra, e la seconda cresce spostandosi verso l'alto. Un punto tipografico vale un settantaduesimo di pollice, e cioé circa 0,35 millimetri; in altri termini, in un centimetro stanno 28,35 punti.
Se vogliamo che la nostra scritta abbia inizio due centimetri a destra del bordo, e a dieci centimetri dal margine inferiore, sapendo che 2 * 28,35 = circa 57 e 10 * 28,35 = circa 284, scriveremo:
57 284 moveto
(Salve, mondo!) show
Ora dobbiamo solo chiedere alla stampante laser di espellere il foglio, perché ci sia possibile ammirare il risultato:
showpage
Tutta questa fatica, chiederà qualcuno, solo per effettuare un lavoro che avrebbe richiesto pochi secondi usando un qualunque programma per l'elaborazione di testi? Naturalmente non possiamo aspettarci molto dal nostro primo programma, ma siamo subito in grado di fare qualcosa che ben pochi word processor sanno fare: scrivere con una tonalità di grigio. Se subito prima dell'istruzione moveto inseriamo una istruzione setgray, istruzione che ci permette di specificare il livello di grigio da usare nel tracciamento delle immagini utilizzando un numero compreso tra zero (bianco) e uno (nero), abbiamo ottenuto lo scopo:
0.5 setgray % Grigio
A proposito, il carattere di percento serve a introdurre i commenti in un programma PostScript. Tutto ciò che segue il segno di percentuale su una riga viene ignorato dall'interprete PostScript.
Non ci vuole molto di più perché diventi possibile effettuare delicati giochi con le immagini. Nel programma del listato 1, ad esempio, introduciamo un ciclo che stampa per cento volte la parola Bit, ciascuna volta un po' più scuro e un po' più in alto e a sinistra della volta precedente. Il risultato è quello della figura.
% Dichiarazione variabili
/cm {28.35 mul} def % Un centimetro espresso in punti
/Tinta 1 def % Inizialmente bianco
% Dichiarazione procedura
/ScriviBit
{0 0 moveto
(Bit) show} def
% Programma principale
% MisterAkko, 5 marzo 1989
5 cm 15 cm translate % Sposta l'origine in centro
/Times-Roman findfont
144 scalefont
setfont
100 { % For i := 1 to 100 do begin
Tinta setgray % Scegli il colore
/Tinta Tinta .01 sub def % Tinta := Tinta - 0.01
ScriviBit % Scrivi "Bit"
-1 1 translate % Sposta l'origine in alto a sx
} repeat % end;
1 setgray % Scrivi in outline Bit
0 0 moveto
(Bit) true charpath stroke
showpage % end.
Segnaliamo per i lettori interessati una bibliografia essenziale per apprendere i modi e i segreti della programmazione in questo linguaggio.
Adobe Systems ha realizzato tre volumi sulla programmazione in PostScript, che sono stati pubblicati da Addison Wesley. Il primo volume, intitolato PostScript language tutorial and cookbook (prezzo di copertina .95), fornisce una introduzione al linguaggio e una ampia messe di esempi per avviare il programmatore. Il secondo volume, PostScript language reference manual ($ 22.95), è la guida ufficiale al linguaggio: scritta in tono formale, essa elenca tutte le istruzioni PostScript. Infine, abbiamo PostScript language program design ($ 22.95), un volume dedicato ai programmatori avanzati, contenente istruzioni per la creazione di device drivers, programmi completamente trasportabili, uso di immagini digitalizzate e così via.
Il lettore interessato potrà trovare questi volumi in una libreria che sia fornita dei libri di Addison Wesley, e questo è il metodo più semplice e veloce purché egli sia disposto a versare un sovrapprezzo a favore dell'importatore.