Co oznacza prymitywny typ danych?

42

Tak rozumiem prymitywny typ danych

Jest to typ danych dostarczany przez język pośrednio (inne to klasy zdefiniowane przez użytkownika)

Tak więc różne języki mają różne zestawy typów danych, które są uważane za prymitywne dla tego konkretnego języka. Czy to prawda?

Jaka jest różnica między „podstawowym typem danych” a „wbudowanym typem danych”. Wikipedia twierdzi, że prymitywny typ danych jest jednym z tych dwóch.

PS - Dlaczego typ „string” jest uważany za typ pierwotny w SNOBOL4, a nie w Javie?

jsp99
źródło

Odpowiedzi:

34

To zależy od języka.

Na przykład w językach takich jak C i C ++, masz kilka wbudowanych typów skalarnych - int, float, double, char, itd. Są to „prymitywny” w tym sensie, że nie można rozłożyć na prostsze składniki. Z tych podstawowych typów można zdefiniować nowe typy - typy wskaźników, typy tablic, typy struktur, typy związków itp.

Potem masz taki język jak oldschoolowy Lisp, gdzie wszystko jest albo atomem, albo listą . Ponownie, zgodnie z powyższą definicją, atom jest „prymitywny” w tym sensie, że nie można go rozłożyć na coś prostszego.

Edytować

Jeśli chodzi o mnie, terminy „prymitywne”, „podstawowe” i „wbudowane” są prawie wymienne. Jeśli jednak chcesz być naprawdę pedantyczny, możesz rozróżnić typy „wbudowane” (te wyraźnie podane w definicji języka) od typów pochodnych z typów wbudowanych, które są nadal „prymitywne” lub „podstawowe” przez to, że nie można ich rozłożyć na prostsze elementy. CtypedefFunkcja umożliwia tworzenie nowych nazw typów dla istniejących typów. Ada pozwala tworzyć nowe typy skalarne, które mają ograniczenia. Na przykład można uzyskać typ Latitude z wbudowanego typu zmiennoprzecinkowego, z tym, że nie może on przyjmować wartości spoza zakresu [-90,0, 90,0]. Nadal jest to prymitywny lub podstawowy typ, ponieważ nie można go podzielić na prostsze komponenty, ale ponieważ jest zdefiniowany przez użytkownika, nie jest uważany za typ „wbudowany”.

Ponownie, te pojęcia są trochę niewyraźne i naprawdę zależy od kontekstu. Na przykład pojęcie typu „wbudowanego” jest bez znaczenia dla języka bez typu, takiego jak BLISS.

John Bode
źródło
Jaka jest różnica między podstawowymi i wbudowanymi typami danych?
jsp99
1
Czy „string” to prymitywny typ danych w Javie? (Widziałem komentarz Delnana do odpowiedzi Jespera). Chcę poznać twoją opinię, ponieważ w jednym z twoich komentarzy powiedziałeś „czy prymitywny typ zależy od tego, kogo zapytasz”.
jsp99
@Appy - patrz edycja.
John Bode
3
@Appy Ciąg w Javie nie jest prymitywny, ponieważ jest to typ złożony. Jeśli spojrzysz na kod źródłowy klasy String (src.zip w folderze JDK), zobaczysz, że wewnętrznie String jest reprezentowany jako tablica znaków. Możesz więc rozłożyć ciąg znaków na pojedyncze znaki. Nie można rozłożyć znaku na mniejsze wartości, co czyni chartyp pierwotny i Stringtyp złożony.
Jacek Prucia,
2
@Appy Brakuje Ci sensu. Ciągów SNOBOL4 nie można rozłożyć. Ciągi Java mogą. To różnica. Oba są wbudowane, ale tylko łańcuchy SNOBOL4 są prymitywne.
Rig
19

Z perspektywy Java :

W Javie istnieje bardzo wyraźne rozróżnienie między typami pierwotnymi i nieprymitywnymi.

Zmienna typu pierwotnego zawiera bezpośrednio wartość tego typu (innymi słowy, są to typy wartości ).

