データ型
データ型(データがた、Data type)とは、コンピュータプログラミングや計算機科学において、属性を持つデータを分類し、その扱われ方をコンパイラやインタープリタに知らせるプログラム。単に型(かた、Type)とも言われる。
多くのプログラミング言語は、整数型・浮動小数点型・ブール型・文字型といった基本データ型を備えている。計算対象にされるデータは、しばしば値(value)と言われる。データ型は式内の値を制約して、関数への適用可能性や変数への代入可能性を定義する。データ型は、値の集合の概念と近似している。
コンセプト
[編集]データ型は、型システムで扱われる。型システムは、データの定義と解釈と用法を定義する形式体系である。プログラム内の多種多様なデータ間の計算の整合性を保ち、不適切な計算がなされないようにするのが型システムの目的である。これは型安全性と言われて、安全なデータ計算を保証する概念である。
計算機科学者デビッド・パーナスは、データ型の五つのタイプを定義している[1]:
- 統語(syntactic)
- ただの表記であり意味論がない。ただ記号の整合性を重視する。
- 表現(representation)
- 意味論を持たせている。構成/構造/役割の整合性を重視する。数値とポインタ値の違いもそう。
- 表現+動作(representation and behaviour)
- データ表現に関数/演算子を付けたもの。
- 値空間(value space)
- データ表現の論理積や論理和などによる空間表現。
- 値空間+動作(value space and behaviour)
- 空間表現に関数/演算子を付けたもの。
データ型の種類
[編集]データ型のバリエーションは個々の型システムによって定義される。例えば数値を示す型として、C言語の型システムはint
およびfloat
を持ち、JavaScriptの型システムはNumber
のみを持つ。それぞれの型システム(言語)が規定する型の分類が存在し、また慣例的にプログラミング言語問わずおこなわれる分類も存在する。複数の観点から型を分類することができる。
- 単純型/複合型
- 最小単位の型かその組み合わせによる型か(cf. 代数的データ型)
- 言語定義型/ユーザ定義型
- 言語によって最初から提供されている型か、ユーザーが自分で定義した型か
- first-class/non-first-class
- 関数の実引数/返値として利用できる型か否か(cf. 第一級オブジェクト)
また処理系の実装の側からの観点が強い分類だが、レジスタなどのワードに値が直接収まる型と、ワードにはポインタが入り、ポインタの先に実際の値がある型、といったような分類もある。言語処理系実装の論文などで、前者についてimmediate(即値)という表現が見られるかもしれない[注釈 1]。ポインタ自身に型などといったような情報を含ませることもある(en:Tagged pointer)。
なおJavaでは、Javaにおけるクラスのインスタンスである(あらゆる)オブジェクトについて、その型は「参照型」であり、intなどそれ以外の限られた全ての型は「プリミティブ型」である。ユーザが定義できるのは、型を定義できるというよりも、クラスを定義できると表現するのが正確ではないかと思われる。
以下に代表的なデータ型を列挙する。
- 文字型/文字列型
-
- 文字型
- C/C++などでは数値型の一種で、文字を文字として扱う特別な単純型はない。
- 文字列型
- 特に文字列型を設けず、文字型の配列で文字列を表すプログラミング言語もある(例:C/C++)。逆に文字型を設けず、文字列型しかない言語もある(例:Visual Basic バージョン6まで)。
- 数値型
- 精度とサイズ・処理速度のトレードオフがあるため、サイズと精度が異なる複数の型を持つ言語が多い。
- ブーリアン型
- 論理型、ブール型とも。多くの言語では真偽2値のみを扱うが、3値論理を扱う言語もある。整数型の1と0など、別の型の適当な値にtrueとfalseという別名を与える場合とそうでない場合がある。
- 日付型
- 日付や時刻を扱う型。日付を扱う型と時刻を扱う型が別々の場合もある。
- バイナリ型
- バイナリデータを扱う型。言語によってはバイナリ型を持たずに数値型の配列(例えばCでは1バイト整数型の配列)で表現する場合がある。固定長バイナリと可変長バイナリに分かれている言語もある。
- 関数型
- 第一級関数を持つプログラミング言語では、関数を値として扱うことができる。
- ポインタ型
- 参照型、ハンドル型、オブジェクト型などとも。ポインタ型と呼ぶ場合はポインタ演算の存在を期待されていることが多い。内部表現はアドレスを表す整数型であることが多い。
- void型
- 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。
- ユニット型
- 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。void型との違いは、void型の値(オブジェクト)が存在しないのに対し、ユニット型にはユニット型の値が存在することである。
配列型、関数型、ポインタ型は、たいていの場合、それぞれ「~型の配列」、「…型を引数に取り~型を返す関数」、「~型へのポインタ」といったような型である。いくつかの良く出来ている言語には、総称型など、そういった型を一般的に扱う仕組みがある。いくつかのそうでない言語では、アドホックにそういった派生型を作ることができるものがある。
注釈
[編集]出典
[編集]- ^ Parnas, D. L.; Shore, John E.; Weiss, David (1976-03-01). “Abstract types defined as classes of variables”. ACM SIGPLAN Notices (New York, New York, USA: ACM Press) 11 (SI): 149–154. doi:10.1145/942574.807133. ISSN 0362-1340 .