Typ danych - Data type

Standardowa hierarchia typów Pythona 3

W informatyki i programowania , a typ danych lub po prostu rodzaj jest atrybutem danych , która opowiada kompilator lub interpreter jak programista zamierza wykorzystać te dane. Większość języków programowania obsługuje podstawowe typy danych: liczby całkowite (o różnych rozmiarach), liczby zmiennoprzecinkowe (które przybliżają liczby rzeczywiste), znaki i wartości logiczne . Typ danych ogranicza wartości, które może przyjąć wyrażenie , takie jak zmienna lub funkcja. Ten typ danych definiuje operacje, które można wykonać na danych, znaczenie danych oraz sposób przechowywania wartości tego typu. Typ danych zapewnia zestaw wartości, z których wyrażenie (tj. zmienna, funkcja itp.) może przyjąć swoje wartości.

Pojęcie

Typy danych są używane w systemach typów, które oferują różne sposoby ich definiowania, implementowania i używania. Różne systemy typu zapewniają różne stopnie bezpieczeństwa typu .

Prawie wszystkie języki programowania wyraźnie zawierają pojęcie typu danych, chociaż różne języki mogą używać innej terminologii.

Typowe typy danych obejmują:

Na przykład w języku programowania Java typ int reprezentuje zestaw 32-bitowych liczb całkowitych o wartości od -2147483648 do 2147483647, a także operacje, które można wykonać na liczbach całkowitych, takie jak dodawanie, odejmowanie i mnożenie. Z drugiej strony kolor może być reprezentowany przez trzy bajty oznaczające ilości czerwonego, zielonego i niebieskiego oraz ciąg reprezentujący nazwę koloru.

Większość języków programowania umożliwia również programiście zdefiniowanie dodatkowych typów danych, zwykle przez połączenie wielu elementów innych typów i zdefiniowanie prawidłowych operacji nowego typu danych. Na przykład programista może utworzyć nowy typ danych o nazwie „ liczba zespolona ”, który będzie zawierał części rzeczywiste i urojone. Typ danych reprezentuje również ograniczenie nałożone na interpretację danych w systemie typów , opisując reprezentację, interpretację i strukturę wartości lub obiektów przechowywanych w pamięci komputera. System typów wykorzystuje informacje o typie danych do sprawdzania poprawności programów komputerowych, które uzyskują dostęp do danych lub manipulują nimi.

Większość typów danych w statystykach ma porównywalne typy w programowaniu komputerowym i na odwrót, jak pokazano w poniższej tabeli:

Statystyka Programowanie
wartości rzeczywiste ( skala interwałowa ) zmiennoprzecinkowa
wartości rzeczywiste ( skala ilorazowa )
zliczyć dane (zwykle nieujemne) liczba całkowita
dane binarne Boole'a
dane kategoryczne wyliczony typ
losowy wektor lista lub tablica
losowa macierz tablica dwuwymiarowa
losowe drzewo drzewo

Definicja

( Parnas, Shore i Weiss 1976 ) zidentyfikowali pięć definicji „typu”, które były używane – czasami w sposób dorozumiany – w literaturze. Typy, w tym zachowanie, są bardziej wyrównane z modelami obiektowymi , podczas gdy model programowania strukturalnego zwykle nie zawiera kodu i są nazywane zwykłymi starymi strukturami danych .

Pięć typów to:

Syntaktyczny
Typ jest czysto składniową etykietą powiązaną ze zmienną w momencie jej zadeklarowania. Takie definicje „typu” nie nadają typom żadnego znaczenia semantycznego .
Reprezentacja
Typ jest definiowany pod względem składu bardziej prymitywnych typów — często typów maszynowych.
Reprezentacja i zachowanie
Typ jest definiowany jako jego reprezentacja oraz zestaw operatorów manipulujących tymi reprezentacjami.
Przestrzeń wartości
Typ to zbiór możliwych wartości, które może posiadać zmienna. Takie definicje pozwalają mówić o ( rozłącznych ) związkach lub kartezjańskich iloczynach typów.
Doceniaj przestrzeń i zachowanie
Typ to zbiór wartości, które może posiadać zmienna oraz zbiór funkcji, które można zastosować do tych wartości.

