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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

Проще говоря, казалось бы, что "скалярный" тип относится к одному элементу, а не к композиту или коллекции. Таким образом, скаляры включают как примитивные значения, так и такие вещи, как значение enum.

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

Возможно, "скалярный" термин может быть возвратом к C:

где скаляры являются примитивными объектами, которые содержат одно значение и не состоят из других объектов С++

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

Мне интересно, относится ли это к тому, будут ли эти предметы иметь значение "масштаб"? - Такие, как подсчет чисел.

Ответ 4

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

Я полагаю, что "примитивный" тип данных можно рассматривать как первичный тип данных, так что вторичные типы данных получаются из первичных типов данных. Вывод осуществляется путем объединения, например структуры С++. Структуру можно использовать для объединения типов данных (таких как int и a 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

Ответ 5

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

Ответ 6

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