データ型
![]() |
プログラミングにおけるデータ型(データがた、data type)あるいは単に型(かた、type)は、値の種類を示し分類分けするラベルである。データタイプともいう。
例えば 0, 1, -42 は「整数」型に、"foo", "Hello" は「文字列」型にラベルづけできる。他にもデータオブジェクト・関数・それらに関連付け(束縛)される変数や定数・リテラル・演算子・式など様々な値に型が与えられる。データ型が与えられたコードへ型システムによる型検査をおこなうことで、型によるコードのバグチェックが可能になる。また型によるコンパイラ最適化が可能になる。
役割[編集]
データ型は型システムによる型検査時に、コード上の値が所属する種類を示すために用いられる。動的な言語の処理系では、実行時に、何らかの操作がその対象に対して正しいか否か、データ型にもとづいてチェックを入れたりする。(静的な[1])型システムのある言語では、式などの型に応じて、それに適用される命令にコンパイルされていくという基本的な役割のほか、型に応じてコンピュータで扱いやすいバイナリで記憶したり、式などが持つ型同士の整合性を検査したりすることによって、プログラムの誤りを検出することや、(型にもとづいた範囲の)安全性の検証も可能である[2]。
種類[編集]
データ型のバリエーションは個々の型システムによって定義される。例えば数値を示す型として、C言語の型システムはint
およびfloat
を持ち、JavaScriptの型システムはNumber
のみを持つ。それぞれの型システム(言語)が規定する型の分類が存在し、また慣例的にプログラミング言語問わずおこなわれる分類も存在する。
分類[編集]
![]() |
複数の観点から型を分類することができる。
- 単純型/複合型: 最小単位の型かその組み合わせによる型か(c.f. 代数的データ型)
- 言語定義型/ユーザ定義型
- first-class/non-first-class: 関数の実引数/返値として利用できる型か否か(c.f. 第一級オブジェクト)
また処理系の実装の側からの観点が強い分類だが、レジスタなどのワードに値が直接収まる型と、ワードにはポインタが入り、ポインタの先に実際の値がある型、といったような分類もある。言語処理系実装の論文などで、前者についてimmediate(即値)という表現が見られるかもしれない[3]。ポインタ自身に型などといったような情報を含ませることもある(en:Tagged pointer)。
Java[編集]
Javaでは、Javaにおけるクラスのインスタンスである(あらゆる)オブジェクトについて、その型は「参照型」であり、intなどそれ以外の限られた全ての型は「プリミティブ型」である。ユーザが定義できるのは、型を定義できるというよりも、クラスを定義できると表現するのが正確ではないかと思われる。
型の例[編集]
- 文字型/文字列型
- 文字型 - C/C++などでは数値型の一種で、文字を文字として扱う特別な単純型はない。
- 文字列型 - 特に文字列型を設けず、文字型の配列で文字列を表すプログラミング言語もある(例:C/C++)。逆に文字型を設けず、文字列型しかない言語もある(例:Visual Basic バージョン6まで)。
- 数値型 - 精度とサイズ・処理速度のトレードオフがあるため、サイズと精度が異なる複数の型を持つ言語が多い。
- ブーリアン型 - 論理型、ブール型とも。多くの言語では真偽2値のみを扱うが、3値論理を扱う言語もある。整数型の1と0など、別の型の適当な値にtrueとfalseという別名を与える場合とそうでない場合がある。
- 日付型 - 日付や時刻を扱う型。日付を扱う型と時刻を扱う型が別々の場合もある。
- バイナリ型 - バイナリデータを扱う型。言語によってはバイナリ型を持たずに数値型の配列(例えばCでは1バイト整数型の配列)で表現する場合がある。固定長バイナリと可変長バイナリに分かれている言語もある。
- 関数型 - 第一級関数を持つプログラミング言語では、関数を値として扱うことができる。
- ポインタ型 - 参照型、ハンドル型、オブジェクト型などとも。ポインタ型と呼ぶ場合はポインタ演算の存在を期待されていることが多い。内部表現はアドレスを表す整数型であることが多い。
- void型 - 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。
- ユニット型 - 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。void型との違いは、void型の値(オブジェクト)が存在しないのに対し、ユニット型にはユニット型の値が存在することである。
配列型、関数型、ポインタ型は、たいていの場合、それぞれ「~型の配列」、「…型を引数に取り~型を返す関数」、「~型へのポインタ」といったような型である。いくつかの良く出来ている言語には、総称型など、そういった型を一般的に扱う仕組みがある。いくつかのそうでない言語では、アドホックにそういった派生型を作ることができるものがある。
- 配列型 - ベクトル型とも。
- リスト型 - 配列型に似るが、インデックス(番号)ではなくポインタ(前後のつながり)で管理されている。
- タプル型 - ペア型とも。固定長の組からなる型。
- 数値型
- 複素数型 - 複素数を扱う型。実数を表現する型があれば複合型として実現できるが、言語によっては単純型として用意している。
- 純虚数型 - 純虚数のみを扱う型。実部が不要な分、記憶域や計算に必要なコストを抑えられる。
- 四元数型 - 四元数(クォータニオン)を扱う型。特に3次元コンピュータグラフィックスの処理で便利なため、言語によっては用意されていることがある。大抵のプログラミング言語ではライブラリにより複合型として実現される。
- 有理数型 - 有理数を分母と分子の組として表現する型。
- 多倍長整数型 - 任意の容量を使い、任意の桁数の整数を表す。これを浮動小数点数や有理数型の要素型に使って実数を表すことも多い。
- 区間型
- 行列型 - 配列型に似るが、行列演算ができる。スカラー型・ベクトル型・行列型を区別する言語と、スカラーやベクトルも列数や行数が1の行列として表す言語がある。
脚注[編集]
- ^ 理論的な文脈では、型システムといえば通例静的型付けであり、特に断らない場合があるため、括弧書きとしている。
- ^ 「型理論」にもとづく。詳しくは型システムの記事を参照。
- ^ 機械語における、命令の直後に引き続いたデータという意味のimmediate(即値)と、似ているが異なるものなので注意が必要。
関連項目[編集]
|