Definicja w kategoriach reprezentacji była często dokonywana w językach imperatywnych, takich jak ALGOL i Pascal , podczas gdy definicja w kategoriach przestrzeni wartości i zachowania była używana w językach wyższego poziomu, takich jak Simula i CLU .

Klasy typów danych

Prymitywne typy danych

Pierwotne typy danych to zazwyczaj typy wbudowane lub podstawowe dla implementacji języka.

Typy danych maszynowych

Wszystkie dane w komputerach opartych na elektronice cyfrowej są reprezentowane jako bity (alternatywa 0 i 1) na najniższym poziomie. Najmniejszą adresowalną jednostką danych jest zwykle grupa bitów zwana bajtem (zwykle oktet , który ma 8 bitów). Jednostka przetwarzana przez instrukcje kodu maszynowego nazywana jest słowem (od 2011, zwykle 32 lub 64 bity). Większość instrukcji interpretuje to słowo jako liczbę binarną , tak że 32-bitowe słowo może reprezentować wartości całkowite bez znaku od 0 do lub wartości całkowite ze znakiem od do . Ze względu na dopełnienie dwóch , język maszynowy i maszyna nie muszą w większości przypadków rozróżniać między tymi niepodpisanymi i podpisanymi typami danych.

Liczby zmiennoprzecinkowe używane w arytmetyce zmiennoprzecinkowej używają innej interpretacji bitów w słowie. Zobacz Arytmetyka zmiennoprzecinkowa, aby uzyskać szczegółowe informacje.

Typy danych maszynowych muszą być ujawniane lub udostępniane w systemach lub językach programowania niskiego poziomu , co umożliwia precyzyjną kontrolę nad sprzętem. Na przykład język programowania C dostarcza typy liczb całkowitych o różnych szerokościach, takie jak shorti long. Jeśli odpowiedni typ natywny nie istnieje na platformie docelowej, kompilator podzieli je na kod przy użyciu istniejących typów. Na przykład, jeśli zażądano 32-bitowej liczby całkowitej na platformie 16-bitowej, kompilator potraktuje ją milcząco jako tablicę dwóch 16-bitowych liczb całkowitych.

W programowaniu wyższego poziomu typy danych maszynowych są często ukryte lub wyabstrahowane jako szczegóły implementacji, które w przypadku ujawnienia sprawią, że kod będzie mniej przenośny. Na przykład numericzamiast liczb całkowitych o określonej szerokości bitowej można podać typ ogólny .

Typ logiczny

Typ Boolean reprezentuje wartości true i false . Chociaż możliwe są tylko dwie wartości, rzadko są one implementowane jako pojedyncza cyfra binarna ze względu na wydajność. Wiele języków programowania nie ma jawnego typu logicznego, zamiast tego interpretuje (na przykład) 0 jako fałszywe, a inne wartości jako prawdziwe. Dane logiczne odnoszą się do logicznej struktury interpretacji języka na język maszynowy. W tym przypadku Boolean 0 odnosi się do logiki False. Prawda jest zawsze liczbą niezerową, zwłaszcza taką, która jest znana jako Boolean 1.

Wyliczenia

Typ wyliczeniowy ma różne wartości, które można porównywać i przypisywać, ale które niekoniecznie mają konkretną reprezentację w pamięci komputera; kompilatory i interpretery mogą je reprezentować dowolnie. Na przykład cztery kolory w talii kart do gry mogą być czterema enumeratorami o nazwie CLUB , DIAMOND , HEART , SPADE , należącymi do wyliczonego typu o nazwie suit . Jeśli zmienna V jest zadeklarowana z typem danych suit , można do niej przypisać dowolną z tych czterech wartości. Niektóre implementacje umożliwiają programistom przypisywanie wartości całkowitych do wartości wyliczenia, a nawet traktowanie ich jako równoważne typom liczb całkowitych.

Typy numeryczne

