回答:
言語に依存します。
たとえば、CおよびC ++のような言語では、あなたは組み込みのスカラー型の数を持っている- 、int
、float
、double
、char
などが挙げられる。これらは、彼らがより単純な成分に分解することができないという意味で「原始的」です。これらの基本型から、ポインタ型、配列型、構造体型、共用体型などの新しい型を定義できます。
次に、古い学校のLispのような言語があり、すべてがアトムまたはリストのいずれかです。繰り返しますが、上記の定義では、原子はより単純なものに分解できないという意味で「プリミティブ」です。
編集
私の知る限り、「プリミティブ」、「基本」、および「組み込み」という用語はほとんど同じ意味です。しかし、本当につまらないものにしたい場合は、「組み込み」(言語定義によって明示的に提供される)型と、「プリミティブ」または「基本」のままの組み込み型から派生した型を区別できます。単純な要素に分解できないという点で。Cのtypedef
この機能を使用すると、既存のタイプの新しいタイプ名を作成できます。Adaでは、制約が設定された新しいスカラー型を作成できます。たとえば、範囲[-90.0、90.0]以外の値をとることができないという制約を使用して、組み込みの浮動小数点型からLatitude型を派生できます。単純なコンポーネントに分解できないという点で、プリミティブ型または基本型ですが、ユーザー定義であるため、「組み込み」型とは見なされません。
繰り返しますが、これらの概念は少しあいまいであり、実際にはコンテキストに依存します。たとえば、「組み込み」型の概念は、BLISSのような型のない言語では意味がありません。
char
プリミティブ型とString
複合タイプを。
以下からのJavaの視点:
Javaでは、プリミティブ型と非プリミティブ型は非常に明確に区別されます。
プリミティブ型の変数には、その型の値が直接含まれます(つまり、値型です)。
非プリミティブ型の変数には値が直接含まれていません。代わりに、オブジェクトへの参照(ポインターに類似)です。(Javaでは、ユーザー定義の値型を作成することはできません)。
:Javaは、8種類の基本型を持っているbyte
、short
、int
、long
、char
、boolean
、float
とdouble
。それ以外は非プリミティブ型です。
String
は言語の特別なステータスがあります(リテラルを取得し、の署名にありmain
、JLSによって明示的に許可されていると推測されるインターンがあり、自動的に使用可能など)、それはプリミティブデータ型ではありません。組み込みと呼ぶかもしれません。
プリミティブは、他のデータ型から構築されていない基本的なデータ型です。1つの値のみを表すことができます。すべてのプリミティブは必然的に組み込みデータ型です(コンパイラはそれらについて知る必要があります)が、すべての組み込みデータ型がプリミティブではありません。
一部の言語では、コンパイラーは特定のタイプの知識を組み込みますが、それは他のものから構築されます。これは、コンパイラーが特別な方法でそれらを処理できる必要があるためです。例は、DelphiおよびVisual BasicのVariant(およびBooの同等の "Duck")や、ほとんどのOO言語の基本オブジェクトクラスです。
JavaではなくSNOBOL4で「文字列」型がプリミティブ型と見なされるのはなぜですか?
Java言語仕様はJavaのコンテキストで「プリミティブ」という言葉の意味を非常に明確に規定しており、Java String
がこの仕様に準拠していないため、SNOBOL4言語仕様はSNOBOL4およびSNOBOL4の文字列のコンテキストで「プリミティブ」の意味を定義しているためその仕様に準拠しています。
本当にそれ以上何もありません。それぞれの言語の仕様は、特定の単語が何を意味するかを定義し、何かがその説明に適合するかそうでないかのどちらかです。たとえば、C言語仕様では、「関数」という言葉の意味を、「関数」という言葉が通常意味するものとは明らかに異なるものと定義していますが、それがCコミュニティ内での使用方法です。
「プリミティブ」データ型は、メモリに値が保存されていることを意味します。この値にはメソッドや内部構造はありません。プリミティブは、外部操作によってのみ操作できます。
Javaでは、プリミティブは数字(int、longなど)とcharです。http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
値に構造がある場合(ここではストラットについて考えています)、それはプリミティブではありません。メソッド(オブジェクトまたはクラス)がある場合、プリミティブではありません。
int
データ型にはメソッドがあります
var myString = 3.ToString();
(Int32.ToString()を参照)。そのノートint
C#にある同義語のためにInt32
、すなわち、Int32
である(Javaのとは異なり、プリミティブ型Integer
とは異なりますint
)。したがって、3.ToString()
C#ではボクシングは必要ありません!
私はいくつかの情報に出会い、それが他の答えを助けると感じました。それを共有したい-
ウィキペディアによると-
コンピューターサイエンスでは、プリミティブデータ型は次のいずれかです。
基本型は、プログラミング言語によって基本的な構成要素として提供されるデータ型です。ほとんどの言語では、より複雑な複合型を基本型から再帰的に構築できます。
組み込み型は、プログラミング言語が組み込みサポートを提供するデータ型です。
ほとんどのプログラミング言語では、すべての基本的なデータ型が組み込まれています。さらに、多くの言語では、一連の複合データ型(Javaの「文字列」型)も提供しています。
このように言いたい-
基本的なデータ型は、さらに分解できないデータ型です(「文字列」型は「char」から作成できますが、charはどのデータ型にも「分解」できません(ほとんどのプログラミングでは言語)。したがって、基本的なデータ型です)
SNOBOL4の文字列型はプリミティブと見なされます。正確な理由はわかりませんが。SNOBOL4に組み込まれているだけでなく、基本的なものでもあります。
Java仕様では、プリミティブ型と見なされるデータ型のリストに明確に言及しています。文字列型は仕様に含まれていないため、組み込み型であるにもかかわらず、Javaのプリミティブデータ型ではありません。
プリミティブは、言語自体が提供する基本的なデータ型です。C言語の例は、int、float、charデータ型です。これは、言語の基本部分として提供されます。
非プリミティブは、ユーザー定義の変数またはオブジェクトです。たとえば、データを保存するオブジェクトを定義したり、Cでstructを使用して独自の変数を定義したりできます。これらは、使用するために最初に定義する必要があるため、プリミティブではありません。
例:従業員、学生、a_very_large_number_that_you_defined_yourself
より多くの説明と編集してコメント に対処するプリミティブは、Newキーワードを使用して宣言する必要があるC ++のStringなどの変数ではなく、元々言語に付属していた変数と考えています。これによりオブジェクトになり、Stringはプリミティブになりません。
あなたのコメントに答えてください:それはおそらく変数の実装に関係しています。言語コアの一部である場合、それは原始的です。そうでない場合はそうではありません。例はC ++の文字列です。これはコア変数ではなく、Newキーワードを使用して宣言されます。したがって、それは原始的ではありません。
string
そのようなデータ型を提供しません。文字列はプリミティブ型の集合体として表されchar
ます。C ++は適切なstring
データ型を導入しましたが、それが「プリミティブ」型であるかどうかは、誰に尋ねるかによって異なります。個人的に、私はそれをそのように分類しません。ただし、おそらく完全にarbitrary意的な理由で、旧式のBASIC文字列型をプリミティブ型として分類します。