Tip podatka (računarstvo)

U računarstvu i programiranju, tip podataka (ili jednostavno tip) predstavlja skup ili grupu vrijednosti podataka, obično definisan skupom mogućih vrijednosti, skupom dozvoljenih operacija nad tim vrijednostima i/ili njihovom reprezentacijom kao mašinskih tipova.Šablon:Sfn Specifikacija tipa podataka u programu ograničava moguće vrijednosti koje neka izražajna jedinica, poput varijable ili poziva funkcije, može imati. Kada je riječ o literalnim podacima, ona govori kompajleru ili interpreteru kako programer namjerava koristiti te podatke. Većina programskih jezika podržava osnovne tipove podataka kao što su cijeli brojevi (različitih veličina), brojevi s pokretnim zarezom (koji aproksimiraju realne brojeve), karakteri i Booleove vrijednosti.[1]
Koncept
Tip podataka može biti definisan iz više razloga: radi sličnosti, praktičnosti ili usmjeravanja pažnje. Često je to pitanje dobre organizacije koja olakšava razumijevanje složenih definicija. Gotovo svi programski jezici eksplicitno uključuju pojam tipa podataka, iako su dostupni tipovi često ograničeni razmatranjima jednostavnosti, izračunljivosti ili pravilnosti. Eksplicitna deklaracija tipa podataka obično omogućava kompajleru da odabere efikasnu mašinsku reprezentaciju, ali konceptualna organizacija koju nude tipovi podataka ne bi trebala biti zanemarena.[2]
Različiti programski jezici mogu koristiti različite tipove podataka ili slične tipove s različitom semantikom. Na primjer, u programskom jeziku Python, tip int predstavlja cijeli broj s proizvoljnom preciznošću i podržava tradicionalne numeričke operacije poput sabiranja, oduzimanja i množenja. Međutim, u programskom jeziku Java, tip int predstavlja skup 32-bitnih cijelih brojeva u rasponu od −2.147.483.648 do 2.147.483.647, pri čemu se aritmetičke operacije pri prekoračenju opsega „obavijaju“ (wrap around). U jeziku Rust, ovaj 32-bitni cijeli broj označava se kao i32 i izaziva paniku pri prekoračenju opsega u režimu za debagovanje.[3]
Većina programskih jezika također omogućava programerima da definišu dodatne tipove podataka, obično kombinovanjem više elemenata drugih tipova i definisanjem validnih operacija za novi tip podataka. Na primjer, programer može kreirati novi tip podataka nazvan "kompleksni broj", koji bi sadržavao realni i imaginarni dio, ili tip podataka za boju, predstavljen s tri bajta koji označavaju količine crvene, zelene i plave boje, zajedno s nizom znakova koji predstavlja naziv boje.
Tipovi podataka koriste se unutar sistemâ tipova, koji nude različite načine njihovog definisanja, implementacije i upotrebe. U sistemu tipova, tip podataka predstavlja ograničenje u tumačenju podataka, opisujući njihovu reprezentaciju, interpretaciju i strukturu vrijednosti ili objekata pohranjenih u memoriji računara. Sistem tipova koristi informacije o tipu podataka za provjeru ispravnosti računalnih programa koji pristupaju ili manipulišu podacima.
Kompajler može koristiti statički tip neke vrijednosti kako bi optimizovao potrebnu memoriju za njeno skladištenje i odabrao odgovarajuće algoritme za operacije nad tom vrijednošću. Na primjer, u mnogim C kompajlerima tip float je predstavljen s 32 bita, u skladu s IEEE specifikacijom za brojeve s pokretnim zarezom jednostruke preciznosti. Zbog toga će kompajleri koristiti specifične operacije mikroprocesora za rad s brojevima s pokretnim zarezom, poput sabiranja i množenja.
U sljedećoj tabeli je prikazano da većina tipova podataka u statistici ima uporediv tip podataka u računarskom programiranju, također i obrnuto:
| Statistika | Programiranje |
|---|---|
| realna vrijednost ( intervalna skala ) | floating-point |
| realna vrijednost ( skala omjera ) | |
| broj podataka (obično nenegativni) | cijeli broj |
| binarni podaci | Boolean |
| kategoričke podatke | nabrojani tip |
| slučajni vektor | lista ili niz |
| slučajna matrica | dvodimenzionalni niz |
| nasumično drvo | drvo |
Definicija
Šablon:Harvtxt identificirali su pet definicija "tipa" koje su korištene—ponekad implicitno—u literaturi.
Sintaksa
Tip je isključivo sintakska oznaka pridružena varijabli prilikom deklaracije. Iako korisna za napredne sisteme tipova, poput substrukturalnih sistema tipova, ovakva definicija ne pruža intuitivno značenje tipova.
Reprezentacija
Tip je definisan kao sastav jednostavnijih tipova—često mašinskih tipova.
Reprezentacija i ponašanje
Tip je definisan svojom reprezentacijom i skupom operatora koji manipulišu tom reprezentacijom.
Prostor vrijednosti
Tip je skup mogućih vrijednosti koje neka varijabla može imati. Ovakve definicije omogućavaju rad s (disjunktnim) unijama ili Kartezijevim proizvodima tipova.
Prostor vrijednosti i ponašanje
Tip je skup vrijednosti koje varijabla može imati i skup funkcija koje se mogu primijeniti na te vrijednosti.
Definisanje tipova podataka u smislu njihove reprezentacije često se koristilo u imperativnim jezicima kao što su ALGOL i Pascal, dok se definisanje u smislu prostora vrijednosti i ponašanja koristilo u jezicima višeg nivoa, poput Simule i CLU. Tipovi koji uključuju ponašanje bliže su objektno orijentisanim modelima, dok bi se u modelu strukturiranog programiranja tipovi obično definisali bez pridruženog koda. Takve strukture nazivaju se obične stare podatkovne strukture (plain old data structures).
Klasifikacija
Tipovi podataka mogu se klasificirati prema nekoliko faktora:
- Primitivni tipovi podataka ili ugrađeni tipovi su tipovi koji su sastavni dio implementacije programskog jezika. Korisnički definirani tipovi podataka su neprimitivni tipovi. Na primjer, u Javi su numerički tipovi primitivni, dok su klase korisnički definirani tipovi.
- Vrijednost atomskog tipa je pojedinačna podatkovna stavka koja se ne može razložiti na manje komponente. Vrijednost složenog (kompozitnog) tipa ili agregatnog tipa predstavlja kolekciju podataka kojima se može pristupiti pojedinačno.[4] Na primjer, cijeli broj se obično smatra atomskim, iako se sastoji od niza bitova, dok je niz cijelih brojeva svakako složeni tip.
- Osnovni tipovi podataka ili fundamentalni tipovi definirani su aksiomatski, na temelju osnovnih pojmova, ili nabrajanjem njihovih elemenata. Generirani tipovi podataka ili izvedeni tipovi su određeni i djelimično definirani na osnovu drugih tipova podataka. Svi osnovni tipovi su atomski.[5] Na primjer, cijeli brojevi su osnovni tip definisan u matematici, dok je niz cijelih brojeva rezultat primjene generatora tipa niza na tip cijelih brojeva.
Terminologija varira—u literaturi se izrazi primitivni, ugrađeni, osnovni, atomski i fundamentalni često koriste naizmjenično.[6]
Primjeri
Tipovi mašinskih podataka
Svi podaci u računarima baziranim na digitalnoj elektronici predstavljeni su kao bitovi (alternativa 0 i 1) na najnižem nivou. Najmanja adresabilna jedinica podataka obično je grupa bitova koja se zove bajt (obično oktet, što je 8 bitova). Jedinica koju procesiraju instrukcije mašinskog koda zove se riječ (od 2011. godine, obično 32 ili 64 bita).
Tipovi podataka na mašinskom nivou omogućavaju detaljnu kontrolu nad hardverom, ali ovo također može otkriti detalje implementacije koji čine kod manje prenosivim. Stoga se tipovi na mašinskom nivou uglavnom koriste u sistemskom programiranju ili programskim jezicima niskog nivoa. U programskim jezicima višeg nivoa većina tipova podataka je apstrahirana tako da nemaju jezično definiranu mašinsku reprezentaciju. Na primjer, programski jezik C nudi tipove kao što su Boolean tipovi, cijeli brojevi, brojevi s pokretnim zarezom, itd., ali precizne bitne reprezentacije ovih tipova su definirane implementacijom. Jedini C tip s preciznom mašinskom reprezentacijom je char tip koji predstavlja bajt.[7]
Boolean tip
Boolean tip predstavlja vrijednosti tačno (true) i netačno (false). Iako su moguće samo dvije vrijednosti, češće se predstavljaju kao bajt ili riječ, a ne kao jedan bit, jer je potrebno više mašinskih instrukcija za pohranjivanje i dohvaćanje pojedinačnog bita. Mnogi programski jezici nemaju eksplicitni Boolean tip, umjesto toga koriste tip cijeli broj i tumače (na primjer) 0 kao netačno, a druge vrijednosti kao tačno. Boolean podaci se odnose na logičku strukturu kako se jezik tumači prema mašinskom jeziku. U ovom slučaju, Boolean 0 se odnosi na logičku netačnost (False). Tačno (True) je uvijek različito od nule, posebno jedan koji je poznat kao Boolean 1.
Numerički tipovi
Gotovo svi programski jezici nude jedan ili više tipova podataka za cijele brojeve. Oni mogu ili ponuditi mali broj unaprijed definisanih podtipova koji su ograničeni određenim opsezima (kao što su short i long te njihovi odgovarajući unsigned varijante u C/C++), ili omogućiti korisnicima da slobodno definiraju podopsege, poput 1..12 (npr. u Pascalu/Adi). Ako odgovarajući nativni tip ne postoji na ciljnoj platformi, kompajler će ga razložiti u kod koristeći tipove koji postoje. Na primjer, ako se na 16-bitnoj platformi zatraži 32-bitni cijeli broj, kompajler će ga tiho tretirati kao niz od dva 16-bitna cijela broja.
Tipovi podataka s pokretnim zarezom predstavljaju određene frakcijske vrijednosti (racionalne brojeve, matematički). Iako imaju unaprijed definirane granice za maksimalne vrijednosti i preciznost, ponekad se pogrešno nazivaju realnim brojevima (što podsjeća na matematičke realne brojeve). Tipično su pohranjeni interno u formi (gdje su a i b cijeli brojevi), ali se prikazuju u poznatom decimalnom obliku.
Tipovi podataka s fiksnim zarezom su pogodni za predstavljanje novčanih vrijednosti. Često se interno implementiraju kao cijeli brojevi, što dovodi do unaprijed definiranih granica.
Za neovisnost o arhitektonskim detaljima, može biti ponuđen Bignum ili tip podataka s proizvoljnom preciznošću. Ovaj tip predstavlja cijeli broj ili racionalni broj s preciznošću koja je ograničena samo dostupnom memorijom i računalnim resursima sistema. Implementacije Bignum operacija nad vrijednostima odgovarajuće veličine mašinskog tipa znatno su sporije od odgovarajućih mašinskih operacija.[8]
Enumerisani tip
Enumerisani tip ima različite vrijednosti koje se mogu uspoređivati i dodeljivati, ali koje ne moraju nužno imati specifičnu konkretno reprezentaciju u računarskoj memoriji; kompajleri i interpretatori ih mogu predstavljati proizvoljno. Na primjer, četiri boje u špilu karata mogu biti četiri enumerisane vrijednosti nazvane CLUB, DIAMOND, HEART, SPADE, koje pripadaju enumerisanom tipu pod imenom suit. Ako je varijabla V deklarisana sa suit kao tipom podataka, može joj se dodijeliti bilo koja od tih četiri vrijednosti. Neke implementacije omogućavaju programerima da dodeljuju cijele brojeve enumeriranim vrijednostima, ili čak tretiraju te vrijednosti kao tipovima ekvivalentne cijelim brojevima.
String i tekstualni tipovi
Nizovi karaktera su sekvence karaktera koje se koriste za pohranu riječi ili običnog teksta, najčešće u tekstualnim označivačkim jezicima koji predstavljaju formatirani tekst. Karakteri mogu biti slovo nekog alfabeta, cifra, razmak, interpunkcijski znak itd. Karakteri se uzimaju iz skupa karaktera poput ASCII ili Unicode. Tipovi karaktera i nizova karaktera mogu imati različite podtipove u zavisnosti od kodiranja karaktera. Originalni 7-bitni ASCII je bio ograničen, pa je zamijenjen 8, 16 i 32-bitnim skupovima, koji mogu kodirati širok spektar nelatinskih alfabetâ (kao što su hebrejski i kineski) i drugih simbola. Nizovi karaktera mogu biti promjenjive dužine ili fiksne dužine, a neki programski jezici podržavaju oba tipa. Takođe, mogu biti podtipizirani prema svojoj maksimalnoj veličini.
Pošto većina skupova karaktera uključuje cifre, moguće je imati numerički niz karaktera, poput "1234". Ovi numerički nizovi obično se smatraju različitim od numeričkih vrijednosti poput 1234, iako neki programski jezici automatski vrše konverziju između njih.
Tipovi unije
Definicija unije tipa specificira koji od dozvoljenih podtipova može biti pohranjen u njenim instancama, npr. "float ili cijeli broj". U suprotnosti s zapisom (record), koji bi mogao biti definisan da sadrži i float i cijeli broj, unija može sadržavati samo jedan podtip u isto vrijeme.
Označena unija (takođe nazvana varijanta, varijantni zapis, diskriminisana unija ili disjunktna unija) sadrži dodatno polje koje označava njen trenutni tip, čime se poboljšava sigurnost tipa. Ovo omogućava da se tačno odredi koji tip podataka je trenutno pohranjen u uniji, čime se smanjuje mogućnost grešaka pri radu sa podacima.
Algebarski tipovi podataka
Algebrski tip podataka (ADT) je moguće rekurzivni suma tip sastavljen od tipova proizvoda. Vrijednost ADT tipa se sastoji od tag-a konstruktora zajedno sa nula ili više polja, pri čemu su broj i tip tih polja fiksirani konstruktorom. Skup svih mogućih vrijednosti ADT tipa predstavlja skupno-teorijsku disjunktnu uniju (suma) skupova svih mogućih vrijednosti njegovih varijanti (proizvod polja). Vrijednosti algebrskih tipova analiziraju se pomoću pobudnog upodavanja (pattern matching), koji identifikuje konstruktor vrijednosti i izdvaja polja koja ona sadrži.
Ako postoji samo jedan konstruktor, tada ADT odgovara tipu proizvoda sličnom nizu ili zapisu. Konstruktor bez polja odgovara praznom proizvodu (tipu jedinice). Ako svi konstruktori nemaju polja, tada ADT odgovara enumerisanom tipu.
Jedan od čestih ADT tipova je option tip, definisan u Haskell-u kao data Maybe a = Nothing | Just a.[9]
Struktura podataka
Neki tipovi su vrlo korisni za pohranu i dohvat podataka i nazivaju se strukture podataka. Uobičajene strukture podataka uključuju:
- Niz (koji se naziva i vektor, lista ili sekvenca) pohranjuje niz elemenata i pruža nasumični pristup pojedinačnim elementima. Elementi niza obično (ali ne u svim kontekstima) moraju biti istog tipa. Nizovi mogu biti fiksne dužine ili proširivi. Obično se traži da indeksi u nizu budu cijeli brojevi (ako ne, ovo opuštanje se može naglasiti govoreći o asocijativnom nizu ) iz određenog raspona (ako svi indeksi u tom rasponu ne odgovaraju elementima, to može biti rijetki niz ).
- Zapis (koji se naziva i tuple ili struktura) Zapisi su među najjednostavnijim strukturama podataka . Zapis je vrijednost koja sadrži druge vrijednosti, obično u fiksnom broju i nizu i obično indeksirane imenima. Elementi zapisa se obično nazivaju poljima ili članovima .
- Objekt sadrži brojna polja podataka, kao što je zapis, a također nudi niz potprograma za pristup ili modificiranje, koji se nazivaju metode .
- jednostruko povezana lista, koja se može koristiti za implementaciju reda i definirana je u Haskell-u kao ADT data List a = Nil | Cons a ( List a ), i
- binarno stablo, koje omogućava brzo pretraživanje, a može se definirati u Haskell-u kao ADT data BTree a = Nil | Node ( BTree a ) a ( BTree a ) [10]
Apstraktni tipovi podataka
Apstraktni tip podataka je tip podataka koji ne specificira konkretan način reprezentacije podataka. Umjesto toga, koristi se formalna specifikacija zasnovana na operacijama tipa podataka za njegovo opisivanje. Svaka implementacija specifikacije mora ispuniti zadana pravila. Na primjer, stog (stack) ima operacije push/pop koje slijede pravilo Last-In-First-Out (LIFO), a može biti konkretno implementiran pomoću liste ili niza. Apstraktni tipovi podataka koriste se u formalnoj semantici i verifikaciji programa, a manje strogo u dizajnu.
Pokazatelji i reference
Glavni nekombinovani, izvedeni tip je pokazivač (pointer), tip podataka čija vrijednost direktno upućuje na (ili "pokazuje") drugu vrijednost pohranjenu na drugom mjestu u računalnoj memoriji koristeći njen adresu. To je primitivni oblik referenciranja. (U svakodnevnom jeziku, broj stranice u knjizi može se smatrati podatkom koji upućuje na drugi podatak). Pokazivači se često pohranjuju u formatu sličnom cijelom broju; međutim, pokušaj dereferenciranja ili "pronalaska" pokazivača čija vrijednost nikada nije bila validna memorijska adresa izazvao bi pad programa. Da bi se ublažio ovaj potencijalni problem, tip pokazivača obično se smatra različitim od odgovarajućeg cijelog broja, čak i ako je osnovna reprezentacija ista.
Tipovi funkcija
Jezici funkcionalnog programiranja tretiraju funkcije kao različit tip podataka i omogućavaju da vrijednosti ovog tipa budu pohranjene u varijablama i proslijeđene u funkcije. Neki multi-paradigmatski jezici, poput JavaScript-a, također imaju mehanizme za tretiranje funkcija kao podataka.[11] Većina savremenih sistema tipova ide dalje od jednostavnog tipa "objekt funkcije" u JavaScript-u i ima skup tipova funkcija koji se razlikuju prema tipovima argumenata i povratnih vrijednosti, kao što je tip Int -> Bool, koji označava funkcije koje uzimaju cijeli broj i vraćaju Booleov tip. U C jeziku, funkcija nije tip podataka prvog reda, ali pokazivači funkcija mogu biti manipulisani od strane programa. Java i C++ prvobitno nisu imale funkcijske vrijednosti, ali su ih dodali u C++11 i Java 8.
Konstruktori tipa
Konstruktor tipa gradi nove tipove od postojećih i može se smatrati operatorom koji uzima nula ili više tipova kao argumente i proizvodi novi tip. Tipovi proizvoda, tipovi funkcija, tipovi stepena i tipovi lista mogu se koristiti kao konstruktori tipova.
Kvantificirani tipovi
Univerzalna kvantifikacija i egzistencijalna kvantifikacija tipova zasnivaju se na predikatnoj logici.
- Univerzalna kvantifikacija piše se kao: ili
forall x. fxi predstavlja presjek svih tipova x tijelafx, tj. vrijednost je tipafxza svakix. - Egzistencijalna kvantifikacija piše se kao ili
exists x. fxi predstavlja uniju svih tipova x tijelafx, tj. vrijednost je tipafxza nekix.
U Haskell-u, univerzalna kvantifikacija se često koristi, ali egzistencijalni tipovi moraju biti kodirani transformacijom exists a. f a u forall r. (forall a. f a -> r) -> r ili sličan tip.
Ova transformacija omogućava simulaciju egzistencijalnih tipova u Haskell-u, jer je univerzalna kvantifikacija podržana nativno, dok egzistencijalni tipovi zahtijevaju dodatnu apstrakciju pomoću viših funkcija i univerzalnih kvantifikacija.
Refinirani tip
Refinirani tip je tip koji je obogaćen predikatom za koji se pretpostavlja da vrijedi za bilo koji element refiniranog tipa. Na primjer, tip prirodnih brojeva većih od 5 može se napisati kao:
{ n ∈ ℕ | n > 5 }
Ovaj zapis znači da je tip svih prirodnih brojeva koji zadovoljavaju uvjet n > 5. Refinirani tipovi omogućavaju dodatne specifikacije i restrikcije na tipove, čime poboljšavaju preciznost i sigurnost u programiranju.
Zavisni tipovi
Zavisni tip je tip čija definicija zavisi od vrijednosti. Dva česta primjera zavisnih tipova su zavisne funkcije i zavisne parove.
- Zavisna funkcija: Tip povratne vrijednosti zavisi od vrijednosti (ne samo tipa) jednog od njenih argumenata. Na primjer, tip povratne vrijednosti može zavisiti od specifične vrijednosti koju funkcija prima kao argument.
- Zavisni par: Zavisni par može imati drugi element čiji tip zavisi od prvog elementa. Na primjer, prvi element može biti broj, a tip drugog elementa može zavisiti od tog broja.
Zavisni tipovi omogućavaju veću fleksibilnost u definiranju tipova koji su precizno vezani za konkretne vrijednosti, čime se povećava snaga tipa sistema i sigurnost programa.
Presjek tipova
Presek tipova je tip koji sadrži one vrijednosti koje su članovi dva specifična tipa. Na primjer, u Javi, klasa Boolean implementira i Serializable i Comparable interfejse. Dakle, objekat tipa Boolean je član tipa Serializable & Comparable.
Razmatrajući tipove kao skupove vrijednosti, presek tipova 𝜎 ∩ 𝜏 je skup-teoretski presek tipova 𝜎 i 𝜏.
Takođe, moguće je definisati zavisni presek tipova, označen kao (x: 𝜎) ∩ 𝜏, gdje tip 𝜏 može zavisiti od varijable x.[12] Ovo omogućava veću fleksibilnost u definisanju tipova koji zavise od specifičnih vrijednosti, kao i u preciznijem modeliranju složenih veza između tipova.
Meta tipovi
Neki programski jezici predstavljaju informacije o tipovima kao podatke, omogućavajući introspekciju tipova i reflektivno programiranje (refleksija). To znači da je moguće analizirati i manipulirati tipovima tokom izvođenja programa, često za potrebe dinamičke provjere tipova ili generičkog kodiranja.
Tipovi praktičnosti
Za praktičnost, visoko-nivojski jezici i baze podataka mogu ponuditi unaprijed definisane "realne" tipove podataka, kao što su vremenski i datum tipovi, kao i novčane vrijednosti (valute).[13][14] Ovi tipovi mogu biti ugrađeni u jezik ili implementirani kao kompozitni tipovi u biblioteci.[15]
Na primjer, mnogi jezici imaju podršku za rad s vremenom i datumima, olakšavajući rad s vremenskim zonama, formatima datuma i vremenskim operacijama. Takođe, specifični tipovi za valute omogućavaju precizno upravljanje novčanim vrijednostima, uključujući operacije kao što su zbrajanje, oduzimanje i formatiranje s tačnošću za decimale.
Također pogledati
- C tipovi podataka
- Rječnik podataka
- Vrsta (teorija tipova)
- Tip (teorija modela)
- Teorija tipova za matematičke modele tipova
- Konverzija tipova
- ISO/IEC 11404, Tipovi podataka opće namjene