Datový typ - Data type

Standardní hierarchie typů Pythonu 3

V počítačové vědě a počítačovém programování je datový typ nebo jednoduše typ atributem dat, který kompilátoru nebo tlumočníkovi říká, jak programátor hodlá data použít. Většina programovacích jazyků podporuje základní datové typy celočíselných čísel (různých velikostí), čísel s plovoucí desetinnou čárkou (které aproximují reálná čísla), znaků a logických hodnot . Datový typ omezuje hodnoty, které výraz , například proměnná nebo funkce, může nabývat. Tento datový typ definuje operace, které lze na datech provádět, jejich význam a způsob ukládání hodnot tohoto typu. Datový typ poskytuje sadu hodnot, ze kterých výraz (tj. Proměnná, funkce atd.) Může získávat své hodnoty.

Pojem

Datové typy se používají v typových systémech, které nabízejí různé způsoby jejich definování, implementace a používání. Systémy různých typů zajišťují různé stupně bezpečnosti typů .

Téměř všechny programovací jazyky výslovně obsahují pojem datový typ, i když různé jazyky mohou používat odlišnou terminologii.

Mezi běžné datové typy patří:

Například v programovacím jazyce Java typ int představuje sadu 32bitových celých čísel v rozsahu od −2 147 483 648 do 2 147 483 647, stejně jako operace, které lze provádět s celými čísly, jako je sčítání, odčítání a násobení. Barvu, na druhé straně, mohou představovat tři bajty označující množství červené, zelené a modré a řetězec představující název barvy.

Většina programovacích jazyků také umožňuje programátorovi definovat další datové typy, obvykle kombinací více prvků jiných typů a definováním platných operací nového datového typu. Programátor může například vytvořit nový datový typ s názvem „ komplexní číslo “, který bude zahrnovat skutečné a imaginární části. Datový typ také představuje omezení kladené na interpretaci dat v typovém systému , popisující reprezentaci, interpretaci a strukturu hodnot nebo objektů uložených v paměti počítače. Typový systém používá informace o datových typech ke kontrole správnosti počítačových programů, které k datům přistupují nebo s nimi manipulují.

Většina datových typů ve statistikách má srovnatelné typy v počítačovém programování a naopak, jak ukazuje následující tabulka:

Statistika Programování
skutečná hodnota ( intervalová stupnice ) plovoucí bod
skutečná hodnota ( poměrová stupnice )
údaje o počtu (obvykle nezáporné) celé číslo
binární data Boolean
kategorická data vyjmenovaný typ
náhodný vektor seznam nebo pole
náhodná matice dvourozměrné pole
náhodný strom strom

Definice

( Parnas, Shore & Weiss 1976 ) identifikovali pět definic „typu“, které byly použity - někdy implicitně - v literatuře. Typy zahrnující chování se více sbližují s objektově orientovanými modely, zatímco model strukturovaného programování by obvykle neobsahoval kód a říká se jim prosté staré datové struktury .

Těchto pět typů je:

Syntaktický
Typ je čistě syntaktický štítek spojený s proměnnou, když je deklarována. Takové definice „typu“ nedávají typům žádný sémantický význam.
Reprezentace
Typ je definován z hlediska složení primitivnějších typů - často typů strojů.
Reprezentace a chování
Typ je definován jako jeho reprezentace a sada operátorů manipulujících s těmito reprezentacemi.
Hodnotový prostor
Typ je sada možných hodnot, které může mít proměnná. Takové definice umožňují hovořit o ( disjunktních ) svazcích nebo karteziánských produktech typů.
Hodnotný prostor a chování
Typ je sada hodnot, které může mít proměnná, a sada funkcí, které lze na tyto hodnoty použít.

Definice z hlediska reprezentace byla často prováděna v imperativních jazycích, jako je ALGOL a Pascal , zatímco definice z hlediska hodnotového prostoru a chování byla použita v jazycích vyšší úrovně, jako jsou Simula a CLU .

Třídy datových typů

Primitivní datové typy

Primitivní datové typy jsou obvykle typy, které jsou integrované nebo základní pro implementaci jazyka.

Strojové datové typy

Všechna data v počítačích založená na digitální elektronice jsou na nejnižší úrovni reprezentována jako bity (alternativy 0 a 1). Nejmenší adresovatelnou jednotkou dat je obvykle skupina bitů nazývaná byte (obvykle oktet , což je 8 bitů). Jednotka zpracovaná instrukcemi strojového kódu se nazývá slovo (od roku 2011, obvykle 32 nebo 64 bitů). Většina pokynů interpretuje slovo jako binární číslo , takže 32bitové slovo může představovat celočíselné hodnoty bez znaménka od 0 do nebo celočíselné hodnoty se znaménkem od do . Kvůli doplňku dvou strojový jazyk a stroj z velké části nemusí rozlišovat mezi těmito nepodepsanými a podepsanými datovými typy.

