3.2 ヒープ メモリの実装
3.2.4 ヒープ メモリにおけるオブジェクト指向演算子の表現
得,更新する関数である.Mはクラス集合Cの要素数であり,iはクラスcに対 応するサブヒープの,ヒープ メモリにおける位置である.N はクラスcに対応す るサブヒープに格納されるタプルの要素数であり,jはそのタプルにおけるuの位 置である.getElempq,setElempqは,p, qに依存して次のように定義される.
getElempq t =
⎧⎪
⎪⎪
⎪⎪
⎪⎪
⎪⎨
⎪⎪
⎪⎪
⎪⎪
⎪⎪
⎩
t (p= 1, q= 1のとき)
F st t (p= 1,1< qのとき)
F st (Snd(1) (...(Snd(p−1) t))) (1< p < qのとき) Snd(1) (...(Snd(q−1) t)) (p=q,1< qのとき)
setElempq x t=
⎧⎪
⎪⎪
⎪⎪
⎨
⎪⎪
⎪⎪
⎪⎩
x (q = 1のとき)
(getElem1q t, ..., getElemp−1q t,
x, getElemp+1q t, ..., getElemqq t) (1< qのとき)
空のストアは,空のサブヒープをタプルにまとめたものとして表現される.
ExRepcは次のように定義される.
ExRepc :c→Heap→bool ExRepc o H ≡V alidc o H
これはV alidcそのものである.つまり,クラスcのオブジェクトがストアに存在
することはその参照がクラスcに対応するサブヒープにおいて有効であること同 値である.
GetRepc,SetRepcはそれぞれ次のように定義される.
GetRepc :c→H →attrc GetRepc o H ≡Readca o H
SetRepc :c→attrc →H →H SetRepc o x H ≡W riteca o x H
クラスcのオブジェクトの属性の取得,更新は,そのオブジェクト参照が指すタプ ルの属性領域の取得,更新と同値である.
CastRepcdは次のように定義される.
CastRepcd:c→Heap→d CastRep⎧ cd o H ≡
⎪⎨
⎪⎩
if ExRepc o H then Readcd o H else N ulld (cd ordc) CastReped (CastRepce o H) H ((ce, e + d) or (d+ e, ec))
CastRepcdはクラスcとdの継承関係の位置について2つの場合に分けて定義され
る.変換元のクラスcと変換先のクラスdが直接の親子関係にある場合は,Readcd により,オブジェクト参照が指すブロックに格納されるクラスdのオブジェクト参 照を読み出せばよい.変換を行うオブジェクトが存在しない場合は変換先のクラ スのNULLオブジェクトN ulldに変換したこととする.cとdが直接の親子関係で はない継承関係にある場合は,型変換を推移的に適用すればよい.つまり,まずc と直接親子関係にあるクラスeに変換してから次にそれをdに変換する.
N ewRepcは次のように定義される.
N ewRepcH ≡
⎧⎪
⎪⎪
⎪⎪
⎪⎪
⎪⎨
⎪⎪
⎪⎪
⎪⎪
⎪⎪
⎩
Addc def aultc H (cがルートのとき)
let (o1, H1) =N ewRepd H in
let (o2, H2) =Addc def aultc H1 in
let H3 =Linkcd o1 o2 H2 in (o2, H3) (dc) where
Linkdc o1 o2 H ≡W ritecd o2 o1 (W ritedc o1 o2 H)
def aultc ≡((V(c, a1), ...,V(c, an)), N ulld, N ulle1, ..., N ullem) (ai ∈ Mattr(c), dc, cej)
N ewRepcはクラスcのオブジェクトを,ルートクラスからクラスcに至るまでの
継承関係に関して再帰的に構築する.生成されたオブジェクトは複数のタプルが連 結した構造となる.まず,初期段階としてルートクラスのインスタンスを生成する 場合,Addcにより,クラスcのサブヒープに新たなタプルを追加する.次に,帰納 段階としてルート以外のクラスのインスタンスを生成する場合,まず,N ewRepd により親クラスdのインスタンスを生成する.次に,Addcにより,クラスcのサ ブヒープに新たなタプルを追加し,最後に,得られた二つのオブジェクト参照o1, o2をLinkdcによりリンクする.Linkcdは,W ritedc,W ritecdによって,o1,o2それぞ れが指すタプルのオブジェクト参照の要素にo2, o1を書き込む関数として定義さ れる.なお,クラスcのサブヒープに追加するタプルdef aultcの各要素は,属性 aの場合はそのデフォルト値のタプル(V(c, a1), ...,V(c, an)),親クラスd,子クラ スejのオブジェクト参照の場合はそのクラスのNULLオブジェクトN ulld,N ullej とする.
IsRepcdは次のように定義される.
IsRep⎧ cd o H ≡
⎪⎨
⎪⎩
ExRepc o H∧
j¬ExRepej (CastRepcej o H) H (c=d, cej) ExRepc o H∧IsReped (CastRepce o H) H (ce, e∗ d)
IsRepcdは見かけの型cを持つオブジェクトがクラスdのインスタンスであるかど
うかを判定する述語であるが,これを判定するには,型cのオブジェクト参照が指 すタプルから祖先クラスの方向にクラスdのサブヒープに格納されるタプルまで リンクしていることを調べればよい.子クラスのタプルとリンクしているかど う かは,子クラスに型変換した結果のオブジェクトがストアに存在するかで判別す ることができる.この述語はc= dとc + dの 2 つの場合に分けて定義される.
c=dである場合,cオブジェクトからどの子クラスejのタプルにもリンクしてい なければよい.つまり,cオブジェクトを子クラスejに型変換した結果のオブジェ クトがストアに存在しなければよい.c + dである場合,cオブジェクト参照を dを子孫とする子クラスeに型変換し,それがdのインスタンスであればよい.い ずれの場合もcオブジェクトがストアに存在していなければならない.