Что подразумевается под примитивным типом данных?

42

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

Это тип данных, предоставляемый языком неявно (другие - определяемые пользователем классы)

Таким образом, разные языки имеют разные наборы типов данных, которые считаются примитивными для этого конкретного языка. Это правильно?

И в чем разница между «базовым типом данных» и «встроенным типом данных». Википедия говорит, что примитивный тип данных является одним из двух.

PS - Почему «строковый» тип рассматривается как примитивный тип в SNOBOL4, а не в Java?

jsp99
источник

Ответы:

34

Это зависит от языка.

Например, в таких языках , как C и C ++, у вас есть несколько встроенных скалярные типы - int, float, double, charи т.д. Они являются «примитивными» в том смысле , что они не могут быть разложены на более простые компоненты. Из этих основных типов вы можете определить новые типы - типы указателей, типы массивов, типы структур, типы объединения и т. Д.

Тогда у вас есть язык наподобие старой школы Lisp, где все является либо атомом, либо списком . Опять же, согласно приведенному выше определению, атом является «примитивным» в том смысле, что он не может быть разложен в нечто более простое.

редактировать

Насколько мне известно, термины «примитив», «базовый» и «встроенный» в значительной степени взаимозаменяемы. Однако, если вы хотите стать действительно педантичным, вы можете различать «встроенные» типы (те, которые явно определены в определении языка) и типы, полученные из встроенных типов, которые все еще являются «примитивными» или «базовыми». в том, что они не могут быть разложены на более простые элементы. Кассиопеянеtypedefсредство позволяет создавать новые имена типов для существующих типов. Ада позволяет вам создавать новые скалярные типы, которые имеют ограничения на них. Например, вы можете получить тип Latitude из встроенного плавающего типа с ограничением, которое не может принимать значения за пределами диапазона [-90.0, 90.0]. Это все еще примитивный или базовый тип в том смысле, что его нельзя разбить на более простые компоненты, но, поскольку он определяется пользователем, он не считается «встроенным» типом.

Опять же, эти понятия немного размыты, и это действительно зависит от контекста. Например, понятие «встроенный» тип не имеет смысла для такого типа языка, как BLISS.

Джон Боде
источник
В чем разница между основными и встроенными типами данных?
jsp99
1
Является ли "строка" примитивным типом данных в 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. Все остальное не является примитивным типом.

Jesper
источник
Таким образом, тип данных String не является примитивным в Java. В каждой программе Java main () мы пишем «public static void main (String args [])». Зачем? Почему мы всегда должны передавать аргумент String в main? Также нам никогда не нужно импортировать тип String в Java так, как мы включаем его в C / C ++ (например, #include <string> или используя std :: string). Пожалуйста, объясни.
Maxood
7
@Maxood String делает имеет особый статус в языке (он получает литералы, это в подписи main, там интернатуру , которую я предполагаю , это явно разрешен JLS, он доступен автомагический и т.д.) , но это не примитивный типа данных. Можно было бы назвать это встроенным .
@Jesper Почему примитивные типы работают быстрее? Просто из-за того, что у них нет дополнительной упаковки, которую делают не примитивы? Я пытаюсь выяснить разницу между примитивами и не примитивами ... как примитивы встроены в процессор или что-то?
Абдул
Из Википедии: «В зависимости от языка и его реализации, примитивные типы данных могут иметь или не иметь однозначное соответствие с объектами в памяти компьютера. Однако обычно ожидается, что операции с основными примитивными типами данных будут самыми быстрыми языками. конструкции есть. " --- Таким образом, это соответствие 1-к-1 является основной причиной того, что оно быстрее, тогда как с объектами оно не 1-к-1. Я прав?
Абдул
1
@Abdul не делай это слишком сложным. ЦП имеет несколько регистров, которые могут содержать различные виды примитивных значений (например, 32-разрядное или 64-разрядное целое число или число с плавающей запятой одинарной или двойной точности), а в ЦПУ есть инструкции, реализованные в аппаратном обеспечении для выполнения операций над значения в регистрах. Ваше последнее замечание по существу верно.
Джеспер
9

Примитив - это базовый тип данных, который не построен из других типов данных. Он может представлять только одно значение. Все примитивы по необходимости являются встроенными типами данных (о них должен знать компилятор), но не все встроенные типы данных являются примитивами.

В некоторых языках компилятор имеет встроенные знания определенных типов, которые построены из других вещей, потому что он должен иметь возможность обрабатывать их особым образом. Примерами могут служить вариант в Delphi и Visual Basic (и эквивалент Boo, «Утка») и класс базовых объектов в большинстве языков OO.

Мейсон Уилер
источник
Спасибо :) Ваш ответ очень информативен, но я не могу ясно понять. Можете привести несколько примеров (возможно, с C / C ++ / Java).
jsp99
@Mason Wheeler Здесь мы используем термин «свободная типизация» и «строгая типизация». Как я слышал, люди говорят, что VB - это свободно типизированный язык, а Java - строго типизированный. Пожалуйста подтвердите.
Maxood
3
@Appy C ++ поставляется с классами для строк, векторов и карт. Они встроены, они поставляются с языком, находятся в определении языка и т. Д. Однако они написаны на C ++ и взяты из стандартной библиотеки. Вы можете написать свой собственный, который ведет себя одинаково. Сравните это с int или char. Вы не можете определить свой собственный символ в C ++. Вы можете перегрузить каждый оператор в классе и получить что-то похожее, но не идентичное. Это примитив. В основном что-то определено в языке, который не может быть реализован на этом языке.
Stonemetal
5