Čísla s plovoucí desetinnou čárkou používaná pro aritmetiku s plovoucí desetinnou čárkou používají jinou interpretaci bitů ve slově. Podrobnosti najdete v aritmetice s plovoucí desetinnou čárkou .

Datové typy strojů musí být vystaven nebo zpřístupněné v systémech a programovacích jazycích na nízké úrovni , což umožňuje jemné-zrnitá kontrolu nad hardwarem. C programovací jazyk , například, dodávky celočíselné typy různých šířkách, jako je například shorta long. Pokud odpovídající cílový typ na cílové platformě neexistuje, kompilátor je rozdělí na kód pomocí typů, které existují. Pokud je například požadováno 32bitové celé číslo na 16bitové platformě, kompilátor jej bude mlčky považovat za pole dvou 16bitových celých čísel.

Při programování na vyšší úrovni jsou strojové datové typy často skryté nebo abstrahované jako detail implementace, který by v případě odhalení znemožnil přenos kódu. Například numericmísto celých čísel určité konkrétní bitové šířky může být zadán obecný typ.

Booleovský typ

Logická typ reprezentuje hodnoty pravdivé a falešné . Ačkoli jsou možné pouze dvě hodnoty, z důvodu účinnosti jsou zřídka implementovány jako jedna binární číslice. Mnoho programovacích jazyků nemá explicitní booleovský typ, místo toho interpretuje (například) 0 jako false a jiné hodnoty jako true. Booleovská data odkazují na logickou strukturu toho, jak je jazyk interpretován do strojového jazyka. V tomto případě logická 0 odkazuje na logiku False. Pravda je vždy nenulová, zvláště ta, která je známá jako Boolean 1.

Výčty

Vyjmenovány typ má odlišné hodnoty, které mohou být porovnány a přiřazeny, ale které nemusí mít žádné zvláštní zastoupení betonu v paměti počítače; kompilátoři a tlumočníci je mohou libovolně zastupovat. Například čtyři obleky v balíčku hracích karet mohou být čtyři výčty pojmenované CLUB , DIAMOND , HEART , SPADE , patřící do vyjmenovaného typu pojmenovaného oblek . Pokud je proměnná V deklarována jako vyhovující jako datový typ, lze jí přiřadit libovolnou z těchto čtyř hodnot. Některé implementace umožňují programátorům přiřadit celočíselné hodnoty hodnotám výčtu nebo je dokonce považovat za typově ekvivalentní celým číslům.

Číselné typy

Jako:

  • V celé číslo datové typy, nebo „non-frakční čísla“. Mohou být podtypovány podle jejich schopnosti obsahovat záporné hodnoty (např. unsignedV C a C ++). Může mít také malý počet předdefinovaných podtypů (například shorta longv C/C ++); nebo umožnit uživatelům libovolně definovat podoblasti jako 1..12 (např. Pascal / Ada ).
  • Datové typy s pohyblivou řádovou čárkou , obvykle představují hodnoty jako vysoce přesné zlomkové hodnoty ( racionální čísla , matematicky), ale někdy se zavádějící nazývají reality (evokující matematická reálná čísla ). Obvykle mají předdefinované limity jak svých maximálních hodnot, tak přesnosti. Obvykle jsou interně uloženy ve tvaru a × 2 b (kde a a b jsou celá čísla), ale zobrazují se ve známé desítkové formě.
  • Datové typy s pevným bodem jsou vhodné pro reprezentaci peněžních hodnot. Často jsou implementovány interně jako celá čísla, což vede k předdefinovaným limitům.
  • Bignum nebo libovolné přesné číselné typy postrádají předdefinované limity. Nejsou to primitivní typy a z důvodu účinnosti se používají střídmě.

Kompozitní typy

