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

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

Let's PostScript(8) 配列とその動作の推測

もう少し早く、学んでおくべきだったようにも思えますが、座標系の話をする前に、配列Objectと辞書Objectについてまとめておこうと思います。 どうもそろそろ、このあたりも抑えないと先に進めないようです。

配列Object

複数のObjectを1つにまとめるObjectです。 [...]で使用します。実際に定義すると、このようになります。

GS>[1 (abc) /cde 1.25]
GS<1>1 get =
abc
GS>

これらの配列は、配列用のオペレータを使用することで、取得や更新が可能です。配列を理解するためには仮想メモリについての知識が必要となりますので、 いかに簡単に説明します。

仮想メモリのざっくりとした説明

仮想メモリはざっくりと以下の特徴を持っています。(との私の認識です)

  1. 複数の要素を含むObjectの実体を格納する領域である
  2. 自動生成、自動開放する
  3. 自動開放のタイミングは、該当Objectを参照する参照元がなくなった時

配列作成時の内部処理の推測

GS>[1 (abc) /cde 1.25]

が実行されたとき何が起こっているかは、以下のような感じだと推測しています。

  1. 作成した配列用のユニークIDのようなもの(PostScript内部でユーザーからは見えない、以降ユニークIDと記載する)を取得する。
  2. ユニークIDに紐づけた仮想メモリ領域を取得する。参照カウンタをインクリメントする、そこに実体1,(abc),/cde,1.25を格納する
  3. ユニークIDをOperandStackに格納する

getオペレータ実行時の内部処理の推測

GS<1>1 get =
abc
GS>

が実行されたときは、以下のようなことが起こっていると推測しています。

  1. getオペレータはOperandStadkからユニークIDとindexを取得する。
  2. ユニークIDに紐づく仮想メモリ領域とindexから、配列の値を取得しOperandStackへ格納する
  3. getオペレータが完了したことで、OperandStackからユニークIDがPOPされる。それにより、仮想メモリ領域の参照カウンタがデクリメントされる。
  4. 参照カウンタが0となったため、仮想メモリ領域は不要になったと判断し、領域を解放する。

あくまで推測なのですが、大きくは間違っていない気がします。 正解を知ろうと思ったら、GhostScriptのソースコードを見ないといけませんが、さすがにそこまでの気力はありません・・・

次は、辞書について、押さえていきたいと思います。