Let's PostScript(2) ObjectとOperand Stack
前回以下の実行結果で出てくるGS<...>のカッコ内の数字は何者かというところで話を切りましたが、これはいまOperand Stackに積まれているStackの段数を示しています。
GS>/Helvetica GS<1>findfont GS<1>20 GS<2>scalefont GS<1>setfont GS>0 0 GS<2>moveto GS>(Hello World!!) GS<1>show GS>0 0 GS<2>moveto GS><48656C6C6F20576F726C642121> GS<1>show GS>showpage >>showpage, press <return> to continue<<
Operand Stackに積まれるのはObjectです。PostScriptで扱われるすべてObjectとなっています。 それぞれのObjectには属性が存在していますが、そのうちの一つが属性が実行可能とLiteralの属性です。
PostscriptのインタープリタがObjcetを実行する場合、そのObjectの属性が実行可能か、Literalかによりその動作が変わります。
属性 | 動作 |
---|---|
実行可能 | インタープリタによって直ちに実行される |
Literal | Operand StackにPushされる |
OperandStackは実行可能Objectが受け取るLiteralObjectやその結果を格納するために使用されます。 ここで先ほどの実行内容とスタックを整理してみます
GhostScript | コメント |
---|---|
GS>/Helvetica | /で始まるのはLiteralの名前ObjectなのでStackへPush(0->1) |
GS<1>findfont | findfontはオペレータで実行可能。OperandStackからフォント名を受け取り(1->0)、フォント定義を格納したフォント辞書をOperandStackに返す(0->1) |
GS<1>20 | 整数(20)は常にLiteral ObjectなのでStackへPush(1->2) |
GS<2>scalefont | scalefontはオペレータで実行可能、グリフサイズのスケーリングの倍率を受け取り(2->1)、倍率に拡縮したフォント辞書を作成する |
GS<1>setfont | setfontはオペレータで実行可能、フォント辞書を受け取り(1->0)グラフィックスのフォントパラメータへ反映する |
GS>0 0 | 整数のObject2つをStackへ格納する(0->2) |
GS<2>moveto | movetoはオペレータで実行可能、x yをOperandStackから受け取り(2->0)、カレントポイントを設定する |
GS>(Hello World!!) | Literal文字列をOperandStackへPush(0->1) |
GS<1>show | showはオペレータで実行可能、文字列を受け取り(1->0)グラフィックスのフォントパラメータで描画する |
GS>100 100 | |
GS<2>moveto | |
GS><48656C6C6F20576F726C642121> | 16進文字列をOperandStackへPush(0->1) |
GS<1>show | |
GS>showpage | カレントページを出力デバイスへ描画する |
このような感じで、PostscriptはOperandStackを介してObjectをやり取りし、スクリプトを消費していきます。 そのため、PostScriptには豊富なStack操作を目的としたオペレータが用意されています。
次回はOperandStackの操作を方法を見ていきたいと思います。