Jak na przykład:

  • W całkowitą typy danych, lub „cyfr z” ułamkowa. Mogą być podtypowane zgodnie z ich zdolnością do zawierania wartości ujemnych (np. unsignedw C i C++). Może mieć również niewielką liczbę predefiniowanych podtypów (takich jak shortiw longC/C++); lub zezwól użytkownikom na dowolne definiowanie podzakresów takich jak 1..12 (np. Pascal / Ada ).
  • Typy danych zmiennoprzecinkowych zwykle reprezentują wartości jako wysoce precyzyjne wartości ułamkowe ( liczby wymierne , matematycznie), ale czasami są myląco nazywane liczbami rzeczywistymi (przypominające matematyczne liczby rzeczywiste ). Zwykle mają predefiniowane limity dotyczące zarówno ich wartości maksymalnych, jak i precyzji. Zwykle przechowywany wewnątrz w formie a × 2 B (gdzie i b są liczbami całkowitymi), lecz wyświetlane w znanym dziesiętnych formy.
  • Typy danych stałoprzecinkowych są wygodne do reprezentowania wartości pieniężnych. Często są one implementowane wewnętrznie jako liczby całkowite, co prowadzi do predefiniowanych limitów.
  • Typy liczbowe typu Bignum lub o dowolnej precyzji nie mają wstępnie zdefiniowanych limitów. Nie są to typy prymitywne i są używane oszczędnie ze względu na wydajność.

Typy kompozytowe

Typy złożone pochodzą z więcej niż jednego typu pierwotnego. Można to zrobić na wiele sposobów. Sposoby ich łączenia nazywane są strukturami danych . Składanie typu pierwotnego w typ złożony generalnie daje w wyniku nowy typ, np. array-of-integer jest innym typem niż integer .

  • Array (zwany również wektor, list , lub sekwencja) przechowuje szereg elementów i zapewnić swobodny dostęp do poszczególnych elementów. Elementy tablicy zazwyczaj (ale nie we wszystkich kontekstach) muszą być tego samego typu. Tablice mogą mieć stałą długość lub mogą być rozszerzane. Indeksy do tablicy zwykle muszą być liczbami całkowitymi (jeśli nie, można podkreślić to rozluźnienie, mówiąc o tablicy asocjacyjnej ) z określonego zakresu (jeśli nie wszystkie indeksy w tym zakresie odpowiadają elementom, może to być tablica rzadka ).
  • Rekord (zwany także krotką lub strukturą) Rekordy należą do najprostszych struktur danych . Rekord to wartość zawierająca inne wartości, zwykle w stałej liczbie i kolejności, zazwyczaj indeksowana według nazw. Elementy rekordów są zwykle nazywane polami lub członkami .
  • Unia . Definicja typu unii określa, który z kilku dozwolonych typów pierwotnych może być przechowywany w jego instancjach, np. „liczba zmiennoprzecinkowa czy długa całkowita”. Kontrast z rekordem , który można zdefiniować jako zawierający liczbę zmiennoprzecinkową i całkowitą; podczas gdy w unii dozwolony jest tylko jeden typ na raz.
    • Rekord z wariantami (zwany również wariant , wariant rekord, unia dyskryminowana lub suma rozłączna) zawiera dodatkowe pole wskazujące obecną typ dla zwiększenia bezpieczeństwa typu.
  • Zestaw jest abstrakcyjne struktury danych , które mogą przechowywać pewne wartości, bez żadnego konkretnego celu , a nie powtarzane wartości. Same wartości nie są pobierane z zestawów, raczej testuje się wartość członkostwa, aby uzyskać wartość logiczną „in” lub „not in”.
  • Obiekt zawiera liczbę pól danych, takich jak zapis, a także szereg podprogramów dla dostępu lub ich modyfikacji, zwanych metod .

Możliwych jest wiele innych, ale zwykle są to dalsze odmiany i związki powyższego. Na przykład połączona lista może przechowywać te same dane co tablica, ale zapewnia dostęp sekwencyjny, a nie losowy i jest zbudowana z rekordów w pamięci dynamicznej ; chociaż prawdopodobnie jest to struktura danych, a nie typ per se , jest również powszechny i ​​na tyle wyraźny, że włączenie go do dyskusji na temat typów złożonych może być uzasadnione.

