Що розуміється під примітивним типом даних?


42

Я розумію примітивний тип даних

Це тип даних, що надається мовою неявно (Інші класи визначені користувачем)

Тож різні мови мають різні набори типів даних, які вважаються примітивними для даної мови. Це так?

І в чому різниця між "базовим типом даних" і "вбудованим типом даних". Вікіпедія говорить, що примітивний тип даних є будь-яким із двох.

PS - Чому тип "string" розглядається як примітивний тип у SNOBOL4, а не в Java?

Відповіді:


34

Це залежить від мови.

Наприклад, в таких мовах , як C і C ++, у вас є кілька вбудованих скалярні типи - int, float, double, charі т.д. Вони є «примітивними» в тому сенсі , що вони не можуть бути розкладені на більш прості компоненти. З цих основних типів можна визначити нові типи - типи вказівників, типи масивів, типи структур, типи об'єднання тощо.

Тоді у вас є така мова, як у старошкільної Ліспи, де все або атом, або список . Знову ж таки, за вищенаведеним визначенням, атом є "примітивним" в тому сенсі, що його не можна розкласти на щось простіше.

Редагувати

Що стосується мене, терміни "примітивний", "базовий" та "вбудований" в значній мірі взаємозамінні. Якщо ви хочете отримати дійсно педантичний характер, ви можете розрізняти типи "вбудованих" (тих, які явно передбачені мовним визначенням), і типів, похідних від вбудованих типів, які все ще є "примітивними" або "базовими" тим, що їх не можна розкласти на простіші елементи. C'stypedefЗасіб дозволяє створювати нові імена типів для існуючих типів. Ада дозволяє створювати нові скалярні типи, які мають для них обмеження. Наприклад, ви можете отримати тип Latitude із вбудованого плаваючого типу з тим обмеженням, що він не може приймати значення поза діапазоном [-90.0, 90.0]. Це все-таки примітивний або базовий тип, оскільки його неможливо розділити на більш прості компоненти, але оскільки він визначений користувачем, він не вважається "вбудованим" типом.

Знову ж таки, ці поняття трохи нечіткі, і це дійсно залежить від контексту. Наприклад, поняття "вбудований" тип є безглуздим для такої безмовної мови, як BLISS.


в чому різниця між базовими та вбудованими в типи даних?
jsp99

1
Чи "string" примітивний тип даних на Java ?? (Я бачив коментар Делнан до відповіді Джеспера). Я хочу знати вашу думку, тому що в одному зі своїх коментарів ви сказали, "залежно від того, кого ви запитуєте, залежить, примітивний тип чи ні".
jsp99

@Appy - див. Редагування.
Джон Боде

3
@Appy String на Java не примітивний, оскільки це складний тип. Якщо ви подивитесь на вихідний код класу String (src.zip у папці JDK), ви побачите, що внутрішньо String представлений як масив символів. Таким чином, ви можете розкласти String на окремих символів. Ви не можете розкласти характер на менші значення, що робить charпримітивний тип і Stringскладний тип.
Яцек Прусія

2
@Appy Ви не вистачаєте точки. SNOBOL4 рядки не можна розкласти. Струни Java можуть. У цьому різниця. Обидва вбудовані, але лише рядки SNOBOL4 є примітивними.
Риг

19

З точки зору Java :

У Java дуже чітке розмежування примітивних та непримітивних типів.

Змінна примітивного типу безпосередньо містить значення цього типу (іншими словами, вони є значеннями типів ).

Змінна непомітного типу не містить значення безпосередньо; натомість це посилання (подібно до вказівника) на об’єкт. (У Java неможливо створити визначені користувачем типи значень).

Java має вісім примітивних типів: byte, short, int, long, char, boolean, floatі double. Все інше - непомітивний тип.


