データ型
データ型(でーたがた、data type)とは、コンピュータにおけるデータの扱いに関する形式のことである。データタイプとも。データ型は、プログラミングなどにおいて変数そのものや、その中に代入されるオブジェクトや値が対象となる。
型の役割
各変数のもつ型に応じて、それに適用される命令がコンパイルされていくという基本的な役割のほか、型に応じてコンピュータで扱いやすいバイナリで記憶したり(静的型付けのみ)、関数、式が持つ型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証も可能であり、現在、様々な型の応用が研究されている(型理論)。
型の実装
テンプレート:Main C言語等では変数宣言の際に明示的に型を宣言してプログラミングを行い、型の整合性がとれていないプログラムはエラーとなってコンパイルできない。一方、OCaml等の型推論をもった言語では明示的な型指定を変数宣言で行う必要が無く、コンパイラが自動的に各変数の型を計算した上で、型の検査を行ってくれる。たとえば a = 1 + 2 という代入文があれば整数同士の加算結果だからaは整数といった具合にあらゆる変数の型を決定していくわけである。
Perl等の言語ではプログラマは型を指定せず、1つのプログラム内で適用される演算によって文字列型変数として振る舞ったり、整数型変数として振る舞ったりする。このような変数ではなくデータの方に型をもつ言語を動的型付けの言語という。
一般に動的な型付けを持つ言語では型の特性に合わせた最適化(例えば常に浮動小数点レジスタを用いるなど)ができないので、実行速度という面では静的型に劣ると考えられている。反面多態性や記述の容易さで動的型は融通が利き、Smalltalkなどのオブジェクト指向言語、スクリプト言語は動的型を採用するケースが多い。
動的型と静的型のどちらが安全なプログラムを記述できるのかは長年論争の的であるが、双方とも適した問題領域、適した開発スタイルが存在し、異なった安全観念を持つ点を理解しなければならない。
データ型の種類
単純型と複合型
テンプレート:Main 単純型とはプログラミング言語の仕様に元から存在する型である。組み込み型、原始型、プリミティブ型、基本型などと呼ばれることもある。それに対し複合型とは、プログラマ(ライブラリ作者を含む)がソースコードの記述などにより新たに作る型である。複合データ型、ユーザ型、ユーザー定義型、参照型、リファレンス型などとも呼ばれる。
ある型が単純型か複合型かは言語仕様に依存する。たとえば文字列型は多くの言語で単純型だがC++ではライブラリで提供される複合型である。また、全てのプログラミング言語が複合型を作る機能を有するわけではない。
複合型はデータ構造などにより次のような種類がある。
単純型の例
すでに述べたとおり、言語によっては複合型となる。
- 文字型/文字列型
- 文字型 - C/C++などでは数値型の一種で、文字を文字として扱う特別な単純型はない。
- 文字列型 - 特に文字列型を設けず、文字型の配列で文字列を表すプログラミング言語もある(例:C/C++)。逆に文字型を設けず、文字列型しかない言語もある(例:Visual Basic バージョン6まで)。
- 数値型 - 精度とサイズ・処理速度のトレードオフがあるため、サイズと精度が異なる複数の型を持つ言語が多い。
- ブーリアン型 - 論理型、ブール型とも。多くの言語では真偽2値のみを扱うが、3値論理を扱う言語もある。
- 日付型 - 日付や時刻を扱う型。日付を扱う型と時刻を扱う型が別々の場合もある。
- バイナリ型 - バイナリデータを扱う型。言語によってはバイナリ型を持たずに数値型の配列(例えばCでは1バイト整数型の配列)で表現する場合がある。固定長バイナリと可変長バイナリに分かれている言語もある。
- 関数型 - 第一級関数を持つプログラミング言語では、関数を値として扱うことができる。
- ポインタ型 - 参照型、ハンドル型、オブジェクト型などとも。ポインタ型と呼ぶ場合はポインタ演算の存在を期待されていることが多い。内部表現はアドレスを表す整数型であることが多い。
- void型 - 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。
- ユニット型 - 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。void型との違いは、void型の値(オブジェクト)が存在しないのに対し、ユニット型にはユニット型の値が存在することである。
配列型、関数型、ポインタ型はそれぞれ「~型の配列」、「…型を引数に取り~型を返す関数」、「~型へのポインタ」などと表現し、基にする型がしばしば存在する。そのためCとC++ではこれらを一括りにして「~型の派生型」と分類している。
複合型の例
すでに述べたとおり、言語によっては単純型となる。
- 配列型 - ベクトル型とも。
- リスト型 - 配列型に似るが、インデックス(番号)ではなくポインタ(前後のつながり)で管理されている。
- タプル型 - ペア型とも。固定長の組からなる型。
- 数値型
- 複素数型 - 複素数を扱う型。実数型があれば複合型として実現できるが、言語によっては単純型として用意している。
- 純虚数型 - 純虚数のみを扱う型。実部が不要な分、記憶域や計算に必要なコストを抑えられる。
- 四元数型 - 四元数(クォータニオン)を扱う型。特に3次元コンピュータグラフィックスの処理で便利なため、言語によっては用意されていることがある。大抵のプログラミング言語ではライブラリにより複合型として実現される。
- 有理数型 - 有理数を分母と分子の組として表現する型。
- 多倍長整数型 - 任意の容量を使い、任意の桁数の整数を表す。これを浮動小数点数や有理数型の要素型に使って実数を表すことも多い。
- 区間型
- 行列型 - 配列型に似るが、行列演算ができる。スカラー型・ベクトル型・行列型を区別する言語と、スカラーやベクトルも列数や行数が1の行列として表す言語がある。