Скалярный и примитивный типы данных - это одно и то же?

128

В различных статьях, которые я читал, иногда встречаются ссылки на примитивные типы данных, а иногда - на скаляры.

Насколько я понимаю, каждый из них является типом данных чего-то простого, например int, boolean, char и т. Д.

Есть ли что-то, что мне не хватает, что означает, что вам следует использовать определенную терминологию, или термины просто взаимозаменяемы? Страницы Википедии по каждому из них не показывают ничего очевидного.

Если термины просто взаимозаменяемы, какой из них предпочтительнее?

Бен Пирсон
источник

Ответы:

205

Я не думаю, что они взаимозаменяемы. Они часто похожи, но разница действительно существует и, кажется, в основном заключается в том, с чем они контрастируют и что уместно в контексте.

Скаляры обычно противопоставляются составным элементам , таким как массивы, карты, множества, структуры и т. Д. Скаляр - это «единственное» значение - целое, логическое, возможно, строка, - в то время как составное соединение состоит из нескольких скаляров (и, возможно, ссылок на другие соединения). «Скалярный» используется в контекстах, где уместно различать одиночные / простые / атомарные значения и составные значения.

Примитивные типы , однако, противопоставляются, например, ссылочным типам , и используются, когда уместным различием является «Является ли это непосредственно значением или это ссылка на что-то, что содержит реальное значение?», Как в Java примитивных типов и ссылок , Я считаю это различием несколько более низкого уровня, чем скаляр / составное, но не совсем.

Это действительно зависит от контекста (и часто, о какой языковой семье идет речь). Возьмем один, возможно, патологический пример: струны. В C строка представляет собой составное соединение (массив символов), а в Perl строка - это скаляр. В Java строка - это объект (или ссылочный тип). В Python все (концептуально) является типом объекта / ссылки, включая строки (и числа).

Майкл Экстранд
источник
1
При обсуждении ссылочных типов и примитивных типов также следует учитывать типы «значений». Что касается эквивалентности скаляров и примитивов, это зависит от языка. Согласно руководству по PHP, например, только половина его примитивных типов - скаляры: php.net/manual/en/language.types.intro.php
Joe Bowbeer
11
Это помогло мне через 8 лет :)
CoderXYZ
19

Есть много путаницы и неправильного использования этих терминов. Часто одно используется для обозначения другого. Вот что на самом деле означают эти термины.

«Родные» относятся к типам, которые встроены в язык, а не предоставляются библиотекой (даже стандартной библиотекой), независимо от того, как они реализованы. Строки Perl являются частью языка Perl, поэтому они являются родными для Perl. C обеспечивает семантику строк по указателям на символы с использованием библиотеки, поэтому указатель на char является родным, а строки - нет.

«Атомарный» относится к типу, который больше не может быть разложен. Это противоположность «композитного» . Композиты можно разложить на комбинацию атомных значений или на другие композиты. Родные целые числа и числа с плавающей запятой являются атомарными. Дроби, комплексные числа, контейнеры / коллекции и строки составны.

«Скаляр» - и это то, что сбивает с толку большинство людей - относится к значениям, которые могут выражать масштаб (отсюда и название), например, размер, объем, количество и т. Д. Целые числа, числа с плавающей запятой и дроби являются скалярами. Комплексные числа, логические значения и строки НЕ являются скалярами. Что-то атомарное не обязательно скалярно, а что-то скалярное не обязательно атомарно. Скаляры могут быть собственными или предоставляться библиотеками.

Некоторые типы имеют странную классификацию. Типы BigNumber, обычно реализованные как массив цифр или целых чисел, являются скалярами, но технически не атомарны. Они могут казаться атомарными, если реализация скрыта и вы не можете получить доступ к внутренним компонентам. Но компоненты только скрыты, поэтому атомарность - иллюзия. Они почти всегда предоставляются в библиотеках, поэтому не являются родными, но могут быть. В языке программирования Mathematica, например, большие числа являются родными, и, поскольку программа Mathematica не может разложить их на их строительные блоки, они также атомарны в этом контексте, несмотря на то, что они являются составными частями в рамках обложки (где вы больше не находитесь в мире языка Mathematica).

Эти определения не зависят от используемого языка.

Клаудио Пувиани
источник
16
Хотя это определение скалярного типа имеет для меня наибольший смысл, оно не кажется наиболее общепринятым.
lleaff
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
Меня учили (очень давно в школе), что этот термин произошел от «скалярного процессора» в отличие от «векторного процессора». Скалярный процессор - это процессор, который может обрабатывать только один фрагмент данных за раз. Эти процессоры были названы в честь арифметических терминов. Достаточно интересно, что когда вы ищете «скаляр» в Википедии, вы перенаправляетесь на «переменную».
Evert
2

Мне нравится ответ Скотта Лангеберга, потому что он краток и подкреплен авторитетными ссылками. Я бы проголосовал за ответ Скотта, если бы мог.

Я полагаю, что «примитивный» тип данных можно рассматривать как первичный тип данных, так что вторичные типы данных являются производными от первичных типов данных. Получение происходит путем комбинирования, например структуры C ++. Структуру можно использовать для объединения типов данных (например, int и char) для получения вторичного типа данных. Тип данных, определяемый структурой, всегда является вторичным типом данных. Первичные типы данных не являются производными от чего-либо, скорее они заданы на языке программирования.

У меня есть параллель с примитивом, когда номенклатура означает первичный. Эта параллель - «регулярное выражение». Я думаю, что номенклатуру «регулярная» можно понимать как «регулирующую». Таким образом, у вас есть выражение, регулирующее поиск.

Скалярная этимология ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) означает подобие лестницы. Я думаю, что это связано с программированием: лестница имеет только одно измерение: сколько ступенек от конца лестницы. Скалярный тип данных имеет только одно измерение, поэтому представлен одним значением.

Я думаю, что в использовании примитив и скаляр взаимозаменяемы. Есть ли какой-нибудь пример примитива, который не является скаляром, или скаляра, который не является примитивом?

Хотя и взаимозаменяемый, примитив относится к типу данных, который является основным строительным блоком для других типов данных, а примитив не состоит из других типов данных.

Скаляр означает, что он имеет одно значение. Скаляр контрастирует с математическим вектором. Вектор не представлен одним значением, потому что (используя один вид вектора в качестве примера) одно значение необходимо для представления направления вектора, а другое значение необходимо для представления величины вектора.

Справочные ссылки: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type

Indinfer
источник
0

В C типы перечисления, символы и различные представления целых чисел образуют более общий класс типов, называемый скалярными типами. Следовательно, операции, которые вы можете выполнять со значениями любого скалярного типа, такие же, как и для целых чисел.

Онкелл Ван
источник
0

нулевой тип - единственное, что наиболее реалистично соответствует определению «скалярного типа». Даже сериализация None как N. вставка в 16-битное слово, которое традиционно является скалярным, или даже в один бит, имеющий несколько возможных значений, не является «отдельными данными».

Commenter
источник
0

Каждый примитив скалярен, но не наоборот. DateTime является скалярным, но не примитивным.

MarkZ
источник