Таким чином, тип даних String не є примітивним на Java. У кожній програмі Java main () ми пишемо "public static void main (String args [])". Чому? Чому нам завжди доводиться передавати аргумент String в основному? Також нам ніколи не потрібно імпортувати тип String в Java так, як ми їх включаємо в C / C ++ (наприклад, #include <string> або використовуючи std :: string). Будь ласка, поясніть.
Maxood

7
@Maxood String робить має особливий статус в мові (він отримує літерали, це в підпису main, там інтернатуру , яку я припускаю , це явно дозволено JLS, він доступний автомагіческій і т.д.) , але це не примітивний типу даних. Можна назвати це вбудованим .

@Jesper Чому з примітивними типами швидше працювати? Просто через те, що у них немає зайвих обгорткових непомітивів? Я намагаюся з'ясувати різницю між примітивом і непримітивом ... як це примітиви, вбудовані в процесор чи щось таке?
Абдул

З Вікіпедії: "Залежно від мови та її реалізації, примітивні типи даних можуть мати або не мати індивідуального листування з об'єктами в пам'яті комп'ютера. Однак, як правило, очікується, що операції з основними примітивними типами даних будуть найшвидшою мовою конструкції є ". --- Отже, ця відповідність 1 на 1 є першопричиною того, що вона швидша, тоді як для об'єктів це не 1-до-1. Я прав?
Абдул

1
@ Abdul не робити це занадто складно. ЦП має ряд регістрів, які можуть містити різні види примітивних значень (наприклад, 32-бітове або 64-бітове ціле число або номер однієї чи подвійної точності з плаваючою точкою), і ЦП має вбудовані інструкції в апаратному забезпеченні для виконання операцій над значення в регістрах. Ваше останнє зауваження по суті правильне.
Jesper

9

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

У деяких мовах компілятор має вбудовані знання про певні типи, які будуються з інших речей, тому що він повинен мати можливість поводитися з ними особливим чином. Прикладами можуть бути варіант у Delphi та Visual Basic (і еквівалент Boo, "Duck") та базовий клас об'єктів у більшості мов OO.


Дякую :) Ваша відповідь дуже інформативна, але я не в змозі зрозуміти однозначно. Якщо ви наводите кілька прикладів (можливо, з C / C ++ / Java).
jsp99

@Mason Wheeler Тут ми вживаємо термін «вільне введення тексту» та сильне введення тексту. Як я чув, як люди говорять, що VB - це мова з типовим набором текстів, а Java - сильно набраною. Будь-ласка підтвердіть.
Maxood

3
@Appy C ++ поставляється з класами для рядків, векторів та карт. Вони вбудовані, вони входять з мовою, містяться у мовному визначенні тощо. Однак вони написані на C ++, вони надходять із стандартної бібліотеки. Ви можете написати своє, що поводиться однаково. Порівняйте це з int або char. Ви не можете визначити свій власний знак в C ++. Ви можете перевантажувати кожного оператора класу і отримувати щось, що поводиться аналогічно, але не однаково. Це примітив. В основному щось визначене в мові, яка не реалізована на цій мові.
каменеметал

5

Чому тип "string" розглядається як примітивний тип у SNOBOL4, а не в Java?

Оскільки специфікація мови Java дуже чітко визначає, що означає слово "примітивний" у контексті Java, а Java Stringне відповідає цій специфікації, тоді як специфікація мови SNOBOL4 визначає, що означає "примітивний" у контексті SNOBOL4 та рядка SNOBOL4 відповідає цій специфікації.

Тут насправді нічого більше немає. Специфікація відповідної мови визначає, що означають певні слова, а щось або відповідає цьому опису, чи ні. Наприклад, специфікація мови C визначає значення слова "функція" як те, що дуже чітко не є тим, що зазвичай означає слово "функція", але саме таким чином слово використовується всередині спільноти C.


@Mittag Виходячи з вашої відповіді, я гуглив декілька фраз і натрапив на дуже приємне посилання, яке майже знімає всі сумніви з цієї конкретної теми :).
jsp99

0

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

На Яві примітиви - це числа (int, long тощо) та char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Якщо ваше значення має структуру (я тут думаю про стійки), то це не примітив. Якщо у нього є методи (об’єкт або клас), це не примітив.


2
Примітивний С # intтипу даних робить є методи ...
Heinzi

Чи можете ви навести приклад?
JoshRagem

var myString = 3.ToString();(див. Int32.ToString () ). Зверніть увагу , що intв C # є синонімом для Int32, тобто, Int32 це примітивний тип ( в відміну від Java, де Integerвідрізняється від int). Таким чином, 3.ToString()в C # не бере участь бокс!
Хайнзі

Це дуже цікаво; надане вами посилання вказує, що "int" - це дійсно об'єкт класу "Int32" (або, можливо, комбінація класу примітиву та обгортки), тож за визначенням, яке я ставлю: "int" не є примітивом. :)
JoshRagem

