データ型モデル
読み:データがたモデル

 データ型の大きさなどを定義するもの。
目次

概要
 処理系が用いるデータ型の大きさなどを定義するものであり、特にプログラミング環境で重要となる。
 現在使われているプログラミング言語には、整数型の実際の大きさを保証しないものがあり、データ型モデルに応じて変化する。
 ある特定のデータ型モデルに依存したプログラムも簡単に書くことができるが、そのようなものは移植性が無いということである。

特徴

16→32
 16ビットから32ビットに移行する時代、Cなどでこの問題が頻発した。
 16ビット環境では、変数長は次のようであった。
 32ビット環境では、intとポインターが32ビット化された。
 例えばこの当時、特にx86環境ではnearポインターfarポインターがあり、実装によりhugeポインターも提供された。一方i386以上の32ビット環境ではポインターはリニアになり、32ビット長となった。
 当時のCには独特の修飾子nearとfarが存在したが、32ビット環境では不要になった。またWindowsでは関数の呼び出し方も変更されたため、大きな書き換えが必要となった。

32→64

種類
 大まかに、64ビット用には次の三種類のデータモデルが存在する。
32charshortintlonglonglongvoid *実装例
ILP3281632326432多くの32ビット環境
LP3281616326432実装例は少ない
64charshortintlonglonglongvoid *実装例
LLP6481632326464Win64
LP6481632646464多くの64ビットLinux
ILP6481664646464実装例は少ない
 処理系によっては複数のデータモデルに対応し、コンパイラーのオプションで切り替えられるものもある。
 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_tuint32_tを使わねばならない)という問題もあり、案外と使いにくいモデルでもある。

再検索