プリミティブデータ型とはどういう意味ですか?


42

プリミティブデータ型の私の理解は

暗黙的に言語によって提供されるデータ型です(その他はユーザー定義のクラスです)

そのため、言語ごとに異なるデータ型のセットがあり、特定の言語のプリミティブと見なされます。そうですか?

「基本データ型」と「組み込みデータ型」の違いは何ですか。ウィキペディアによると、プリミティブデータ型は2つのうちのいずれかです。

PS-なぜ "string"型は、JavaではなくSNOBOL4でプリミティブ型と見なされるのですか?

回答:


34

言語に依存します。

たとえば、CおよびC ++のような言語では、あなたは組み込みのスカラー型の数を持っている- 、intfloatdoublecharなどが挙げられる。これらは、彼らがより単純な成分に分解することができないという意味で「原始的」です。これらの基本型から、ポインタ型、配列型、構造体型、共用体型などの新しい型を定義できます。

次に、古い学校のLispのような言語があり、すべてがアトムまたはリストのいずれかです。繰り返しますが、上記の定義では、原子はより単純なものに分解できないという意味で「プリミティブ」です。

編集

私の知る限り、「プリミティブ」、「基本」、および「組み込み」という用語はほとんど同じ意味です。しかし、本当につまらないものにしたい場合は、「組み込み」(言語定義によって明示的に提供される)型と、「プリミティブ」または「基本」のままの組み込み型から派生した型を区別できます。単純な要素に分解できないという点で。Cのtypedefこの機能を使用すると、既存のタイプの新しいタイプ名を作成できます。Adaでは、制約が設定された新しいスカラー型を作成できます。たとえば、範囲[-90.0、90.0]以外の値をとることができないという制約を使用して、組み込みの浮動小数点型からLatitude型を派生できます。単純なコンポーネントに分解できないという点で、プリミティブ型または基本型ですが、ユーザー定義であるため、「組み込み」型とは見なされません。

繰り返しますが、これらの概念は少しあいまいであり、実際にはコンテキストに依存します。たとえば、「組み込み」型の概念は、BLISSのような型のない言語では意味がありません。


基本データ型と組み込みデータ型の違いは何ですか?
jsp99

1
「文字列」はJavaのプリミティブデータ型ですか?(ジェスパーの答えに対するデルナンのコメントを見ました)。あなたのコメントの1つで、「原始的なタイプはあなたが尋ねる人に依存するかどうか」と言ったので、私はあなたの意見を知りたいです。
jsp99

@Appy-編集を参照してください。
ジョンボード

3
Javaの@Appy Stringは複合型であるため、プリミティブではありません。Stringクラスのソースコード(JDKフォルダーのsrc.zip)を見ると、内部的にStringは文字の配列として表されています。したがって、文字列を個々の文字に分解できます。あなたは作るより小さな値に変換する文字に分解することはできませんcharプリミティブ型とString複合タイプを。
ヤチェクプルシア

2
@Appyあなたはポイントを逃しています。SNOBOL4文字列は分解できません。Java文字列はできます。それが違いです。両方とも組み込まれていますが、SNOBOL4ストリングのみがプリミティブです。
リグ

19

以下からのJavaの視点:

Javaでは、プリミティブ型と非プリミティブ型は非常に明確に区別されます。

プリミティブ型の変数には、その型の値が直接含まれます(つまり、値型です)。

非プリミティブ型の変数には値が直接含まれていません。代わりに、オブジェクトへの参照(ポインターに類似)です。(Javaでは、ユーザー定義の値型を作成することはできません)。

:Javaは、8種類の基本型を持っているbyteshortintlongcharbooleanfloatdouble。それ以外は非プリミティブ型です。


