プリミティブ型

プリミティブ型またはプリミティブデータ型: primitive data type)は、データ型の分類用語であり、データ型の中で最も基本的なものを指している。基本データ型basic data type)とも言われる[1]。直訳して原始型と呼ばれることもある。

対義的な分類用語は、複合データ型英語版composite data type)である。コンポジット型、コンポジットデータ型、あるいは複合型とも呼ばれる。複合データ型は、プリミティブ型および複合データ型の構造的または再帰的な組み合わせ(コンポジション)で形成されるデータ型である。なお、「コンポジットデータ型」という用語は、PL/SQLにおける「スカラーデータ型」の対義語としても用いられている[2]

プログラミング言語の仕様に組み込まれる形で標準的に用意されている組み込み型built-in type)[3]には、通常複合データ型が含まれるが、それらをプリミティブ型と同様に扱う場合もある。

概要

[編集]

プログラミング言語理論英語版理論計算機科学における代数的データ型の視点では、「そのデータ型の定義の中に構成要素として自身あるいは他のデータ型を含まない型」がプリミティブ型である。プリミティブ型はCPUが直接処理できるデータ型という含意があるため、Python などの高級言語ではプリミティブ型という概念は隠蔽されがちである。

通常プリミティブ型として扱われる型の例:

  • 文字型 (character, char) - 1バイトの文字型のほか、2バイトや4バイトの文字型が用意されていることもある。文字セット(エンコーディング)は言語や処理系に依存するが、UTF-8UTF-16UTF-32によるUnicodeのサポートが一般的。文字型の配列によって文字列型が実装されている言語もある。
  • 整数型 (integer, int, short, long, byte) - 各種のサイズがあるが、1, 2, 4, 8バイトの整数型が用意されていることが多い。符号付きのほか、符号無しの型が用意されていることもある。
  • 浮動小数点数型 (float, single, double, real, double precision) - 各種のサイズがあるが、IEEE 754に準拠した単精度と倍精度の浮動小数点数型が用意されていることが多い。
  • 固定小数点数型 (fixed) - 各種の固定精度やスケール指定可能なものがある。
  • ブーリアン型 (boolean, bool) - 真値 (true) または偽値 (false) をとるブール代数型。

プリミティブ型が最も高速な演算を行える言語構成要素である場合が多い。例として整数の加算は、単一マシン命令として演算され、プロセッサによっては単一マシン命令で文字列を処理する具体的な命令を提供している。特に、C言語標準では「plainなint型オブジェクトのサイズは実行環境のアーキテクチャに依存する」とされている。これは、32ビットアーキテクチャではint型が32ビットになりえることを意味する。

組み込み型

[編集]

組み込み型はプログラミング言語にあらかじめ組み込まれているデータ型である。上記のプリミティブ型に加えて、以下のような型が組み込み型として用意されている場合がある。

  • ポインタ型 - オブジェクトを指し示すためのメモリ上のアドレス情報を保持する型。C/C++では整数値と相互変換可能。
  • 参照型 - オブジェクトを参照するための型。

ポインタ型や参照型では、プリミティブ型よりも大きなサイズのオブジェクトを指し示すことができる。ハンドル型と呼ばれることもあるが、内部的にはポインタあるいは参照と等価であることが多い。

通常参照型として扱われる組み込み型の例:

言語ごとのプリミティブ型

[編集]

Smalltalkのプリミティブ型

[編集]

Smalltalkではプログラムによって拡張されたプリミティブデータ型を許可しており、それらの型の演算命令を追加することもでき、場合によっては言語固有の演算命令を再定義することもできる。

Javaのプリミティブ型

[編集]

Javaでは以下の型をプリミティブデータ型として規定している[4]

Javaのプリミティブデータ型
型名 説明
byte 符号付き8ビット整数型
short 符号付き16ビット整数型
int 符号付き32ビット整数型
long 符号付き64ビット整数型
float 32ビット単精度浮動小数点数
double 64ビット倍精度浮動小数点数
boolean ブーリアン型
char 16ビットUnicode (UTF-16) 文字型

Javaのプリミティブ型はオブジェクトではないため、そのままでは配列以外のコレクションに格納することができない。プリミティブ型をラップしてオブジェクトとして扱えるようにするため、各プリミティブ型にはプリミティブラッパークラスが用意されている。

.NETのCLRプリミティブ型

[編集]

.NET Framework/.NET Core共通言語ランタイム (CLR/CoreCLR) では、System.Type.IsPrimitiveプロパティによって、型がCLRプリミティブ型であるかどうかを判定できる[5]。各.NET言語の組み込みの値型は必ずしもCLRプリミティブ型ではないが、CLRプリミティブ型はすべて値型である。

例えば、十進浮動小数点数型System.Decimalは値型(構造体)であり、C#の組み込み型decimalでもあるが、CLRプリミティブ型ではない。ポインタまたはハンドルを表すときに使用されるプラットフォーム固有の型System.IntPtrは値型であり、CLRプリミティブ型でもあるが、C#の組み込み型ではない(C# 9.0以降はnintとして組み込み型となった[6])。

CLRプリミティブ型は共通中間言語 (CIL) 上で専用の命令を持つなどの特別な性質がある。

ECMAScriptのプリミティブ値

[編集]

ECMAScript (JavaScript) におけるプリミティブ値はUndefined, Null , Boolean, Number, BigInt, Symbol および String の7種類である[7]

脚注

[編集]

注釈

[編集]

出典

[編集]

関連項目

[編集]