Zmienna typu innego niż pierwotny nie zawiera wartości bezpośrednio; zamiast tego jest to odwołanie (podobne do wskaźnika) do obiektu. (W Javie nie można tworzyć typów wartości zdefiniowanych przez użytkownika).

Java ma osiem typów prostych: byte, short, int, long, char, boolean, floati double. Cokolwiek innego jest nieprymitywnym typem.

Jesper
źródło
Zatem typ danych String nie jest pierwotny w Javie. W każdym programie Java main () piszemy „public static void main (String args [])”. Dlaczego? Dlaczego zawsze musimy przekazać argument String w main? Nigdy też nie musimy importować typu String do Java w sposób, w jaki uwzględniamy go w C / C ++ (np. #Include <string> lub używając std :: string). Proszę wytłumacz.
Maxood,
7
@Maxood String ma mieć specjalny status w języku (robi literały, to w podpisaniu main, nie internowania, które jak mniemam jest wyraźnie dozwolone przez JLS, jest ona dostępna automagicznie itp), ale nie jest to prymitywny typ danych. Można to nazwać wbudowanym .
@Jesper Dlaczego typy prymitywne są szybsze w pracy? Po prostu dlatego, że nie mają dodatkowego opakowania, które nie są prymitywne? Próbuję ustalić różnicę między prymitywami a nie-prymitywami ... bo czy prymitywy są wbudowane w procesor?
Abdul,
Z Wikipedii: „W zależności od języka i jego implementacji pierwotne typy danych mogą, ale nie muszą mieć bezpośredniej korespondencji z obiektami w pamięci komputera. Jednak zwykle oczekuje się, że operacje na podstawowych pierwotnych typach danych będą najszybszym językiem istnieją konstrukcje. ” --- Tak więc ta korespondencja 1 do 1 jest główną przyczyną jej szybszego działania, podczas gdy w przypadku obiektów nie jest to relacja 1 do 1. Mam rację?
Abdul,
1
@Abdul nie komplikuj tego zbytnio. Procesor ma wiele rejestrów, które mogą zawierać różne rodzaje prymitywnych wartości (na przykład 32-bitową lub 64-bitową liczbę całkowitą lub liczbę zmiennoprzecinkową o pojedynczej lub podwójnej precyzji), a procesor posiada instrukcje sprzętowe zaimplementowane do wykonywania operacji na wartości w rejestrach. Twoja ostatnia uwaga jest zasadniczo poprawna.
Jesper
9

Prymityw jest podstawowym typem danych, który nie jest zbudowany z innych typów danych. Może reprezentować tylko jedną pojedynczą wartość. Wszystkie prymitywy są wbudowanymi typami danych z konieczności (kompilator musi o nich wiedzieć), ale nie wszystkie wbudowane typy danych są prymitywami.

W niektórych językach kompilator ma wbudowaną wiedzę na temat niektórych typów, które są zbudowane z innych rzeczy, ponieważ musi być w stanie traktować je w specjalny sposób. Przykładami mogą być Wariant w Delphi i Visual Basic (i odpowiednik Boo, „Kaczka”) oraz podstawowa klasa obiektów w większości języków OO.

Mason Wheeler
źródło
Dzięki :) Twoja odpowiedź jest bardzo pouczająca, ale nie jestem w stanie jasno zrozumieć. C Podaj kilka przykładów (prawdopodobnie z C / C ++ / Java).
jsp99
@Mason Wheeler W tym miejscu używamy terminu luźne i mocne pisanie. Jak słyszałem, ludzie mówią, że VB jest językiem luźno pisanym, podczas gdy Java jest silnie pisanym. Proszę potwierdzić.
Maxood,
3
@Appy C ++ jest dostarczany z klasami dla ciągów, wektorów i map. Są one wbudowane, pochodzą z językiem, są w definicji języka itp. Jednak są napisane w C ++, pochodzą ze standardowej biblioteki. Możesz napisać własny, który zachowuje się identycznie. Porównaj to z int lub char. Nie możesz zdefiniować własnego znaku w C ++. Możesz przeciążyć każdego operatora w klasie i uzyskać coś, co zachowuje się podobnie, ale nie identycznie. To jest prymitywne. Zasadniczo coś zdefiniowanego w języku, którego nie można zaimplementować w tym języku.
stonemetal
5