そのため、JavaではStringデータ型は非プリミティブです。すべてのJava main()プログラムでは、「public static void main(String args [])」と記述します。どうして?mainで常にString引数を渡さなければならないのはなぜですか?また、JavaでString型をC / C ++にインクルードする方法でインポートする必要はありません(例:#include <string>またはstd :: stringを使用)。説明してください。
Maxood

7
@MaxoodにString 言語の特別なステータスがあります(リテラルを取得し、の署名にありmain、JLSによって明示的に許可されていると推測されるインターンがあり、自動的に使用可能など)、それはプリミティブデータ型ではありません。組み込みと呼ぶかもしれません。

@Jesperなぜプリミティブ型を扱うのが速いのですか?単純に、非プリミティブが持つ余分なラッピングがないという事実だけのために?私はプリミティブと非プリミティブの違いを理解しようとしています...プリミティブはCPUなどに組み込まれていますか?
アブドゥル

ウィキペディアから:「言語とその実装に応じて、プリミティブデータ型はコンピューターのメモリ内のオブジェクトと1対1で対応する場合としない場合があります。ただし、通常、基本的なプリミティブデータ型に対する操作はコンストラクトがあります。」---したがって、この1対1の対応は、オブジェクトの場合は1対1ではないのに対し、高速化の根本的な原因です。私は正しいですか?
アブドゥル

1
@Abdulは複雑になりすぎません。CPUには多数のレジスタがあり、さまざまな種類のプリミティブ値(32ビットまたは64ビットの整数、単精度または倍精度の浮動小数点数など)を含めることができ、CPUにはハードウェアに実装された命令を実行します。レジスタの値。最後の発言は本質的に正しいです。
ジェスパー

9

プリミティブは、他のデータ型から構築されていない基本的なデータ型です。1つの値のみを表すことができます。すべてのプリミティブは必然的に組み込みデータ型です(コンパイラはそれらについて知る必要があります)が、すべての組み込みデータ型がプリミティブではありません。

一部の言語では、コンパイラーは特定のタイプの知識を組み込みますが、それは他のものから構築されます。これは、コンパイラーが特別な方法でそれらを処理できる必要があるためです。例は、DelphiおよびVisual BasicのVariant(およびBooの同等の "Duck")や、ほとんどのOO言語の基本オブジェクトクラスです。


ありがとう:)あなたの答えは非常に有益ですが、私は明確に理解することができません。CAにいくつかの例を示します(おそらくC / C ++ / Javaを使用)。
jsp99

@Mason Wheelerここで、緩い型付けと強い型付けという用語を使用します。私は、VBは緩やかに型付けされた言語であり、Javaは強く型付けされた言語であると人々が言っ​​ているのを聞きました。確認してください。
Maxood

3
@Appy C ++には、文字列、ベクター、およびマップのクラスが付属しています。これらは組み込みであり、言語に付属しており、言語定義などにあります。ただし、C ++で記述されており、標準ライブラリから提供されています。同じように動作する独自のものを書くことができます。これをintまたはcharと比較してください。C ++で独自の文字を定義することはできません。クラスのすべての演算子をオーバーロードし、同様に動作するが同一ではないものを取得できます。これはプリミティブです。基本的に、その言語で実装できない言語で定義されたもの。
stonemetal

5

JavaではなくSNOBOL4で「文字列」型がプリミティブ型と見なされるのはなぜですか?

Java言語仕様はJavaのコンテキストで「プリミティブ」という言葉の意味を非常に明確に規定しており、Java Stringがこの仕様に準拠していないため、SNOBOL4言語仕様はSNOBOL4およびSNOBOL4の文字列のコンテキストで「プリミティブ」の意味を定義しているためその仕様に準拠しています。

本当にそれ以上何もありません。それぞれの言語の仕様は、特定の単語が何を意味するかを定義し、何かがその説明に適合するかそうでないかのどちらかです。たとえば、C言語仕様では、「関数」という言葉の意味を、「関数」という言葉が通常意味するものとは明らかに異なるものと定義していますが、それがCコミュニティ内での使用方法です。


@Mittagあなたの答えに基づいて、私はいくつかのフレーズをグーグルで検索し、この特定のトピックに関するすべての疑問をほぼクリアする非常に素晴らしいリンクに出会いました:)。
jsp99

0

「プリミティブ」データ型は、メモリに値が保存されていることを意味します。この値にはメソッドや内部構造はありません。プリミティブは、外部操作によってのみ操作できます。

Javaでは、プリミティブは数字(int、longなど)とcharです。http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

値に構造がある場合(ここではストラットについて考えています)、それはプリミティブではありません。メソッド(オブジェクトまたはクラス)がある場合、プリミティブではありません。


2
C#のプリミティブintデータ型にメソッドがあります
...-Heinzi

例を挙げていただけますか?
JoshRagem

var myString = 3.ToString();Int32.ToString()を参照)。そのノートintC#にある同義語のためにInt32、すなわち、Int32 である(Javaのとは異なり、プリミティブ型Integerとは異なりますint)。したがって、3.ToString()C#ではボクシング必要ありませ
ハインジ

それは非常に興味深いです。あなたが提供したリンクは、「int」が実際には「Int32」クラス(またはプリミティブクラスとラッパークラスの組み合わせ)のオブジェクトであることを示しているため、定義では「int」はプリミティブではありません。:)
JoshRagem