Почему «строковый» тип рассматривается как примитивный тип в SNOBOL4, а не в Java?

Поскольку спецификация языка Java очень четко определяет, что означает слово «примитив» в контексте Java, а Java Stringне соответствует этой спецификации, тогда как спецификация языка SNOBOL4 определяет, что означает «примитив» в контексте строки SNOBOL4 и SNOBOL4. соответствует этой спецификации.

Там действительно больше ничего нет. Спецификация соответствующего языка определяет, что означают определенные слова, а что-то либо соответствует этому описанию, либо нет. Например, спецификация языка C определяет значение слова «функция» как нечто, совершенно не то, что обычно означает слово «функция», но именно так слово используется в сообществе C.

Йорг Миттаг
источник
@Mittag Основываясь на вашем ответе, я погуглил несколько фраз и наткнулся на очень приятную ссылку, которая почти убирает все сомнения по этой конкретной теме :).
jsp99
0

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

В Java примитивами являются числа (int, long и т. Д.) И char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Если ваша ценность имеет структуру (я думаю о стойках здесь), то это не примитив. Если у него есть методы (объект или класс), это не примитив.

JoshRagem
источник
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) и Lisp (вдохновителем Smalltalk). Позже несколько членов команды разработчиков Objective-C переехали в Sun.
Йорг Миттаг,
0

Я наткнулся на некоторую информацию и почувствовал, что она поможет другим ответам. Итак, хочу поделиться этим -

Википедия говорит -

В информатике примитивный тип данных является одним из следующих:

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

В большинстве языков программирования все основные типы данных являются встроенными. Кроме того, многие языки также предоставляют набор составных типов данных («строковый» тип в Java).

Я хотел бы сказать это так
: базовый тип данных - это тип данных, который не может быть далее разбит (тип "string" может быть сделан из "char", но char не может быть "разбит" на любой тип данных (в большинстве программирования языки). Так что это основной тип данных)

Строковый тип в SNOBOL4 считается примитивным. Хотя я не знаю точную причину. Это как основной, так и встроенный в SNOBOL4.

Спецификация Java четко упоминает список типов данных, которые он считает типом примитива. Поскольку строковый тип не указан в их спецификации , он не является примитивным типом данных в Java, несмотря на то, что он является встроенным типом.

jsp99
источник
-2

Примитивы - это фундаментальные типы данных, предоставляемые самим языком. Примером на языке C являются типы данных int, float, char. Это предоставляется как фундаментальная часть языка.

Не примитивы - это пользовательские переменные или объекты. Например, вы можете определить объект, который хранит данные, или вы можете использовать struct в C, чтобы определить ваши собственные переменные. Они не примитивны, потому что вы должны были сначала определить их, чтобы использовать их.

Примеры: сотрудник, студент, a_very_large_number_that_you_defined_yourself

Отредактируйте с дополнительным объяснением и адресом комментария Я думаю, что примитив - это переменные, которые изначально были в языке, а не переменные, такие как String в C ++, которые вы должны объявить с помощью ключевого слова New. Это делает его объектом, поэтому строка не будет примитивной.

Ответ на ваш комментарий: Это, вероятно, связано с реализацией переменной. Если это было частью языкового ядра, оно примитивно. Если нет, то это не так. Примером является строка в C ++. Это не основная переменная, и она объявляется с использованием ключевого слова New. Так что это не примитивно.

Без имени
источник
Спасибо за ответ . Зависит ли классификация типа данных от «примитивного» от реализации? Как и в C / C ++, мы храним строки как массивы символов. Но нам нужно явно определить их. Так что, если какой-то другой язык имеет такую ​​же реализацию для хранения строки, но предоставляет ее неявно, будет ли тип данных «строка» примитивом в этом конкретном языке?
jsp99
@ Аппи - возможно. C не предоставляет stringтип данных как таковой; Строки представлены как агрегаты примитивного типа char. C ++ ввел правильный stringтип данных, но будет ли он сам по себе «примитивным», зависит от того, кого вы спрашиваете. Лично я бы не классифицировал это как таковое. Однако я бы классифицировал тип строки BASIC старой школы как примитивный тип по причинам, которые, вероятно, являются совершенно произвольными.
Джон Боде
Адресовал ваш комментарий в самом вопросе. Плз см редактировать.
Noname
2
строки в C ++ не нужно создавать с новой
jk.
@jk Я не общался с C ++. Вы правы. Исправлю ответ.
Noname
-2

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

Если вы понимаете концепцию выбора лексем в качестве токенов , вы поймете, что примитивы - это единственные типы данных, которые компилятор знает сам по себе.

Amit
источник