Skalarny a prymitywny typ danych - czy to to samo?

128

W różnych artykułach, które przeczytałem, czasami są odniesienia do pierwotnych typów danych, a czasami są odniesienia do skalarów.

Z każdego z nich rozumiem, że są to typy danych czegoś prostego, jak int, boolean, char itp.

Czy jest coś, czego mi brakuje, co oznacza, że ​​powinieneś używać określonej terminologii, czy też terminy są po prostu zamienne? Strony Wikipedii dla każdego z nich nie pokazują niczego oczywistego.

Jeśli terminy są po prostu zamienne, który jest preferowany?

Ben Pearson
źródło

Odpowiedzi:

205

Nie sądzę, żeby były wymienne. Często są do siebie podobne, ale różnica istnieje i wydaje się, że dotyczy głównie tego, z czym są skontrastowane i co jest istotne w kontekście.

Skalary są zazwyczaj skontrastowane ze związkami , takimi jak tablice, mapy, zbiory, struktury itp. Skalar to „pojedyncza” wartość - liczba całkowita, wartość logiczna, być może ciąg znaków - podczas gdy związek składa się z wielu skalarów (i ewentualnie odwołań do inne związki). „Skalarny” jest używany w kontekstach, w których odpowiednie rozróżnienie dotyczy wartości pojedynczych / prostych / atomowych i wartości złożonych.

Typy prymitywne są jednak przeciwstawiane np. Typom referencyjnym i są używane, gdy odpowiednie rozróżnienie brzmi „Czy to jest bezpośrednio wartość, czy jest to odniesienie do czegoś, co zawiera rzeczywistą wartość?”, Tak jak w przypadku typów prymitywnych języka Java a odniesień . Widzę to jako rozróżnienie nieco niższego poziomu niż skalar / związek, ale nie do końca.

To naprawdę zależy od kontekstu (i często omawianej rodziny języków). Weźmy jeden, być może patologiczny, przykład: struny. W języku C ciąg jest złożeniem (tablicą znaków), podczas gdy w Perlu ciąg jest skalarem. W Javie ciąg jest obiektem (lub typem odniesienia). W Pythonie wszystko jest (koncepcyjnie) typem obiektowym / referencyjnym, w tym łańcuchami (i liczbami).

Michael Ekstrand
źródło
1
Przy omawianiu typów referencyjnych i typów pierwotnych należy również wziąć pod uwagę typy „wartości”. Jeśli chodzi o równoważność skalarów i prymitywów, zależy to od języka. Na przykład według podręcznika PHP tylko połowa jego pierwotnych typów to skalary: php.net/manual/en/language.types.intro.php
Joe Bowbeer
11
Pomogło mi to 8 lat później :)
CoderXYZ
19

Istnieje wiele nieporozumień i niewłaściwego użycia tych terminów. Często jeden ma na myśli drugie. Oto, co właściwie oznaczają te terminy.

„Natywny” odnosi się do typów wbudowanych w język, w przeciwieństwie do typów dostarczanych przez bibliotekę (nawet bibliotekę standardową), niezależnie od sposobu ich implementacji. Łańcuchy Perl są częścią języka Perl, więc są natywne w Perlu. C zapewnia semantykę ciągów zamiast wskaźników do znaków przy użyciu biblioteki, więc wskaźnik do znaku jest natywny, ale łańcuchy nie.

„Atomowy” odnosi się do typu, którego nie można już rozłożyć. Jest przeciwieństwem „kompozytu” . Kompozyty można rozłożyć na kombinację wartości atomowych lub innych kompozytów. Natywne liczby całkowite i liczby zmiennoprzecinkowe są atomami. Ułamki, liczby zespolone, kontenery / kolekcje i ciągi znaków są złożone.

„Skalar” - i to jest ten, który dezorientuje większość ludzi - odnosi się do wartości, które mogą wyrażać skalę (stąd nazwa), takich jak rozmiar, objętość, liczebności itp. Liczby całkowite, liczby zmiennoprzecinkowe i ułamki są skalarami. Liczby zespolone, wartości logiczne i łańcuchy NIE są skalarami. Coś, co jest atomowe, niekoniecznie jest skalarne, a coś, co jest skalarne, niekoniecznie jest atomowe. Skalary mogą być natywne lub dostarczane przez biblioteki.

Niektóre typy mają dziwne klasyfikacje. Typy BigNumber, zwykle implementowane jako tablica cyfr lub liczb całkowitych, są skalarami, ale technicznie nie są atomowe. Mogą wydawać się niepodzielne, jeśli implementacja jest ukryta i nie możesz uzyskać dostępu do komponentów wewnętrznych. Ale komponenty są tylko ukryte, więc atomowość jest iluzją. Są prawie zawsze dostarczane w bibliotekach, więc nie są rodzime, ale mogą być. Na przykład w języku programowania Mathematica duże liczby są natywne, a ponieważ program Mathematica nie ma sposobu, aby rozłożyć je na bloki konstrukcyjne, są one również atomowe w tym kontekście, pomimo faktu, że są kompozytami pod okładki (gdzie nie jesteś już w świecie języka Mathematica).