1
@barlop:JavaはC ++から派生したものではありません。ハーバートシルトがそのような単純な事実を真っ直ぐに理解することさえできないなら、私も本の残りを信頼するかどうか確信が持てません。JavaのオリジナルデザイナーであるPatrick Naughtonは、Objective-Cの大ファンでした。実際、Scott McNealyがSunに留まり、新しい言語を設計するように説得したとき、彼はNeXTでObjective-Cに取り組むことをすでに通知していました。他のオリジナルデザイナーであるジェームズゴスリングは、Smalltalk(Objective-Cの直接の祖先)とLisp(Smalltalkのインスピレーション)に精通していました。後に、Objective-C設計チームの数人のメンバーがSunに移りました。
ヨルグWミットタグ14

0

私はいくつかの情報に出会い、それが他の答えを助けると感じました。それを共有したい-

ウィキペディアによると-

コンピューターサイエンスでは、プリミティブデータ型は次のいずれかです。

基本型は、プログラミング言語によって基本的な構成要素として提供されるデータ型です。ほとんどの言語では、より複雑な複合型を基本型から再帰的に構築できます。
組み込み型は、プログラミング言語が組み込みサポートを提供するデータ型です。

ほとんどのプログラミング言語では、すべての基本的なデータ型が組み込まれています。さらに、多くの言語では、一連の複合データ型(Javaの「文字列」型)も提供しています。

このように言いたい-
基本的なデータ型は、さらに分解できないデータ型です(「文字列」型は「char」から作成できますが、charはどのデータ型にも「分解」できません(ほとんどのプログラミングでは言語)。したがって、基本的なデータ型です)

SNOBOL4の文字列型はプリミティブと見なされます。正確な理由はわかりませんが。SNOBOL4に組み込まれているだけでなく、基本的なものでもあります。

Java仕様では、プリミティブ型と見なされるデータ型のリストに明確に言及しています。文字列型は仕様に含まれていないため、組み込み型であるにもかかわらず、Javaのプリミティブデータ型ではありません。


-2

プリミティブは、言語自体が提供する基本的なデータ型です。C言語の例は、int、float、charデータ型です。これは、言語の基本部分として提供されます。

非プリミティブは、ユーザー定義の変数またはオブジェクトです。たとえば、データを保存するオブジェクトを定義したり、Cでstructを使用して独自の変数を定義したりできます。これらは、使用するために最初に定義する必要があるため、プリミティブではありません。

例:従業員、学生、a_very_large_number_that_you_defined_yourself

より多くの説明と編集してコメント対処するプリミティブは、Newキーワードを使用して宣言する必要があるC ++のStringなどの変数ではなく、元々言語に付属していた変数と考えています。これによりオブジェクトになり、Stringはプリミティブになりません。

あなたのコメントに答えてください:それはおそらく変数の実装に関係しています。言語コアの一部である場合、それは原始的です。そうでない場合はそうではありません。例はC ++の文字列です。これはコア変数ではなく、Newキーワードを使用して宣言されます。したがって、それは原始的ではありません。


答えてくれてありがとう。「プリミティブ」としてのデータ型の分類は実装に依存しますか?C / C ++と同様に、文字列をchar配列として保存しますが、明示的に定義する必要があります。それで、他の言語が文字列を格納するために同じ実装を持っているが、暗黙的にそれを提供する場合、データ型「文字列」はその特定の言語のプリミティブになりますか?
-jsp99

@Appy-おそらく。Cはstringそのようなデータ型を提供しません。文字列はプリミティブ型の集合体として表されcharます。C ++は適切なstringデータ型を導入しましたが、それが「プリミティブ」型であるかどうかは、誰に尋ねるかによって異なります。個人的に、私はそれをそのように分類しません。ただし、おそらく完全にarbitrary意的な理由で、旧式のBASIC文字列型をプリミティブ型として分類します。
ジョンボード

質問自体のコメントに対処しました。編集を参照してください。
ノーネーム

2
Cの文字列は、++ newで作成する必要はありません
JK。

@jk私はC ++には触れていませんでした。あなたが正しいです。ansを修正します。
ノーネーム

-2

プリミティブ型とユーザー定義のデータ型の概念をよりよく理解するために、他の答えに欠けているのはの概念だけですcompiler

トークンとして選択される語彙素の概念を理解すれば、コンパイラーがそれ自体で知っている唯一のデータ型がプリミティブであることがわかります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.