Tip podatka (računarstvo)

[mini| Standardna hijerarhija tipova za [Python (programski jezik)|Python 3]]
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. 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.

## 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.

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.

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:

## Definicija 
 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. 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. 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.

## 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.

### 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 a*2^b (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.

### 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.*

### 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 )* 

### 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. 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: \forall x.f(x) ili `forall x. fx` i predstavlja presjek svih tipova x tijela `fx`, tj. vrijednost je tipa `fx` za svaki `x` . 
* Egzistencijalna kvantifikacija piše se kao \exists x.f(x) ili `exists x. fx` i predstavlja uniju svih tipova x tijela `fx`, tj. vrijednost je tipa `fx` za neki `x` .

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**. 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). Ovi tipovi mogu biti ugrađeni u jezik ili implementirani kao **kompozitni tipovi** u biblioteci.

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

## Reference 
## Dalje čitanje 
* 
* 
* 

## Vanjski linkovi 
* 

Kategorija:Vrste podataka
Kategorija:Programski jezici