1
@barlop: Java не походить із C ++. Якщо Герберт Шильдт навіть не зможе зрозуміти такий простий факт, я не впевнений, що я б і довірився іншій книзі. Патрік Наутон, оригінальний дизайнер Java, був величезним шанувальником Objective-C. Насправді він уже повідомляв про роботу над Objective-C на NeXT, коли Скотт Мак-нілі переконував його залишитися в Sun і створити нову мову. Джеймс Гослінг, інший оригінальний дизайнер, був дуже знайомий з Smalltalk (прямим предком Objective-C) та Ліспом (натхненням для Smalltalk). Пізніше кілька членів дизайнерської команди Objective-C переїхали до Sun.
Йорг W Міттаг

0

Я натрапив на деяку інформацію і вважав, що це допоможе іншим відповідям. Тож хочете поділитися цим -

У Вікіпедії сказано -

У інформатиці примітивний тип даних є одним із таких:

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

У більшості мов програмування вбудовані всі основні типи даних. Крім того, багато мов також надають набір складених типів даних (тип "string" на Java).

Я хотів би сказати це так -
базовий тип даних - це тип даних, який не можна далі розбити (тип "string" можна зробити з "char", але char не може бути "розбитий" на будь-який тип даних (у більшості програмування мови). Отже, це базовий тип даних)

Тип рядка в SNOBOL4 вважається примітивним. Хоча я не знаю точної причини, чому. Це як базовий, так і вбудований в SNOBOL4.

Специфікація Java чітко зазначає перелік типів даних, які він вважає примітивними. Оскільки тип рядка не є в їх специфікації , це не примітивний тип даних на Java, незважаючи на те, що він є вбудованим типом.


-2

Примітиви - це основні типи даних, які надає сама мова. Прикладом мови C є типи даних int, float, char. Він подається як основна частина мови.

Непримітивні - це визначені користувачем змінні або об'єкти. Наприклад, ви можете визначити об'єкт, який зберігає дані, або ви можете використовувати структура в C для визначення ваших власних змінних. Вони не примітивні, тому що вам потрібно було їх визначити спочатку, щоб їх використовувати.

Приклади: працівник, студент, a_very_large_number_that_you_defined_yourself

Редагування з додатковими поясненнями та зверненням до коментаря Я вважаю примітивом змінними, які спочатку були мовою, а не змінними, такими як String in C ++, які потрібно оголосити за допомогою нового ключового слова. Це робить його об'єктом, щоб String не був примітивом.

Відповідь на ваш коментар: Це, ймовірно, пов'язане з реалізацією змінної. Якщо воно було частиною мовного ядра, воно примітивне. Якщо ні, це не так. Приклад - рядок у C ++. Це не є основною змінною і оголошується за допомогою нового ключового слова. Так це не примітивно.


Дякую за відповідь. Чи залежить класифікація типу даних як "примітивна" від реалізації? Як і в C / C ++, ми зберігаємо рядки як масиви char. Але нам потрібно їх чітко визначити. Отже, якщо якась інша мова має ту саму реалізацію для зберігання рядка, але надає її неявно, чи буде тип даних "рядок" примітивним саме для цієї мови?
jsp99

@Appy - можливо. C не забезпечує stringтип даних як такий; рядки представлені у вигляді сукупностей примітивного типу char. C ++ запровадив належний stringтип даних, але залежно від того, кого ви запитуєте, залежить від того, чи є це "примітивним" типом. Особисто я б не класифікував це як таке. Однак я б класифікував тип рядка в основному типу BASIC як примітивний тип з причин, ймовірно, абсолютно довільних.
Джон Боде

Адресував ваш коментар у самому питанні. Plz див. Редагувати.
Ім'я

2
рядки в C ++ не потрібно створювати за допомогою new
jk.

@jk Я не мав зв'язку з C ++. Ти правий. Виправить анс.
Ім'я

-2

Для кращого розуміння поняття примітивних типів та визначених користувачем типів даних все, на що не відповідають інші відповіді, - це концепція compiler.

Якщо ви зрозумієте поняття лексеми, що вибирається як лексеми , ви дізнаєтесь, що примітиви - це єдині типи даних, які компілятор знає сам.

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