掴んだ物(技術)はちゃんと食べる記録帳

興味を持ったものに対する足跡を残していくために作成しました。勉強しながら書いているので、間違いや短絡もあると思います。ご指摘いただけると喜びます。

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の操作を方法を見ていきたいと思います。