スカラーとプリミティブのデータ型-同じですか?


127

私が読んださまざまな記事で、プリミティブデータ型への参照がある場合と、スカラーへの参照がある場合があります。

それぞれについての私の理解は、それらがint、boolean、charなどのような単純なもののデータ型であるということです。

特定の用語を使用する必要がある、または単に交換可能な用語であることを意味する私が欠けているものはありますか?それぞれのウィキペディアのページには何も明らかではありません。

用語が単に互換性がある場合、どちらが好ましいですか?

回答:


203

互換性はないと思います。それらは頻繁に似ていますが、違いは確かに存在し、主にそれらが対照的であり、文脈に関連するものにあるようです。

スカラーは、典型的には、と対比されている化合物はそのようなアレイとして、マップ、セット、構造体などAスカラー「単一」の値である-化合物が複数のスカラー(そしておそらく参考にで構成されている間-整数、ブール、おそらくストリング他の化合物)。「スカラー」は、関連する区別が単一/単純/原子値と複合値の間のコンテキストで使用されます。

ただし、プリミティブ型は、たとえば参照型と対照的であり、Javaのプリミティブ型と参照のように、関連する区別が「これは直接値か、それとも実際の値を含む何かへの参照か」の場合に使用されます。 。私はこれをスカラー/複合よりもいくらか低いレベルの区別として見ていますが、完全ではありません。

それは実際にコンテキストに依存します(そして頻繁にどの言語ファミリが議論されているか)。病理学的な例として、文字列を取り上げます。Cでは、文字列は複合(文字の配列)ですが、Perlでは、文字列はスカラーです。Javaでは、文字列はオブジェクト(または参照型)です。Pythonでは、すべてが(概念的には)文字列(および数値)を含むオブジェクト/参照タイプです。


1
また、参照型とプリミティブ型の説明で「値」型を検討する必要があります。スカラーとプリミティブの同等性については、言語によって異なります。たとえば、PHPマニュアルによると、そのプリミティブ型の半分だけがスカラーです:php.net/manual/en/language.types.intro.php
Joe Bowbeer

11
これは8年後に私を助けました:)
CoderXYZ '25

18

これらの用語には多くの混乱と誤用があります。多くの場合、1つは別の意味で使用されます。これらの用語の実際の意味は次のとおりです。

「ネイティブ」とは、実装方法に関係なく、ライブラリ(標準ライブラリでも)によって提供されるのではなく、言語に組み込まれている型を指します。Perl文字列はPerl言語の一部であるため、Perlにネイティブです。Cは、ライブラリを使用してcharsへのポインタに文字列セマンティクスを提供するため、charへのポインタはネイティブですが、文字列はネイティブではありません。

「アトミック」とは、もはや分解できないタイプを指します。「コンポジット」の逆です。コンポジットは、アトミック値または他のコンポジットの組み合わせに分解できます。ネイティブ整数と浮動小数点数はアトミックです。分数、複素数、コンテナ/コレクション、文字列は複合です。

「スカラー」 -これはほとんどの人を混乱させるものです-サイズ、ボリューム、カウントなど、スケール(したがって名前)を表すことができる値を指します。整数、浮動小数点数、および分数はスカラーです。複素数、ブール値、文字列はスカラーではありません。アトミックなものは必ずしもスカラーではなく、スカラーであるものは必ずしもアトミックではありません。スカラーはネイティブであるか、ライブラリによって提供されます。

いくつかのタイプは奇妙な分類を持っています。BigNumber型は、通常、数字または整数の配列として実装され、スカラーですが、技術的にはアトミックではありません。実装が非表示になっていて、内部コンポーネントにアクセスできない場合、それらはアトミックであるように見えます。しかし、コンポーネントは隠されているだけなので、原子性は幻想です。これらはほとんど常にライブラリで提供されるため、ネイティブではありませんが、ネイティブである可能性があります。たとえば、Mathematicaプログラミング言語では、大きな数がネイティブであり、Mathematicaプログラムがそれらをビルディングブロックに分解する方法がないため、それらはその下でコンポジットであるという事実にもかかわらず、そのコンテキストでもアトミックです。カバー(Mathematica言語の世界にはもういない)

