środa, 1 października 2008

Post Scriptum i PostScript

Mój dobry znajomy opublikował niedawno nowe narzędzie do generowania PostScriptu. Jest to proceduralny język programowania o składni zbliżonej do C, tłumaczony bezpośrednio na PostScript - nazywa się Post Scriptum. Angielskie słowo "postscript" znaczy to samo, co łacińskie (czy też międzynarodowe) - "post scriptum". Aby zrozumieć możliwe zastosowania Post Scriptum, należy po pierwsze wiedzieć jak działa i czym jest PostScript. Potocznie traktowany jako format plików graficznych, w rzeczywistości PostScript jest językiem programowania wysokiego poziomu, stworzonym jako język opisu strony (page description language), ale będącym pełnym językiem programowania. PostScript jest idealny do generowania maszynowego, niezbyt jednak nadaje się do użycia ręcznego. Problemem jest przede wszystkim składnia języka, oparta na odwrotnej notacji polskiej (Reverse Polish notation) pozbawiona nawiasów. Predestynuje ona PostScript do generowania automatycznego, ale praktycznie uniemożliwia żywemu programiście szybkie czytanie złożonego kodu. Oto przykład: Wyrażenie w Post Scriptum, zrozumiałe dla każdego programisty:
if (x[1] > 2*y) 
    x[1]=y-1; 
else 
    x[1] += 1;
zapisane w PostScripcie wygląda na przykład tak:
x 1 get 2 y mul gt{
   x 1 y 1 sub put
}
{
   x 1 x 1 get 1 add put
} ifelse
Na tym poziomie da się to jeszcze czytać przy odrobinie wprawy, ale już widzimy różnicę - musimy się trochę skupić. W bardziej złożonych programach wyszukanie błędu jest mozolne i naprawdę można tego uniknąć używając Post Scriptum. Taka beznawiasowa składnia nazywana jest postfiksową - tak nazywa się zapis, w którym argumenty stoją przed operatorami - stąd chyba zresztą wzięła się nazwa PostScriptu. Autor Post Scriptum celnie zauważył, że składnia ta jest jedynym elementem języka, który powstrzymuje programistów od masowego bezpośredniego używania PostScriptu. Pozostałe elementy języka, takie jak zarządzanie pamięcią, system typów, czy wreszczie rozbudowany system graficzny, stanowiący clue PostScriptu, są wygodne, przemyślane i dopracowane - można powiedzieć, że aż chciałoby się ich używać, gdyby nie ten język ... Wniosek był jeden: trzeba stworzyć język, który będzie miał klasyczną składnię, a tłumaczony będzie na PostScript. Tak powstało Post Scriptum. Podobnie powstał język C - w wyniku znużenia zawiłościami kodu assemblerowego. Ale można w C zakodować prawie wszystko to, co w asemblerze. Podobnie w naszym nowym języku - program w Post Scriptum może być funkcjonalnie równoważny dowolnemu programowi w PostScripcie. Nowy język posiada klasyczne konstrukcje sterujące: pętle, instrukcje "if", funkcje. Obsługuje typy danych PostScriptu: słowniki (odpowiedniki paskalowych rekordów, struktur C, czy PHP-owych hashów), stringi i oczywiście liczby stało- i zmiennoprzecinkowe. Operatory PostScriptu udokumentowane bardzo dokładnie w "PostScript Language Reference Manual" firmy Adobe) są wywoływane bezpośrednio jak każda inna funkcja, dzięki czemu Post Scriptum daje dostęp do całej graficznej maszynerii PostScriptu. Możliwe jest też włączanie kodu napisanego w PostScripcie bezpośrednio do programu w Post Scriptum. Na etapie kompilacji można dołączać fragmenty kodu (klasyczna dyrektywa "include") jak i gotowe fragmenty PostScriptu (dyrektywa "import"). Autor poprzedził pracę nad tym językiem poszukiwaniami gotowego rozwiązania tego typu i - o dziwo - nie znalazł. W dalszych planach, o ile mi wiadomo, jest wsparcie dla kontroli typów (obecnie język jest polimorficzny, jak PostScript), kontrola prototypów funkcji i inne feature'y wspierające szybkie tworzenie i debugowanie kodu. Życzę autorowi dalszego zapału i zachęcam wszystkich do odwiedzenia strony "Post Scriptum".