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


127

У різних прочитаних нами статтях іноді є посилання на примітивні типи даних, а іноді є посилання на скаляри.

Я розумію кожен із них, що це типи даних чогось простого, наприклад, int, boolean, char тощо.

Щось мені не вистачає, що означає, що ви повинні використовувати певну термінологію або терміни просто взаємозамінні? Сторінки Вікіпедії для кожної не показують нічого очевидного.

Якщо умови просто взаємозамінні, що є кращим?

Відповіді:


203

Я не думаю, що вони взаємозамінні. Вони часто схожі, але різниця існує, і, здається, в основному полягає в тому, що їм протиставлено і що має значення в контексті.

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

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

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


1
Також слід враховувати при обговоренні референтних типів, а примітивні типи - це "ціннісні" типи. Що стосується еквівалентності скалярів та примітивів, то це залежить від мови. Відповідно до посібника PHP, наприклад, лише половина його примітивних типів є скалярами: php.net/manual/en/language.types.intro.php
Джо Боубір

11
Це допомогло мені через 8 років :)
CoderXYZ

18

Існує багато плутанини та неправильного використання цих термінів. Часто один використовується для означання іншого. Ось що насправді означають ці терміни.

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

"Атомний" відноситься до типу, який вже не можна розкласти. Це протилежність "композиту" . Композити можна розкласти на комбінацію атомних значень або інших композитів. Рідні цілі числа та числа з плаваючою комою є атомними. Дроби, складні числа, контейнери / колекції та рядки є складовими.

"Скаляр" - і це те, що бентежить більшість людей - відноситься до значень, які можуть виражати масштаб (звідси і назва), наприклад, розмір, об'єм, кількість тощо. Цілі, числа з плаваючою комою та дроби - це скаляри. Складні числа, булеві та рядки НЕ є скалами. Те, що є атомним, не обов'язково є скалярним, а те, що є скалярним, не обов'язково є атомним. Скаляри можуть бути власними або надаватися бібліотеками.

Деякі типи мають непарні класифікації. Типи BigNumber, які зазвичай реалізуються як масив цифр або цілих чисел, є скалярами, але технічно вони не атомні. Вони можуть бути атомними, якщо реалізація прихована і ви не можете отримати доступ до внутрішніх компонентів. Але компоненти лише приховані, тому атомність - це ілюзія. Вони майже незмінно надаються в бібліотеках, тому вони не є рідними, але вони можуть бути. Наприклад, в мові програмування Mathematica великі числа є рідними, і оскільки програма Mathematica не може розкласти їх у свої будівельні блоки, вони також є атомними в цьому контексті, незважаючи на те, що вони композити під обкладинки (де ви більше не в світі мови Mathematica).

Ці визначення не залежать від мови, що використовується.


16
Хоча це визначення скалярного типу має для мене найбільш сенс, це, здається, не є найбільш прийнятим.
Лефаф

1
Дякуємо за чітке визначення поняття "Скаляр". Хоча, як зазначає @lleaff, більшість людей не використовують його в цьому конкретному сенсі, було б краще, якби вони.
годинникова робота

Відмінні лінгвістичні визначення. Цю відповідь слід прочитати разом з відповіддю Майкла Екстранда для більш повного обговорення. У контексті мов програмування скаляр має, на жаль, різні значення.
Джеррі

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
Мене навчали (дуже давно в школі), що термін походить від "скалярного процесора" на відміну від "векторного процесора". Скалярний процесор - це процесор, який може обробляти лише одну частину даних одночасно. Ці процесори були / названі за арифметичними термінами. Досить цікаво, коли ви шукаєте "скалярний" у Вікіпедії, ви перенаправляєтесь на "змінну".
Еверт

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


0

У C типи перерахування, символи та різні представлення цілих чисел утворюють більш загальний клас типу, який називають скалярними типами. Отже, операції, які ви можете виконувати на значеннях будь-якого скалярного типу, такі ж, як і для цілих чисел.


0

null type - це єдине, що найбільш реально відповідає визначенню "скалярний тип". Навіть серіалізація "None" як "N." вміщення в 16-бітове слово, яке традиційно скалярне - або навіть один біт, який має кілька можливих значень - не є "єдиними даними".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.