これらの定義は、使用されている言語とは無関係です。


16
このスカラー型の定義は私には最も理にかなっていますが、これは最も一般的に受け入れられているものではないようです。
llaff

1
「スカラー」の明確な定義に感謝します。@lleaffが指摘するように、ほとんどの人はこの特定の意味でそれを使用しないので、使用した方がよいでしょう。
clockworkpc

優れた言語定義。この回答は、より詳細な議論のためにマイケル・エクストランドの回答と一緒に読む必要があります。残念ながら、プログラミング言語のコンテキストでは、スカラーにはさまざまな意味があります。
ジェリー

9

簡単に言えば、「スカラー」タイプは、コンポジットやコレクションではなく、単一のアイテムを参照するように見えます。したがって、スカラーには、プリミティブ値と列挙値などの両方が含まれます。

http://ee.hawaii.edu/~tep/EE160/Book/chap5/section2.1.3.html

おそらく「スカラー」という用語は、Cへの後戻りとなる可能性があります。

スカラーは、単一の値を含み、他のC ++オブジェクトで構成されていないプリミティブオブジェクトです。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0774.pdf

これが「スケール」の値を持つかどうかを知りたいのですが。-数を数えるなど。


2
私は(非常に昔の学校で)この用語が「ベクトルプロセッサ」とは対照的に「スカラープロセッサ」に由来することを教えられました。スカラープロセッサは、一度に1つのデータのみを処理できるCPUです。これらのプロセッサは、算術用語にちなんで名付けられました。興味深いことに、ウィキペディアで「スカラー」を検索すると、「変数」にリダイレクトされます。
2016年

2

Scott Langebergの回答は簡潔で信頼できるリンクに裏付けられているので、私は気に入っています。できればスコットの答えに賛成票を投じます。

「プリミティブ」データタイプをプライマリデータタイプと見なして、セカンダリデータタイプをプライマリデータタイプから派生させることができると思います。派生は、C ++構造体などの組み合わせによるものです。構造体を使用して、データ型(およびintとcharなど)を組み合わせて、2次データ型を取得できます。構造体定義のデータ型は常にセカンダリデータ型です。主なデータ型は何からも派生したものではなく、プログラミング言語で与えられたものです。

私は、プリミティブがプライマリを意味する命名法であることに類似しています。その平行は「正規表現」です。「レギュラー」という用語は「レギュレート」と理解できると思います。したがって、検索を制御する式があります。

スカラーの語源(http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none)は、はしごのようなものを意味します。これがプログラミングに関係しているのは、ラダーには1つの次元しかありません。ラダーの端からの横線の数です。スカラーデータ型には次元が1つしかないため、単一の値で表されます。

使用法では、プリミティブとスカラーは交換可能だと思います。スカラーではないプリミティブ、またはプリミティブではないスカラーの例はありますか?

プリミティブとは交換可能ですが、他のデータ型の基本的な構成要素であるデータ型を指し、プリミティブは他のデータ型で構成されていません。

スカラーは単一の値を持つことを指します。スカラーは数学的なベクトルと対照的です。(例として1種類のベクトルを使用して)1つの値がベクトルの方向を表すために必要であり、別の値がベクトルの大きさを表すために必要であるため、ベクトルは単一の値によって表されません。

参照リンク: http ://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type


0

Cでは、列挙型、文字、および整数のさまざまな表現により、スカラー型と呼ばれるより一般的な型クラスが形成されます。したがって、任意のスカラー型の値に対して実行できる演算は、整数の場合と同じです。


0

null型は、「スカラー型」の定義に最も現実的に適合する唯一のものです。「N」を「N」としてシリアル化することもできます。伝統的にスカラーである16ビットワード(または複数の可能な値を持つ単一ビット)に適合することは、「単一のデータ」ではありません。

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