Typy ciągów i tekstów

Jak na przykład:

  • Postać , która może być list od pewnego alfabetu , cyfry, pusta przestrzeń, znak interpunkcyjny, etc.
  • Ciąg , który jest ciągiem znaków. Ciągi są zwykle używane do reprezentowania słów i tekstu, chociaż tekst we wszystkich, z wyjątkiem najprostszych przypadków, obejmuje znacznie więcej niż sekwencję znaków.

Typy znaków i ciągów mogą przechowywać sekwencje znaków z zestawu znaków, takiego jak ASCII . Ponieważ większość zestawów znaków zawiera cyfry , możliwe jest posiadanie ciągu liczbowego, takiego jak "1234". Jednak wiele języków traktuje je jako należące do innego typu niż wartość liczbowa 1234.

Typy znaków i łańcuchów mogą mieć różne podtypy w zależności od wymaganej szerokości znaku. Stwierdzono, że oryginalny 7-bitowy kod ASCII jest ograniczony i zastąpiony zestawami 8- i 16-bitowymi, które mogą kodować szeroką gamę alfabetów niełacińskich (takich jak hebrajski i chiński ) oraz innych symboli. Ciągi mogą być rozciągane na wymiar lub o stałym rozmiarze, nawet w tym samym języku programowania. Mogą być również podtypowane według ich maksymalnego rozmiaru.

Uwaga: Ciągi nie są pierwotnym typem danych we wszystkich językach. Na przykład w C składają się z tablicy znaków.

Abstrakcyjne typy danych

Każdy typ danych, który nie określa konkretnej reprezentacji danych, jest typem abstrakcyjnym . Zamiast tego do jego opisu używana jest formalna specyfikacja oparta na operacjach typu danych. Każda implementacja specyfikacji musi spełniać podane zasady. Abstrakcyjne typy danych są używane w formalnej semantyce i weryfikacji programu oraz, mniej ściśle, w projektowaniu .

Poza weryfikacją, specyfikacja może od razu zostać przekształcona w implementację. Na przykład rodzina języków programowania OBJ opiera się na tej opcji, używając równań do specyfikacji i przepisywania w celu ich uruchomienia. Specyfikacja algebraiczna była ważnym przedmiotem badań w CS około 1980 roku i prawie synonimem abstrakcyjnych typów danych w tamtym czasie. Ma podstawy matematyczne w algebrze uniwersalnej . Język specyfikacji można uczynić bardziej wyrazistym, dopuszczając inne formuły niż tylko równania.

Typowym przykładem jest hierarchia typów danych list , bag i set . Wszystkie te typy danych można zadeklarować za pomocą trzech operacji: null , która konstruuje pusty kontener, single , która konstruuje kontener z jednego elementu oraz append , która łączy dwa kontenery tego samego typu. Pełną specyfikację dla trzech typów danych można następnie podać za pomocą następujących reguł dotyczących tych operacji:

- null to lewy i prawy neutralny: append(null,A) = A, append(A,null) = A.
- w przypadku listy dodatek jest skojarzony: append(append(A,B),C) = append(A,append(B,C)).
- worki dodają przemienność: append(B,A) = append(A,B).
- wreszcie zestaw jest również idempotentny: dołącz(A,A) = A.

Dostęp do danych można określić prawdopodobnie, np. funkcję członkowską dla tych kontenerów poprzez:

- element(X,pojedynczy(Y)) = równ(X,Y)
- member(X,null) = false
- member(X,append(A,B)) = or(member(X,A), member(X,B))

Inne rodzaje

Typy mogą być oparte lub wywodzić się z podstawowych typów wyjaśnionych powyżej. W niektórych językach, takich jak C, funkcje mają typ wywodzący się z typu ich wartości zwracanej .

Wskaźniki i referencje