Definicje te są niezależne od używanego języka.

Claudio Puviani
źródło
16
Chociaż ta definicja typu skalarnego ma dla mnie największy sens, nie wydaje się, aby była ona najczęściej akceptowana.
lleaff
1
Dziękuję za jasną definicję „skalarnego”. Chociaż, jak wskazuje @lleaff, większość ludzi nie używa go w tym konkretnym sensie, byłoby lepiej, gdyby tak było.
clockworkpc
Doskonałe definicje językowe. Tę odpowiedź należy czytać razem z odpowiedzią Michaela Ekstranda, aby uzyskać pełniejszą dyskusję. W kontekście języków programowania skalar ma niestety różne znaczenia.
Jerry
9

Mówiąc prościej, mogłoby się wydawać, że typ „skalarny” odnosi się do pojedynczego elementu, w przeciwieństwie do złożonego lub zbioru. Tak więc skalary obejmują zarówno wartości pierwotne, jak i takie elementy, jak wartość wyliczeniowa.

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

Być może termin `` skalarny '' może być powrotem do C:

gdzie skalary są prymitywnymi obiektami, które zawierają pojedynczą wartość i nie składają się z innych obiektów C ++

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

Ciekawi mnie, czy odnosi się to do tego, czy te elementy miałyby wartość „skali”? - Takich jak liczenie liczb.

Scott Langeberg
źródło
2
Uczono mnie (bardzo dawno temu w szkole), że termin ten pochodzi od „procesora skalarnego” w przeciwieństwie do „procesora wektorowego”. Procesor skalarny to procesor, który może obsługiwać tylko jedną część danych naraz. Te procesory zostały nazwane po wyrażeniach arytmetycznych. Co ciekawe, gdy wyszukujesz słowo „skalar” na Wikipedii, zostajesz przekierowany do „zmiennej”.
Evert
2

Podoba mi się odpowiedź Scotta Langeberga, ponieważ jest zwięzła i poparta wiarygodnymi linkami. Gdybym mógł, zagłosowałbym za odpowiedzią Scotta.

Przypuszczam, że „pierwotny” typ danych można uznać za podstawowy typ danych, tak że drugorzędne typy danych pochodzą od podstawowych typów danych. Wyprowadzenie odbywa się poprzez łączenie, takie jak struktura C ++. Struct może służyć do łączenia typów danych (takich jak i int i char) w celu uzyskania dodatkowego typu danych. Typ danych zdefiniowany przez strukturę jest zawsze drugorzędnym typem danych. Podstawowe typy danych nie pochodzą od niczego, są raczej określone w języku programowania.

Mam paralelę do pierwotnego bycia nomenklaturą oznaczającą pierwotny. To podobieństwo to „wyrażenie regularne”. Myślę, że nazewnictwo „regularne” można rozumieć jako „regulujące”. W ten sposób masz wyrażenie, które reguluje wyszukiwanie.

Etymologia skalarna ( http://www.etymonline.com/index.php?allowed_in_frame=0&search=scalar&searchmode=none ) oznacza drabinkę. Myślę, że sposób, w jaki odnosi się to do programowania, polega na tym, że drabina ma tylko jeden wymiar: ile szczebli od końca drabiny. Skalarny typ danych ma tylko jeden wymiar, dlatego jest reprezentowany przez pojedynczą wartość.

Myślę, że w użyciu prymitywne i skalarne są wymienne. Czy jest jakiś przykład prymitywu, który nie jest skalarny lub skalara, który nie jest prymitywny?

Chociaż jest wymienny, element pierwotny odnosi się do typu danych będącego podstawowym blokiem konstrukcyjnym innych typów danych, a element pierwotny nie składa się z innych typów danych.

Skalar odnosi się do jednej wartości. Skalar kontrastuje z wektorem matematycznym. Wektor nie jest reprezentowany przez pojedynczą wartość, ponieważ (na przykładzie jednego rodzaju wektora) potrzebna jest jedna wartość do reprezentowania kierunku wektora, a druga do reprezentacji wielkości wektora.

Linki referencyjne: http://whatis.techtarget.com/definition/primitive http://en.wikipedia.org/wiki/Primitive_data_type

Nie rozumiem
źródło
0

W języku C typy wyliczeniowe, znaki i różne reprezentacje liczb całkowitych tworzą bardziej ogólną klasę typów zwaną typami skalarnymi. Dlatego operacje, które można wykonać na wartościach dowolnego typu skalarnego, są takie same, jak na liczbach całkowitych.

Onkell Wang
źródło
0

Typ zerowy to jedyna rzecz, która najbardziej realistycznie odpowiada definicji „typu skalarnego”. Nawet serializacja „None” jako „N.” dopasowanie do 16-bitowego słowa, które jest tradycyjnie skalarne - lub nawet pojedynczy bit, który ma wiele możliwych wartości - nie jest „pojedynczą danymi”.

Komentator
źródło
0

Każdy prymityw jest skalarny, ale nie odwrotnie. DateTime jest skalarna, ale nie prymitywna.

MarkZ
źródło