Dlaczego typ „string” jest uważany za typ pierwotny w SNOBOL4, a nie w Javie?

Ponieważ specyfikacja języka Java bardzo wyraźnie określa, co oznacza słowo „prymitywne” w kontekście Javy, a Java Stringnie jest zgodna z tą specyfikacją, podczas gdy specyfikacja języka SNOBOL4 określa, co oznacza „prymitywne” w kontekście ciągu SNOBOL4 i ciągu SNOBOL4 jest zgodny z tą specyfikacją.

Naprawdę nie ma w tym nic więcej. Specyfikacja odpowiedniego języka określa, co oznaczają niektóre słowa i coś albo pasuje do tego opisu, albo nie. Na przykład specyfikacja języka C definiuje znaczenie słowa „funkcja” jako coś, co bardzo wyraźnie nie jest tym, co zwykle oznacza słowo „funkcja”, ale w ten sposób słowo to jest używane w społeczności C.

Jörg W Mittag
źródło
@Mittag W oparciu o twoją odpowiedź przeszukałem kilka wyrażeń i znalazłem bardzo fajny link, który prawie usuwa wszystkie wątpliwości dotyczące tego konkretnego tematu :).
jsp99
0

„Prymitywny” typ danych oznacza, że ​​masz wartość zapisaną w pamięci - ta wartość nie ma metod ani wewnętrznej struktury. Operacja pierwotna może być obsługiwana tylko przez operacje zewnętrzne.

W Javie prymitywami są liczby (int, long itp.) I char. http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Jeśli twoja wartość ma strukturę (mam tu na myśli rozpórki), to nie jest prymitywna. Jeśli ma metody (obiekt lub klasę), nie jest to prymityw.

JoshRagem
źródło
2
C # 's prymitywny inttyp danych nie mają metody ...
Heinzi
Czy możesz podać przykład?
JoshRagem
var myString = 3.ToString();(patrz Int32.ToString () ). Należy zauważyć, że intw C # jest synonimem dla Int32, czyli Int32 jest prymitywny typ (w przeciwieństwie do Javy, gdzie Integerróżni się od int). Zatem 3.ToString()w języku C # nie wymaga boksowania!
Heinzi
To bardzo interesujące; podany przez ciebie link wskazuje, że „int” jest tak naprawdę obiektem klasy „Int32” (a może kombinacją klasy podstawowej i opakowania), więc według definicji, którą umieszczam: „int” nie jest prymitywne. :)
JoshRagem
1
@barlop: Java nie jest potomkiem C ++. Jeśli Herbert Schildt nie potrafi nawet wyjaśnić tak prostego faktu, nie jestem pewien, czy zaufałbym również pozostałej części książki. Patrick Naughton, oryginalny projektant Java, był wielkim fanem Objective-C. W rzeczywistości powiadomił już o pracy nad Objective-C w NeXT, kiedy Scott McNealy przekonał go, by został w Sun i zaprojektował nowy język. James Gosling, inny oryginalny projektant, bardzo dobrze znał Smalltalk (bezpośredni przodek Objective-C) i Lisp (inspiracja dla Smalltalk). Później kilku członków zespołu projektowego Objective-C przeniosło się do firmy Sun.
Jörg W Mittag,
0

Natknąłem się na pewne informacje i uznałem, że to pomoże na inne odpowiedzi. Więc chcę to udostępnić -

Wikipedia mówi -

W informatyce prymitywny typ danych jest jednym z następujących:

Typ podstawowy to typ danych dostarczany przez język programowania jako podstawowy element konstrukcyjny. Większość języków pozwala na rekursywną budowę bardziej skomplikowanych typów kompozytów, zaczynając od typów podstawowych.
Wbudowany typ to typ danych, dla którego język programowania zapewnia wbudowane wsparcie.

