プログラミング言語SML#解説 4.1.0版
29 SML#実行時データ管理

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宣言で定義された型の別名は,型の実行時表現を計算する 際は全て展開される. 不透明シグネチャ制約によって導入された不透明型の実行時表現は, その不透明型の実装型の実行時表現に等しい. インターフェースファイルによって不透明型として宣言された型の 実行時表現は,その不透明型宣言で与えられた実装型の実行時表現を持つ.