: Coercion ベース表現解析
: 多相変数の表現
: 多相関数の展開(expansion)
- 多相変数の問題を解決する他の方法として fully boxed 表現を使う方法があ
る.ここでは,全ての値を同じサイズにし,各値は自分自身をガベージコ
レクタに記述する.
- 常に,各値を 1 ワードにする.レコードを生成し,
それへのポインタを 1 ワードで使う.このテクニックは boxing といい,
ポインタは boxed value という.
- 節 13.7 で述べたように boxed value を表現したレコー
ドは,常にそのレコードがどのくらいの大きさか,ポインタであるかどうかを
示すディスクリプタで始まる.
- 2 〜 12 章で説明した,基本的な Tiger コンパイラは,1 ワードで
すべてを表現したが,データオブジェクトは,自分自身をガベージコレクタに
describe していない.13 章の最後で述べたガベージコレクションディスクリプタ形
式は,よりよいが,多相をサポートすることはまたできない.
Boxing と tagging
- 整数値は,1ワードにフィットするが,ガベージコレクタに自分自身を
describe しない.
- そのため,(整数も)boxed しなければならない.この場合は,整数を保
持する 1 ワードレコード(レコードへのポインタ) を生成する.
- boxed value に対して,
のような算術式をコンパイ
ルするためには box から
をフェッチし(unboxed),
をフェッ
チし,加算を実行し,それから,boxed の
保持する新しいレコードを割
り当てる.
- これは,まったく高価(expensive) である.
- 文字(characters) のような値(本来の表現で,1ワードより小さい)のた
めには,tagging という別の boxing がある.
- 例えば,byte-addressed マシンの上で,すべてのレコードポインタが,
4 の倍数境界にアラインされていると仮定すると,すべてのワードの最後の 1
は,ポインタではないと認識できるだろう.
- そのため,左にシフトし,1 を加えることにより,文字の値を表現する
こができる.
- tagged value で
をコンパイルするためには,
を右にシフト(untagged)し,
も右にシフトし,加算を実行し,
を
左にシフトしインクリメントする(tagged).
- これは,新しいレコード(ガベージコレクション可能)を割り当てるよ
りは,安価である.事実,多くのシフトはしなくてもよい(Excercise 16.8).
- Tagging は,boxing より大変安価であるため,多くの多相言語の実現
は通常の整数変数のためには tagging を使っている(整数が,マシンの
full ワードサイズを使うことができないという欠点を持っていても).
なぜなら,tag のために 1 ビット予約されているからである.
平成12年8月22日