データ型モデル
読み:データがたモデル
データ型
の大きさなどを定義するもの。
目次
概要
特徴
16→32
32→64
種類
ILP32
LLP64
LP64
ILP64
概要
処理系が用いるデータ型の大きさなどを定義するものであり、特にプログラミング環境で重要となる。
現在使われているプログラミング言語には、整数型の実際の大きさを保証しないものがあり、データ型モデルに応じて変化する。
ある特定のデータ型モデルに依存したプログラムも簡単に書くことができるが、そのようなものは移植性が無いということである。
特徴
16→32
16ビットから32ビットに移行する時代、
C
などでこの問題が頻発した。
16ビット環境では、変数長は次のようであった。
char
: 8ビット
short
: 16ビット
int
: 16ビット
long
: 32ビット
long long
: 存在しない
ポインター
: 16ビット (far修飾子を付けると32ビット)
32ビット環境では、intとポインターが32ビット化された。
例えばこの当時、特に
x86
環境では
nearポインター
と
farポインター
があり、実装により
hugeポインター
も提供された。一方
i386
以上の32ビット環境ではポインターはリニアになり、32ビット長となった。
当時のCには独特の修飾子nearとfarが存在したが、32ビット環境では不要になった。またWindowsでは関数の呼び出し方も変更されたため、大きな書き換えが必要となった。
32→64
種類
大まかに、64ビット用には次の三種類のデータモデルが存在する。
32
char
short
int
long
longlong
void *
実装例
ILP32
8
16
32
32
64
32
多くの32ビット環境
LP32
8
16
16
32
64
32
実装例は少ない
64
char
short
int
long
longlong
void *
実装例
LLP64
8
16
32
32
64
64
Win64
LP64
8
16
32
64
64
64
多くの64ビットLinux
ILP64
8
16
64
64
64
64
実装例は少ない
処理系によっては複数のデータモデルに対応し、コンパイラーのオプションで切り替えられるものもある。
x64
に対応したLinux用GCCでは、-m32オプションでILP32、-m64オプションでLP64が選択される。但し-m32では、出力されるバイナリはIA-32用のものである。
ILP32
一般的な32ビット環境で、int、long、ポインターが32ビットである。
後に、ソフトウェア的な処理で64ビット長のlong longを提供する処理系も一般化した。
LLP64
64ビット実装モデルの一つ目。ポインターのみを64ビット化したもの。
Microsoft Windowsの64ビット版(
Win64
)で採用された。
ポインター以外の各整数型はILP32と同じため、ソースの互換性が高く64ビット化において最も問題が少ないと考えられているモデルである。
但し、long型にポインターを代入するような不適切な処理をしているプログラムは、プログラムを書き換えないと移植できない。
次のLP64と関連するが、LP64ではunsigned int(32ビット)同士の乗算の結果をunsigned long(64ビット)に格納することが可能だがLLP64ではunsigned longが32ビットのため出来ない。相互の移植性が必要な場合は、処理の方法等を含めた検討が必要である。
LP64
64ビット実装モデルの二つ目。ポインターとlongを64ビット化したもの。
64ビットLinuxで採用された。
x64
のほか、
Alpha
やSPARC-64用のLinuxが該当する。
ポインターをint型に代入するようなプログラムは移植できないが、longに代入するプログラムはデータ長が同じため問題が顕著化せず、そのまま移植できる。
intとlongの長さが違うため、漠然と同じであることを想定したようなプログラムで問題が生じる恐れがある。
ILP64
64ビット実装モデルの三つ目。ポインターとint以上の変数を64ビット化したもの。
実装例は少なく、殆ど知られていない。
LP64と比較し、longだけでなくintも64ビット化されている。
intとlongのデータ長が同じため、このような実装を想定した32ビット用プログラムの移植性が良いと見込まれる。またポインターをintやlongに代入するような不適切な処理をしているプログラムでも、データ長が同じため問題が顕著化せず、そのまま移植できる。
逆に、intが32ビットであることを想定したプログラムは書き換えが必要となる。とは言え、32ビット長の普通の変数が無い(shortは16ビットなので、
int32_t
や
uint32_t
を使わねばならない)という問題もあり、案外と使いにくいモデルでもある。
再検索