PostScript是壹個Turing-complete編程語言,通常PostScript程序不是人為生成的,而是由其它程序生成的。然而,仍然可以使用手工編制的PostScript程序生成圖形或者進行計算。
PostScript是壹個基於堆棧的解釋語言(例如stack language),它類似於Forth語言但是使用從Lisp語言派生出的數據結構。這種語言的語法使用逆波蘭表示法,這就意味著不需要括號進行分割,但是因為需要記住堆棧結構,所以需要進行訓練才能閱讀這種程序。大部分運算符(其它程序中稱為函數)從堆棧中讀取變量,並且將運算結構放到堆棧中。如數字這樣的符號:en:Literal具有將它們自身副本放到堆棧的效果。 例如:
3 4 add 5 1 sub mul將執行 (3 + 4) × (5 - 1) 這樣的計算。
讓我們詳細地分析壹下這是如何完成的:
3 和 4 都是符號,它們將自己放到堆棧中,在這兩個命令之後,堆棧將變成這樣:
43add是壹個運算符,它將堆棧中最上面的兩個元素取出(在我們的例子中是3和4)、將它們相加、然後將結果放到堆棧上:
7下面又是兩個符號,它們將把堆棧變成這樣(需要註意的是操作僅僅局限在堆棧頂部,下面的元素不受影響):
157另外壹個運算符sub,從堆棧頂取出兩個元素、第二個減去第壹個、然後將結果放到堆棧:
47很顯然mul同其它兩個運算符壹樣,從堆棧取出兩個元素、將它們的乘積放到堆棧:
28 上面的例子只是壹個古老的逆波蘭表示法計算,當然PostScript也使用變量。詳細地說就是它有壹個字典用來查找所有不是符號的東西;如果查到的話,那個名字下保存的值就會壓縮到棧中(或者更應該說是執行——參見後面的內容);找不到就返回錯誤。將壹個變量放到字典中需要使用def運算符,它用壹個名字和壹個值作為參數,通過在前面使用斜線構建壹個名字。因此
/x1 15 def首先將名字“x1”放到堆棧上、然後是值15、然後執行def,它將從堆棧中取出“x1”和15,並且將15寫到字典中“x1”的下面。後面出現的“x1”(註意不要與“/x1”混淆)將會將15放到堆棧而變量並不改變。下面的代碼會將x1的值增加2:
/x1 x1 2 add def {和}提供了壹些編程的工具。{將解釋器切換到延遲運行模式,所有的東西甚至是運算符和其它的可執行對象都放到堆棧中,其中壹個例外就是},它將堆棧中從{開始的所有內容,綁定成壹個(匿名)處理過程,然後將它放到堆棧上。
這種結構有幾種不同的用途,如子程序定義(匿名程序賦給壹個變量)、循環、條件等等:
x1 0 eq { 0 } { 1 x1 div } ifelse這段代碼首先使用eq測試 x1 是否是 0;根據結果的不同將真或者假放到堆棧上。在此之後,將兩個過程放到堆棧上,然後執行ifelse,它從堆棧中取出三個參數,如果第三個參數是真就執行第二個否則就執行第壹個。總之,如果 x1 是 0 結果就是 0, 其它情況結果就是 1/x1。
/inc3 { 3 add } defHeredefis used to place something in thedictionary, only this time it is a procedure instead of a simple integer. This works because the values coming from the dictionary areexecuted, not just pushed (as simplistically stated above). Since executing a literal amounts to pushing it, that did not make a difference before. Now executing inc3 will first look it up in the dictionary, find the procedure object representing { 3 add } and execute that. One value must reside on the stack for this to work, sinceaddneeds two arguments, only one of which is given in the procedure itself. Naturally, one passes arguments to procedures by placing them on the stack, so we can simply view inc3 as a procedure that takes one argument. Example call: 這裏def將內容放到字典中,僅僅在這個時候它是壹個過程而不是簡單整數。
71 inc3將71放到堆棧上,inc3將它的值加3,這樣就得到結果74。 To produce graphics, PostScript uses an ordinarycartesian coordinate system. 在生成圖形的時候,PostScript使用普通的笛卡爾坐標系。
100 200 moveto 300 400 lineto stroke將“光標”移到坐標點(100, 200)然後畫線到(300, 400)。
50 70 moveto 100 200 50 80 100 100 curveto stroke生成壹個從(50, 70)到(100, 100)的立方貝塞爾曲線,控制點是(100, 200)和(50, 80)。
250 250 moveto (Wikipedia) show在位置(250, 250)使用預先選擇的字體畫出文本“Wikipedia”,字體選擇可以使用例如 /Courier findfont 12 scalefont setfont 這樣的命令串。
圖形最初在“用戶坐標系”中創建,在復制到確定最後輸出的“設備坐標系”之前它們可以進行旋轉、縮放或者扭曲等變換。
200 300 translate 45 rotate將用戶坐標系中的內容上移 200 點、右移 300 點並且復制到設備坐標系時旋轉 45 度。
字符“%”用來在PostScript程序中表示註釋。作為壹個通用的約定,每個PostScript都以字符“%!”開始這樣所有的設備都會將它解釋為PostScript。