データ型

計算機科学におけるデータの分類の一方法

プログラミングにおけるデータ型(データがた、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まで)。
  • 数値型 - 精度とサイズ・処理速度のトレードオフがあるため、サイズと精度が異なる複数の型を持つ言語が多い。
    • 整数型 - 整数を扱う型。
      • 符号付き整数型 - 負整数も扱える。一般に整数型は符号付きだが、符号付き整数型と符号なし整数型を別に持つ言語もある。
      • 符号なし整数型 - 非負整数(0か正整数)のみを扱える。
    • 小数(小数点を含む数ないし値)を表現する型
      • 浮動小数点数
      • 固定小数点数
      • 十進型(実数型#十進型) - 通貨型、金額型とも。金額を扱う場合などに適しているなどとされるが、もっぱら単なる十進ベースというだけの固定ないし浮動小数点表現であって、特に通貨や金額を扱うための何かがあるわけでもない場合も多い。
  • ブーリアン型 - 論理型、ブール型とも。多くの言語では真偽2値のみを扱うが、3値論理を扱う言語もある。整数型の1と0など、別の型の適当な値にtrueとfalseという別名を与える場合とそうでない場合がある。
  • 日付型 - 日付や時刻を扱う型。日付を扱う型と時刻を扱う型が別々の場合もある。
  • バイナリ型 - バイナリデータを扱う型。言語によってはバイナリ型を持たずに数値型の配列(例えばCでは1バイト整数型の配列)で表現する場合がある。固定長バイナリと可変長バイナリに分かれている言語もある。
  • 関数型 - 第一級関数を持つプログラミング言語では、関数を値として扱うことができる。
  • ポインタ型 - 参照型、ハンドル型、オブジェクト型などとも。ポインタ型と呼ぶ場合はポインタ演算の存在を期待されていることが多い。内部表現はアドレスを表す整数型であることが多い。
  • void型 - 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。
  • ユニット型 - 関数の返り値や引数などで、対応する値が「ない」ことを示すための型。void型との違いは、void型の値(オブジェクト)が存在しないのに対し、ユニット型にはユニット型の値が存在することである。

配列型、関数型、ポインタ型は、たいていの場合、それぞれ「~型の配列」、「…型を引数に取り~型を返す関数」、「~型へのポインタ」といったような型である。いくつかの良く出来ている言語には、総称型など、そういった型を一般的に扱う仕組みがある。いくつかのそうでない言語では、アドホックにそういった派生型を作ることができるものがある。

  • 配列型 - ベクトル型とも。
  • リスト型 - 配列型に似るが、インデックス(番号)ではなくポインタ(前後のつながり)で管理されている。
  • タプル型 - ペア型とも。固定長の組からなる型。
  • 数値型
    • 複素数型 - 複素数を扱う型。実数を表現する型があれば複合型として実現できるが、言語によっては単純型として用意している。
    • 純虚数型 - 純虚数のみを扱う型。実部が不要な分、記憶域や計算に必要なコストを抑えられる。
    • 四元数型 - 四元数(クォータニオン)を扱う型。特に3次元コンピュータグラフィックスの処理で便利なため、言語によっては用意されていることがある。大抵のプログラミング言語ではライブラリにより複合型として実現される。
    • 有理数型 - 有理数を分母と分子の組として表現する型。
    • 多倍長整数型 - 任意の容量を使い、任意の桁数の整数を表す。これを浮動小数点数や有理数型の要素型に使って実数を表すことも多い。
    • 区間型
  • 行列型 - 配列型に似るが、行列演算ができる。スカラー型・ベクトル型・行列型を区別する言語と、スカラーやベクトルも列数や行数が1の行列として表す言語がある。

脚注編集

[脚注の使い方]
  1. ^ 理論的な文脈では、型システムといえば通例静的型付けであり、特に断らない場合があるため、括弧書きとしている。
  2. ^ 型理論」にもとづく。詳しくは型システムの記事を参照。
  3. ^ 機械語における、命令の直後に引き続いたデータという意味のimmediate(即値)と、似ているが異なるものなので注意が必要。

関連項目編集