Głównym niezłożonym typem pochodnym jest wskaźnik , typ danych, którego wartość odnosi się bezpośrednio do (lub „wskazuje na”) innej wartości przechowywanej w innym miejscu pamięci komputera przy użyciu jej adresu . Jest to prymitywny rodzaj odniesienia . (W potocznych terminach numer strony w książce można uznać za dane, które odnoszą się do innej). Wskaźniki są często przechowywane w formacie podobnym do liczby całkowitej; jednak próba wyłuskania lub "szukania" wskaźnika, którego wartość nigdy nie była prawidłowym adresem pamięci, spowodowałaby awarię programu. Aby złagodzić ten potencjalny problem, wskaźniki są uważane za odrębny typ w stosunku do typu danych, na który wskazują, nawet jeśli ich podstawowa reprezentacja jest taka sama.

Rodzaje funkcji

Chociaż funkcjom można również przypisać typ, ich typ nie jest uważany za typ danych w ustawieniach tego artykułu. Tutaj dane są postrzegane jako odrębne od algorytmów . W programowaniu funkcje są silnie powiązane z tymi ostatnimi. Ponieważ jednak główną zasadą uniwersalnego przetwarzania danych jest to, że algorytmy mogą być reprezentowane jako dane , np. opis tekstowy i programy binarne, kontrast między danymi a funkcjami ma swoje ograniczenia. W rzeczywistości funkcje nie tylko mogą być reprezentowane przez dane, ale funkcje mogą być również używane do kodowania danych . Wiele współczesnych systemów typów koncentruje się na typach funkcyjnych, a wiele współczesnych języków pozwala funkcjom działać jako obywatele pierwszej klasy .

Wykluczenie funkcji z traktowania jako typy danych nie jest rzadkością w powiązanych polach. Na przykład logika predykatów nie pozwala na stosowanie kwantyfikatorów na nazwach funkcji lub predykatów.

Typy meta

Niektóre języki programowania reprezentują informacje o typie jako dane, umożliwiając introspekcję i odbicie typu . W przeciwieństwie do tego, systemy typów wyższego rzędu , pozwalając na konstruowanie typów z innych typów i przekazywanie ich do funkcji jako wartości, zazwyczaj unikają opierania na nich decyzji obliczeniowych .

Rodzaje użytkowe

Dla wygody języki wysokiego poziomu mogą dostarczać gotowe typy danych „ze świata rzeczywistego”, na przykład czasy , daty , wartości pieniężne i pamięć , nawet jeśli język pozwalałby na ich budowanie z typów pierwotnych.

Systemy typu

Układ typu kojarzy typy z obliczonymi wartościami. Badając przepływ tych wartości, system typów próbuje udowodnić, że nie mogą wystąpić żadne błędy typu . Omawiany system typów określa, co stanowi błąd typu, ale system typów zazwyczaj dąży do zagwarantowania, że ​​operacje oczekujące określonego rodzaju wartości nie są używane z wartościami, dla których ta operacja nie ma sensu.

Kompilator może wykorzystywać statyczny typ wartości w celu optymalizacji przechowywania potrzebuje i wybór algorytmów dla operacji na wartości. W wielu kompilatorach C typ danych jest na przykład reprezentowany w 32 bitach , zgodnie ze specyfikacją IEEE dla liczb zmiennoprzecinkowych o pojedynczej precyzji . Będą zatem używać operacji mikroprocesorowych specyficznych dla zmiennoprzecinkowych na tych wartościach (dodawanie zmiennoprzecinkowe, mnożenie itp.). float

Głębokość ograniczeń typu i sposób ich oceny wpływają na typowanie języka. Język programowania może dodatkowo powiązać operację z różnych algorytmów betonowych na każdego rodzaju, w przypadku polimorfizmu typu . Teoria typów zajmuje się badaniem systemów typów, chociaż konkretne systemy typów języków programowania wywodzą się z praktycznych zagadnień architektury komputera, implementacji kompilatora i projektowania języka.

Systemy typograficzne mogą być różnie statyczne lub dynamiczne , silne lub słabe , i tak dalej.

Zobacz też

Bibliografia

Dalsza lektura

Zewnętrzne linki