Kompozitní typy jsou odvozeny od více než jednoho primitivního typu. To lze provést několika způsoby. Způsobům jejich kombinace se říká datové struktury . Složení primitivního typu do složeného typu obecně vede k novému typu, např. Pole celého čísla je jiný typ než celé číslo .

  • Pole (nazývané také vektor, seznam , nebo sekvence) ukládá řadu prvků, a poskytuje náhodný přístup k jednotlivým prvkům. Prvky pole obvykle (ale ne ve všech kontextech) musí být stejného typu. Pole mohou mít pevnou délku nebo je lze rozšiřovat. U indexů do pole se obvykle požaduje, aby to byla celá čísla (pokud ne, lze tuto relaxaci zdůraznit mluvením o asociativním poli ) z konkrétního rozsahu (pokud ne všechny indexy v tomto rozsahu odpovídají prvkům, může to být řídké pole ).
  • Záznam (také nazývaný n -tice nebo struktura) Záznamy patří mezi nejjednodušší datové struktury . Záznam je hodnota, která obsahuje další hodnoty, obvykle v pevném počtu a pořadí a obvykle indexované podle jmen. Prvkům záznamů se obvykle říká pole nebo členové .
  • Unie . Definice typu sjednocení určí, který z řady povolených primitivních typů může být uložen v jeho instancích, např. „Float or long integer“. Kontrast se záznamem , který lze definovat tak, aby obsahoval plovák a celé číslo; vzhledem k tomu, že v unii je současně povolen pouze jeden typ.
    • Značený unie (také nazýván varianta , varianta záznam, diskriminovaná unie, nebo disjunktní unie) obsahuje další pole indikující jeho aktuální typ pro zvýšení bezpečnosti typu.
  • Sada je abstraktní datová struktura , která může ukládat určité hodnoty, bez zvláštního pořadí , a žádné opakované hodnoty. Hodnoty samotné nejsou získávány ze sad, spíše se testuje hodnota členství, aby se získal booleovský „in“ nebo „not in“.
  • Objekt obsahuje řadu datových polí, stejně jako záznam, a také řadu podprogramů pro přístup nebo jejich modifikací, zvané metody .

Je možných mnoho dalších, ale mají tendenci být dalšími variacemi a sloučeninami výše uvedeného. Například, spojový seznam je možné uložit stejná data jako pole, ale poskytuje sekvenční přístup , spíše než náhodně a je sestaven ze záznamů v dynamické paměti ; ačkoli pravděpodobně jde spíše o datovou strukturu než o typ jako takový , je také běžný a dostatečně odlišný, že jeho zahrnutí do diskuse o složených typech lze odůvodnit.

Typy řetězců a textu

Jako:

  • Znak , který může být písmeno nějaké abecedy , číslice, prázdný prostor, interpunkční znaménko, atd.
  • Řetězec , který je posloupnost znaků. Řetězce se obvykle používají k reprezentaci slov a textu, ačkoli text ve všech, kromě nejtriviálnějších případech zahrnuje mnohem více než posloupnost znaků.

Typy znaků a řetězců mohou ukládat sekvence znaků ze znakové sady, jako je ASCII . Protože většina znakových sad obsahuje číslice , je možné mít číselný řetězec, například "1234". Mnoho jazyků je však považuje za náležející jinému typu k číselné hodnotě 1234.

Typy znaků a řetězců mohou mít různé podtypy podle požadované „šířky“ znaků. Bylo zjištěno, že původní 7bitový široký ASCII je omezený a nahrazen 8 a 16bitovými sadami, které mohou kódovat širokou škálu nelatinských abeced (jako je hebrejština a čínština ) a další symboly. Řetězce mohou být buď napínací, nebo přizpůsobené, dokonce i ve stejném programovacím jazyce. Mohou být také podtypováni podle jejich maximální velikosti.

Poznámka: Řetězce nejsou primitivní datový typ ve všech jazycích. Například v jazyce C jsou složeny z řady znaků.

Abstraktní datové typy

Jakýkoli datový typ, který neurčuje konkrétní reprezentaci dat, je abstraktní datový typ . Místo toho se k jeho popisu používá formální specifikace založená na operacích datového typu. Jakákoli implementace specifikace musí splňovat daná pravidla. Abstraktní datové typy se používají ve formální sémantice a ověřování programu a, méně přísně, v designu .

Kromě ověření může být specifikace okamžitě přeměněna na implementaci. Rodina OBJ programovacích jazyků například vychází z této možnosti pomocí rovnic pro specifikaci a přepis pro jejich spuštění. Algebraická specifikace byla důležitým předmětem výzkumu v CS kolem roku 1980 a téměř synonymem pro abstraktní datové typy v té době. Má matematický základ v univerzální algebře . Specifikační jazyk může být výraznější tím, že umožní jiné vzorce než jen rovnice.

Typickým příkladem je hierarchie datových typů seznam , taška a sada . Všechny tyto datové typy lze deklarovat třemi operacemi: null , která vytvoří prázdný kontejner, single , který vytvoří kontejner z jednoho prvku a připojí , což kombinuje dva kontejnery stejného typu. Kompletní specifikaci pro tyto tři datové typy pak lze při těchto operacích určit podle následujících pravidel:

