29.1 実行時表現
SML#が管理する全ての型構成子は, メモリ上での「サイズ」, GCのトレース対象かどうかを表す「タグ」,および メモリ上のビット列の意味および取り得る範囲を表す「表現」の 3つの要素を持つ. この3つ組を,その型構成子の「実行時表現」と呼ぶ. 型の実行時表現は,型を構成する最も外側の型構成子によって 決定される. 主要な組み込み型構成子の実行時表現は以下の通りである.
組み込み型構成子 | サイズ(バイト数) | タグ | 表現 |
---|---|---|---|
int, int32 | 4 | 0 | Cの符号付き整数の内部表現 |
int8 | 1 | 0 | Cの符号付き整数の内部表現 |
int16 | 2 | 0 | Cの符号付き整数の内部表現 |
int64 | 8 | 0 | Cの符号付き整数の内部表現 |
word, word32 | 4 | 0 | Cの符号なし整数の内部表現 |
word8 | 1 | 0 | Cの符号なし整数の内部表現 |
word16 | 2 | 0 | Cの符号なし整数の内部表現 |
word64 | 8 | 0 | Cの符号なし整数の内部表現 |
char | 1 | 0 | 不定 |
real, real64 | 8 | 0 | IEEE754浮動小数点数 |
real32 | 4 | 0 | IEEE754浮動小数点数 |
ptr | 4または8 | 0 | Cのvoid*の内部表現 |
codeptr | 4または8 | 0 | Cの関数ポインタの内部表現 |
unit | 4 | 0 | 単一バリアント |
contag | 4 | 0 | 不定 |
boxed | 4または8 | 1 | 不定 |
array | 4または8 | 1 | NULLでないポインタ |
vector | 4または8 | 1 | NULLでないポインタ |
ref | 4または8 | 1 | NULLでないポインタ |
string | 4または8 | 1 | NULLでないポインタ |
exn | 4または8 | 1 | NULLでないポインタ |
レコード型,組型 | 4または8 | 1 | NULLでないポインタ |
関数型 | 4または8 | 1 | NULLでないポインタ |
サイズが「4または8」である型のサイズは,ターゲットプラットフォームが 32ビットか64ビットかに依存して決まる.
すべての型構成子について,境界整列条件はサイズに等しい. C言語の内部表現と等しい実行時表現は,そのC言語の内部表現と等しい 大きさと境界整列条件を持つことが期待されている一方, 現在のSML#コンパイラは,各実行時表現の 大きさと境界整列条件をターゲットによらず固定で与えている (この点はSML#の将来の版で改良する予定である).
datatype構文で定義されたユーザー定義型の実行時表現は, ユーザーが与えたコンストラクタの集合から計算される.
-
•
引数を取らないただ一つのデータコンストラクタから構成される ユーザー定義型の実行時表現はunitに等しい.
-
•
引数を取らない2つ以上のデータコンストラクタのみから構成される ユーザー定義型の実行時表現はcontagに等しい.
-
•
それ以外のユーザー定義型の実行時表現はboxedに等しい.
type宣言で定義された型の別名は,型の実行時表現を計算する 際は全て展開される. 不透明シグネチャ制約によって導入された不透明型の実行時表現は, その不透明型の実装型の実行時表現に等しい. インターフェースファイルによって不透明型として宣言された型の 実行時表現は,その不透明型宣言で与えられた実装型の実行時表現を持つ.