W większości języków programowania wszystkie podstawowe typy danych są wbudowane. Ponadto wiele języków udostępnia również zestaw złożonych typów danych (typ „string” w Javie).

Chciałbym to powiedzieć w ten sposób -
podstawowy typ danych to typ danych, którego nie można dalej dzielić (typ „ciąg znaków” można utworzyć z „char”, ale char nie można „rozbić” na żaden typ danych (w większości programów języki). Więc jest to podstawowy typ danych)

Typ łańcucha w SNOBOL4 jest uważany za prymitywny. Chociaż nie znam dokładnego powodu. Jest zarówno podstawowy, jak i wbudowany w SNOBOL4.

Specyfikacja Java wyraźnie wymienia listę typów danych, które uważa za prymitywne. Ponieważ typ ciągu nie znajduje się w specyfikacji , nie jest to prymitywny typ danych w Javie, mimo że jest typem wbudowanym.

jsp99
źródło
-2

Prymitywy to podstawowe typy danych dostarczane przez sam język. Przykładami w języku C są typy danych int, float, char. Jest dostarczany jako podstawowa część języka.

Nieprymitywne to zmienne lub obiekty zdefiniowane przez użytkownika. Na przykład możesz zdefiniować obiekt przechowujący dane lub możesz użyć struct w C do zdefiniowania własnych zmiennych. Nie są one prymitywne, ponieważ trzeba je było najpierw zdefiniować, aby z nich skorzystać.

Przykłady: pracownik, student, bardzo duży numer, który określasz

Edytuj z większą ilością wyjaśnień i odpowiedzi na komentarz. Prymitywne myślę jako zmienne, które pierwotnie pochodziły z językiem, a nie zmienne takie jak String w C ++, które musisz zadeklarować za pomocą słowa kluczowego New. To sprawia, że ​​jest to obiekt, więc Łańcuch nie byłby prymitywny.

Odpowiedz na komentarz: Prawdopodobnie ma to związek z implementacją zmiennej. Jeśli był częścią rdzenia językowego, jest prymitywny. Jeśli nie to nie jest. Przykładem jest String w C ++. To nie jest podstawowa zmienna i jest deklarowane przy użyciu słowa kluczowego New. Więc to nie jest prymitywne.

Bez nazwy
źródło
Dziękuję za odpowiedź . Czy klasyfikacja typu danych jako „prymitywna” zależy od implementacji? Podobnie jak w C / C ++ przechowujemy łańcuchy jako tablice znaków. Ale musimy je jawnie zdefiniować. Więc jeśli jakiś inny język ma tę samą implementację do przechowywania łańcucha, ale zapewnia go niejawnie, to czy „typ” typu danych będzie prymitywny w tym konkretnym języku?
jsp99
@Appy - prawdopodobnie. C nie zapewnia stringjako takiego typu danych; łańcuchy są reprezentowane jako agregaty typu pierwotnego char. C ++ wprowadził odpowiedni stringtyp danych, ale to, czy sam jest „prymitywny”, zależy od tego, kogo zapytasz. Osobiście nie sklasyfikowałbym tego jako takiego. Jednak sklasyfikowałbym oldskulowy typ ciągu BASIC jako typ prymitywny, z powodów, które są prawdopodobnie całkowicie arbitralne.
John Bode
Skierowano komentarz do samego pytania. Proszę zobaczyć edycję.
Noname
2
łańcuchy w C ++ nie muszą być tworzone za pomocą new
jk.
@jk Nie miałem kontaktu z C ++. Masz rację. Naprawi ans.
Noname
-2

Aby lepiej zrozumieć pojęcie typów pierwotnych i typy danych zdefiniowane przez użytkownika, wszystkim, czego brakuje innym odpowiedziom, jest pojęcie compiler.

Jeśli zrozumiesz pojęcie leksemów wybieranych jako tokeny , dowiesz się, że prymitywy są jedynymi typami danych, które kompilator zna sam.

Amit
źródło