- null je levý a pravý neutrál: append (null, A) = A, append (A, null) = A.
- u seznamu je příloha asociativní: append (append (A, B), C) = append (A, append (B, C)).
- tašky dodávají komutativitu: append (B, A) = append (A, B).
- konečně, sada je také idempotentní: připojit (A, A) = A.

Přístup k datům lze určit pravděpodobně, např. Členské funkce pro tyto kontejnery:

- člen (X, single (Y)) = eq (X, Y)
- člen (X, null) = false
- member (X, append (A, B)) = or (member (X, A), member (X, B))

Jiné typy

Typy mohou být založeny na základních typech vysvětlených výše nebo z nich mohou být odvozeny. V některých jazycích, jako je C, mají funkce typ odvozený od typu jejich návratové hodnoty .

Ukazatele a reference

Hlavním nekompozitním, odvozeným typem je ukazatel , datový typ, jehož hodnota odkazuje přímo na (nebo „ukazuje na“) jinou hodnotu uloženou jinde v paměti počítače pomocí její adresy . Je to primitivní druh odkazu . (V každodenním pojetí lze číslo stránky v knize považovat za údaj, který odkazuje na jiný). Ukazatele jsou často uloženy ve formátu podobném celému číslu; pokus o dereference nebo „vyhledání“ ukazatele, jehož hodnota nikdy nebyla platnou adresou paměti, by však způsobil zhroucení programu. Aby se tento potenciální problém zmírnil, jsou ukazatele považována za samostatný typ pro typ dat, na která ukazují, i když je podkladová reprezentace stejná.

Typy funkcí

Funkcím lze přiřadit také typ, ale jejich typ není v nastavení tohoto článku považován za datový typ. Zde jsou data považována za odlišná od algoritmů . V programování jsou funkce s tím druhým silně spjaty. Protože však ústředním principem univerzálního zpracování dat je, že algoritmy mohou být reprezentovány jako data , např. Textový popis a binární programy, kontrast mezi daty a funkcemi má omezení. Ve skutečnosti mohou být funkce nejen reprezentovány daty, ale funkce mohou být také použity ke kódování dat . Mnoho systémů současného typu se silně zaměřuje na typy funkcí a mnoho moderních jazyků umožňuje funkcím fungovat jako prvotřídní občané .

Vyloučení funkcí z toho, aby byly považovány za datové typy, není v souvisejících polích neobvyklé. Logika predikátu například neumožňuje použití kvantifikátorů na názvy funkcí nebo predikátů.

Meta typy

Některé programovací jazyky představují informace o typu jako data, což umožňuje introspekci a reflexi typu . Naproti tomu systémy typu vyššího řádu , ačkoliv umožňují vytváření typů z jiných typů a jejich předávání funkcím jako hodnoty, se obvykle vyhýbají tomu, aby na nich bylo založeno výpočetní rozhodování.

Užitkové typy

Pro větší pohodlí mohou jazyky vyšší úrovně dodávat hotové datové typy „skutečného světa“, například časy , data , peněžní hodnoty a paměť , a to i tam, kde by jim jazyk umožňoval sestavení z primitivních typů.

Typové systémy

Typ systému spojuje typy s vypočtenými hodnotami. Zkoumáním toku těchto hodnot se typový systém pokouší dokázat, že nemůže dojít k žádným typovým chybám . Dotyčný typový systém určuje, co představuje chybu typu, ale typový systém se obecně snaží zajistit, aby operace očekávající určitý druh hodnoty nebyly použity s hodnotami, pro které tato operace nedává smysl.

Kompilátor může používat statický typ hodnoty pro optimalizaci ukládání, kterou potřebuje a výběr algoritmu pro operace na hodnotě. V mnoha kompilátorech C je například datový typ reprezentován 32 bity v souladu se specifikací IEEE pro čísla s plovoucí desetinnou čárkou s jednoduchou přesností . Na těchto hodnotách tedy budou používat mikroprocesorové operace specifické s pohyblivou řádovou čárkou (sčítání s plovoucí desetinnou čárkou, násobení atd.). float

Hloubka omezení typu a způsob jejich vyhodnocení ovlivňují psaní jazyka. Programovací jazyk může dále přiřadit operaci s různými konkrétními algoritmy na každém druhu v případě typu polymorfismus . Teorie typů je studium typových systémů, ačkoli konkrétní typové systémy programovacích jazyků pocházejí z praktických problémů počítačové architektury, implementace kompilátoru a jazykového designu.

Typové systémy mohou být různě statické nebo dynamické , silné nebo slabé psaní atd.

Viz také

Reference

Další čtení

externí odkazy