データ型
データ型（データがた、）とは、（コンピュータにおける）データ（値）の種類に関する分類である。データタイプとも。
具体的にいうと、たとえば 0, 1, 2, -42 といったような値は整数型であり、"foo", "Hello" といったような値は文字列型である。プログラミングなどにおいて、まずデータオブジェクトや関数などの「値」について、またさらに、それらに関連付け（束縛）される変数や定数、リテラル、それらを組合せる演算子、さらにそれらからなる式といった構文上の要素の型が、データ型の議論の対象となる。
いわゆる動的な言語の処理系では、実行時に、何らかの操作がその対象に対して正しいか否か、データ型にもとづいてチェックを入れたりする。（静的な）型システムのある言語では、式などの型に応じて、それに適用される命令にコンパイルされていくという基本的な役割のほか、型に応じてコンピュータで扱いやすいバイナリで記憶したり、式などが持つ型同士の整合性を検査したりすることによって、プログラムの誤りを検出することや、（型にもとづいた範囲の）安全性の検証も可能である（「型理論」にもとづく。型システムの記事を参照）。
C言語等の型推論を持たない言語では、型を明示してプログラミングを行う。一方、OCaml等の型推論を持った言語では、型の明示は必ずしも必要ではなく、処理系が自動的に式などの型を推論・決定する。たとえば codice_1 という文（あるいは定義）があれば「整数同士の加算結果だからcodice_2は整数」といった具合に、記述されたソースコードの文脈から静的に、可能な限り型を推論していく。いずれにせよ、型推論を持つ・持たないにかかわらず、静的に型をチェックする言語では、型の整合性がとれていないプログラムはコンパイルに失敗することになり、型の不一致によるプログラミングミスを事前に早期発見しやすくなるという利点がある。
一方、Perl等では変数は型を持たず、実行時に変数の指す先であるデータが持っている型の情報に従って、それが文字であれば文字に対応して、整数であれば整数に対応して、といったように動く。このように、動的プログラミング言語（スクリプト言語）の処理系では、一般にデータ自身の型が振る舞いを決定する。純粋オブジェクト指向言語であるSmalltalkも、同様の型特性を持つ。
（動的か静的か、混在しているものもある。たとえばAWKでは、変数の内容は「数値か文字列か配列」になるのだが、「数値か文字列か」については動的、「配列かそうでないか」は静的である）
一般に動的プログラミング言語では型の特性に合わせた最適化（例えば常に浮動小数点レジスタを用いるなど）ができないので、実行速度という面では静的型に劣るなどと主張される。反面、型の明示が必要なく融通が利くことから、多態性を実現するのが容易であり、動的ダックタイピングに向く。
動的型と静的型のどちらが安全なプログラムを記述できるのかは長年論争の的であるが、双方とも適した問題領域、適した開発スタイルが存在し、異なった安全観念（アナロジー的になるため限界はあるが、アクティブセーフティとパッシブセーフティの住み分けが参考になるかもしれない）を持つ点を理解しなければならない。
Javaにおいてその型を「プリミティブ型」と「参照型」に2分していることから、それを絶対あるいは普遍のものと思っている者がいるが、実際にはJavaのローカルルールであって（詳細はこの節の最後を参照のこと）、その2種類に分類することが絶対なわけでもなければ、それぞれの内容についてもあらゆるプログラミング（言語）に共通というわけでもない。標準規格などといった言語仕様の詳細を追えば、同じ用語を使っていても、あるいは同じ名前の型やクラスでも、詳細に見れば、あるいはあきらかに内容が違うこともある。また言語仕様などというよりは実装（処理系）の側からの観点による分類もある。典型的なものが文字列で、文字型（単一文字だけからなるもの）の配列（のエイリアス）といったような複合型のこともあれば、古典的なBASICのようにそもそも文字型がないなどの都合で単純型であったりする。
とは言え、理論的な観点からはっきり言えることも無いわけでもない。たとえば「整数の配列」とか「浮動小数点数の行列」というような型は、整数あるいは浮動小数点数といった型から複合されて作られている「複合型」であると言える。それに対し、整数型などはそれとは違って部分を持たないような「単純型」と言える。
より詳しくは、代数的データ型のような考え方によってその型を定義した時に、定義中に他の型が現れるような型は「複合型」であり、定義中に他の型は現れないような型は「単純型」である、ということになる。（ここで、では「○△の配列」といったようにして、他の型と組み合わせることで型になるようなものは何なんだ、という疑問が出てくるかもしれないが、高度過ぎるのでここでは触れない）
他にも、いろいろな分類法が考えられる。
たとえば、ユーザ定義型といったようなものを定義できる言語の場合には、言語であらかじめ定義されている型とユーザにより定義される型という区別がある。ユーザにより定義できる型には制限があるかもしれない（たとえば、複合型しか定義できない、など）。一方で、言語の本体ではどんな型も定義されておらず、基本的な型も全て標準ライブラリ等と呼ばれる基本的なライブラリでユーザ定義型と同じ（考え方としては）ように、定義されているというスタイルのこともある。
第一級（first-class）か否か、という分類もある（詳細は第一級オブジェクトの記事を参照）。その型の値を変数の値とすることができ、その型の値を実引数として関数を適用でき、関数から関数適用の値としてその型の値を返すことができる、といったようなことが自由にできるのが第一級であり、そうでない型は第一級ではない。たとえばC言語では、引数として渡すと配列はポインタになってしまう、など色々と癖がある。また、function typeが第一級関数であれば、いろいろと高階の技法が使える。
また処理系の実装の側からの観点が強い分類だが、レジスタなどのワードに値が直接収まる型と、ワードにはポインタが入り、ポインタの先に実際の値がある型、といったような分類もある（実のところ、次で述べるJavaにおける分類は、これを言語のレベルに抽象化して持ち込んだもの、という印象が強い）。言語処理系実装の論文などで、前者についてimmediate（即値）という表現が見られるかもしれない（機械語における、命令の直後に引き続いたデータという意味のimmediate（即値）と、似ているが異なるものなので注意が必要）。ポインタ自身に型などといったような情報を含ませることもある（）。
また、Javaでは、Javaにおけるクラスのインスタンスである（あらゆる）オブジェクトについて、その型は「参照型」であり、intなどそれ以外の限られた全ての型は「プリミティブ型」である。ユーザが定義できるのは、型を定義できるというよりも、クラスを定義できると表現するのが正確ではないかと思われる。
以下の列挙の基準等はよくわからないが、幾人かによる編集により、よくわからないものになったと思われる。敢えて除去することもないと思われるので、そのまま残す。
前述のように、ここの節の分け方は、幾人かのウィキペディア編集者による恣意的なもの以上のものではない。
配列型、関数型、ポインタ型はそれぞれ「～型の配列」、「…型を引数に取り～型を返す関数」、「～型へのポインタ」などと表現し、基にする型がしばしば存在する。そのためCとC++ではこれらを一括りにして「～型の派生型」と分類している。
前述のように、ここの節の分け方は、幾人かのウィキペディア編集者による恣意的なもの以上のものではない。