Datu-mota

Konputazio-zientzietan, **datu-mota** informatiko bat edo **mota** bat datuen atributu bat da zeinak programatzaileari adierazten dion zer nolako datuak erabiliko dituen.  Horrek datuetan murriztapenak ezartzea ekartzen du: zein balio har ditzaketen eta zein eragiketa egin daitezkeen.

Datu mota ohikoenak hauek dira: zenbaki osoak, zeinudun zenbakiak (negatiboak), koma-higikorreko zenbakiak (hamartarrak), kate alfanumerikoak (eta unicodeak), egoerak, etab.

## Informazioa 
thumb|260x260px|Datu-mota batzuk erakusten dituen diagrama.
Datu-mota bat murriztapenak dituen memoria-espazio bat da. Adibidez, int motakoak 32 biteko zenbaki osoen multzo bat adierazten du eskuarki, -2.147.483.648tik 2.147.483.647ra bitarteko heina duena, baita zenbaki osoekin egin daitezkeen eragiketak ere, hala nola batuketa, kenketa eta biderketa. Koloreak, berriz, hiru byte bezala irudikatzen dira, gorri, berde eta urdin kopurua adierazten dutenak, eta karaktere kate bat kolorearen izena irudikatzen duena (kasu honetan, onartutako eragiketek gehitzea eta kentzea barne hartzen dute, baina ez biderketa).

Informatikaren oinarrizko kontzeptu bat da, eta zehazkiago, programazio-lengoaiena, baina matematikaren eta logikaren antzeko kontzeptuekin ere loturik dago.

Zentzu zabalean, datu-mota batek balio multzo bat eta balio horien gaineko eragiketak definitzen ditu. Ia programazio-lengoaia guztiek dute esplizituki datu-motaren notazioa, nahiz eta lengoaia ezberdinek terminologia ezberdinak erabil ditzaketen. Programazio-lengoaia gehienek aukera ematen diote programatzaileari datu-mota gehigarriak definitzeko, normalean beste mota batzuetako elementu ugari konbinatuz eta datu-mota berriaren eragiketak definituz. Adibidez, programatzaile batek «Pertsona» izeneko datu-mota berri bat sor dezake, «Pertsona» gisa interpretatutako datuak izen bat eta jaiotza-data bat dituela kontuan hartuta.

Datu-mota bat tipifikazio sistema batean datuen interpretazioan ezarritako muga gisa ere ikus daiteke, ordenagailuaren memorian gordetako balioen edo objektuen irudikapena, interpretazioa eta egitura deskribatuz. Tipifikazio-sistemak datu-motei buruzko informazioa erabiltzen du datuak atzitzen edo manipulatzen dituzten programen egiaztapena egiaztatzeko.

## Sailkapena 
Datu-motak hainbat faktoreren arabera sailka daitezke:

* *Datu-mota primitiboak* edo *integratutako datu-motak* hizkuntza inplementazio batean integratuta dauden motak dira. *Erabiltzaileak definitutako datu-motak* ez-oinarrizko motak dira. Adibidez, Javaren zenbakizko motak oinarrizkoak dira, klaseak erabiltzaileak definitutakoak diren bitartean.
* *Mota atomiko* baten balio bat osagai zatitan banatu ezin den datu elementu bakarra da. *Mota konposatu* edo *mota agregatu* baten balioa banaka atzitu daitezkeen datu elementuen bilduma da. Adibidez, zenbaki oso bat orokorrean atomikotzat jotzen da, nahiz eta bit sekuentzia batez osatuta egon, zenbaki osoen array bat, ordea, konposatua da zalantzarik gabe.
* *Oinarrizko datu-motak* edo *funtsezko datu-motak* oinarrizko kontzeptuetatik axiomatikoki edo beren elementuen zerrendatzearen bidez definitzen dira. *Sortutako datu-motak* edo *eratorritako datu-motak* beste datu-mota batzuen arabera zehazten eta partzialki definitzen dira. Oinarrizko mota guztiak atomikoak dira. Adibidez, zenbaki osoak matematikan definitutako oinarrizko mota bat dira, zenbaki osoen array bat, aldiz, array motako sortzaile bat zenbaki osoen motari aplikatzearen emaitza da.

Terminologia aldatu egiten da; literaturan, primitiboa, integratua, oinarrizkoa, atomikoa eta oinarrizkoa elkarren artean erabil daitezke.

## Adibideak 
### **Makina datu-motak** 
Elektronika digitalean oinarritutako ordenagailuetan datu guztiak bit gisa (0 eta 1 balioak) adierazten dira maila baxuenean. Helbideratu daitekeen datu unitate txikiena bit multzo bat da, byte izenekoa (normalean okteto bat, 8 bit direnak). Makina-kodeko instrukzioek prozesatzen duten unitateari hitz deitzen zaio (2006an, normalean 32 edo 64 bit). Instrukzio gehienek hitza zenbaki bitar gisa interpretatzen dute, adibidez 32 biteko hitz batek zeinurik gabeko balio osoak adieraz ditzake 0tik2^{32}-1 era edo zeinudun balio osoak  

-2^{31} -tik  2^{31}-1 era. Biren osagarriaren bidez, gehienetan, makina-hizkuntzak eta makinak berak ez dute bereizi behar zeinudun edo zeinurik gabeko datu moten artean.

### Boolearra 
Boolear tipoak egiazko eta gezurrezko balioak irudikatzen ditu. Bi balio bakarrik izan daitezkeen arren, bit bakar gisa baino maizago hitz gisa adierazten dira (true eta false). Programazio-hizkuntza askok ez dute boolear mota espliziturik, tipo oso bat erabili eta (adibidez) 0 faltsu gisa eta beste balio batzuk egiazko gisa interpretatu beharrean. Datu boolearrak lengoaia makinaren lengoaiarekin nola interpretatzen den adierazten duen egitura logikoari dagozkio. Kasu honetan, 0 boolearra logika faltsuari dagokio. Egia beti da ez-zero bat, bereziki 1 boolearra bezala ezagutzen den bat.

### Zenbaki-motak 
Ia programazio-lengoaia guztiek datu-mota oso bat edo gehiago eskaintzen dituzte. Bi aukera dituzte: alde batetik, aurrez definitutako azpimota kopuru txiki bat eskaini dezakete, tarte jakin batzuetara mugatuta daudenak (adibidez, `short` eta `long` eta hauen `unsigned` aldaerak C/C++ lengoaietan); edo bestalde, erabiltzaileei azpitarteak askatasunez definitzeko aukera eman diezaiekete, adibidez 1..12 (Pascal/Ada lengoaietan bezala).

Puntu flotatzaileen datu motek zenbaki zatikien balio jakin batzuk irudikatzen dituzte (matematikoki, zenbaki arrazionalak). Nahiz eta beren balio maximoetan eta zehaztasunean aurrez definitutako mugak izan, batzuetan modu nahasgarrian "errealak" deitzen zaie (matematikako zenbaki errealen erreferentzia eginez). Normalean barnean   moduan gordetzen dira (non a eta b osokoak diren), baina hamartar forma ezagunean bistaratzen dira.

Puntu finkoko datu-motak egokiak dira diru-balioak adierazteko. Askotan, zenbaki oso gisa aplikatzen dira barnean, eta horrek aurrez definitutako mugetara eramaten du.

### Zerrendak 
Mota zerrendatuak balio desberdinak ditu, alderatu eta esleitu daitezkeenak, baina ez dute zertan ordenagailuaren memorian irudikapen zehatzik izan behar; konpiladoreak eta interpreteak nahi bezala irudika ditzakete. Adibidez, karta-joko bateko lau zeinuak *URREA, EZPATA, KOPAK* eta *BASTOIA* izeneko lau enumeratzaile izan daitezke, *MULTZOA* izeneko mota zerrendatu batekoak. *V* aldagai bat deklaratzen bada *MULTZO* mota duela, lau balio horietako edozein esleitu dakioke. Zenbait inplementaziok programatzaileei balio osoak enumerazio-balioei esleitzea ahalbidetzen diete, edo zenbaki osoen baliokide gisa tratatzea.

Karaktere-multzo gehienek digituak barne hartzen dituztenez, zenbakizko kateak egin daitezke, adibidez, `"1234"`. Zenbakizko kate hauek normalean desberdintzat hartzen dira `1234` bezalako balio numerikoetatik, nahiz eta zenbait hizkuntzak automatikoki bihurtzen dituzten bata bestera.

### Lotura motak 
Lotura-motaren definizio batek zehaztuko du zein azpimota onartzen diren bere instantzietan gordetzeko, adibidez, "Puntu flotatzaileko zenbakia edo zenbaki osoak". Datu estruktura batekin alderatuta, zeinak puntu flotatzaileko zenbaki bat *eta* zenbaki oso bat eduki ditzakeen, lotura-motek azpimota bakarra eduki dezake aldi berean.

### Datu-mota aljebraikoa 
Datu aljebraiko mota bat (ADT) produktu moten batuketa errekurtsiboa da. ADT baten balio bat eraikitzailearen etiketa bat da, zero eremuko balioekin edo gehiagorekin batera, eraikitzaileak finkatutako eremuko balioen kopuruarekin eta motarekin. ADT baten balio posible guztien multzoa da konbinazio set-teorikoa (batuketa), bere aldaeren balio posible guztien multzoena (eremuen emaitza). Mota aljebraikoko balioak ereduekin bat etorriz aztertzen dira, eta horrek balio baten eraikitzailea identifikatzen du eta barruan dituen eremuak lortzen ditu.

Eraikitzaile bakarra badago, ADTa tuple edo erregistro baten antzeko datu-mota bati dagokio. Eremurik gabeko eraikitzailea produktu hutsari dagokio (unitate mota). Eraikitzaile guztiek eremurik ez badute, ADTa zerrendatutako tipo bati dagokio.

Ohiko ADT bat option mota da, Haskellen honela definitzen da: `data Maybe a = Nothing | Just a`

### Datu-egiturak 
Datu-egiturak oso erabilgarriak dira datuak gordetzeko eta berreskuratzeko. Ohiko datu-egituren artean hurrengoak daude:

* Array batek hainbat elementu gordetzen ditu eta elementu indibidualetarako ausazko sarbidea ahalbidetzen du. Array baten elementuak normalean (baina ez testuinguru guztietan) mota berekoak izan behar dira. Array-ak estatikoak edo dinamikoak izan daitezke. Array bateko indizeak, normalean, osoak izatea eskatzen da (bestela, erlaxazio hori azpimarra daiteke array asoziatibo bati buruz hitz egitean), eremu zehatz batetik (baldin eta hedadura horretako indize guztiak ez badatoz bat elementuekin).
* Erregistroak (tuple edo struct ere deitua) datu-egitura sinpleenen artean daude. Erregistro bat beste balio batzuk dituen balio bat da, normalean zenbaki finkoan eta sekuentzian eta izenen arabera indexatuta. Erregistroen elementuei field edo member esaten zaie.
* Lotura bakarreko zerrenda, ilara bat ezartzeko erabil daitekeena, eta Haskell-en honela definitzen da: ADT `data List a = Nil | Cons a (List a)`, eta
* Zuhaitz bitarra, bilaketa azkarra ahalbidetzen duena, eta Haskellen honela defini daitekeena: ADT `data BTree a = Nil | Node (BTree a) a (BTree a)`.

### Datu-mota abstraktuak 
Datu-mota abstraktua datuen irudikapen zehatza zehazten ez duen datu-mota bat da. Horren ordez, datu-motaren eragiketetan oinarritutako zehaztapen formal bat erabiltzen da hura deskribatzeko. Zehaztapen bat aplikatzeko emandako arauak bete behar ditu. Adibidez, pila batek Last-In-First-Out erregela jarraitzen duten push/pop eragiketak ditu, eta zehatz inplementatu daiteke zerrenda edo array bat erabiliz. Datu abstraktuak semantika formalean eta programen egiaztapenean erabiltzen dira, eta, ez hain zorrotz, diseinuan.

### Punteroak eta erreferentziak 
Konposatua ez den mota nagusia, honen deribatua erakuslea izanik, datu-mota baten balioak zuzenean beste balio bati erreferentzia egiten dion(edo "seinalatzen du"), ordenagailuko memoriako kokapenaren helbidea erabiliz. Erreferentzia primitiboa da (Eguneroko terminoetan, liburu bateko orrialde zenbaki bat beste bati buruzko datu bat dela esan daiteke). Punteroak, askotan, osoko baten antzeko formatuan gordetzen dira; hala ere, puntero bat erreferentziatzeaz uzteko edo "begiratzeko" garaian, punteroaren balioa ez bada balizkoa programa segituan amaitzea egingo du. Arazo hipotetiko honetaz babesteko, puntero mota bat dagokion mota osoaz bereizitza hartu ohi dira, nahiz eta azpirudikapen bera izan.

### Funtzioak 
Programazio-lengoaia funtzionalek datatipo bereizitzat hartzen dituzte funtzioak, eta aukera ematen dute horrelako balioak aldagaietan biltegiratzeko eta funtzioetara pasatzeko. Paradigma anitzeko hizkuntza batzuek ere, JavaScript lengoaiaren kasuan, baditu mekanismoak funtzioak datu gisa tratatzeko. Gaur egungo sistema gehienak JavaScript motako "funtzio-objektu" sinpletik haratago doaz, eta argumentu eta itzulera-moten arabera bereizitako funtzio-moten familia bat dute, adibidez Int -> Bool izenda daitezke funtzio osoak hartuz eta Boolear bat itzuli. C-n, funtzio bat ez da lehen mailako datu-mota bat, baizik eta funtzioaren punteroak programak manipulatu ditzake. Javak eta C++ek, hasiera batean, ez zuten balio funtzionalik, baina C++11 eta Java 8an gehitu dituzte.

### Eraikitzaileak 
  Eraikitzaile batek mota berriak eraikitzen ditu zaharretatik abiatuta, eta pentsa daiteke operadore batek zero edo gehiago argumentu gisa hartzen dituela eta mota bat sortzen duela. Produktu motak, funtzio motak, potentzia motak eta zerrenda motak eraikitzaile motetan egin daitezke.

## Ikus, gainera 
* Datu-mota osoa
* C datu-motak

## Irakurketa gehiago 
* Parnas, David L.; Shore, John E.; Weiss, David (1976). "Abstract types defined as classes of variables". 1976ko Datuen Abstrakzioari, definizioari eta egiturari buruzko konferentziaren aktak. 149–154. orrialdeak. doi:10.1145/800237.807133. S2CID 14448258.
* Cardelli, Luca; Wegner, Peter (1985ko abendua). "On Understanding Types, Data Abstraction, and Polymorphism" (PDF). ACM Computing Surveys. 17 (4): 471–523. CiteSeerX 10.1.1.117.695. doi:10.1145/6041.6042. ISSN 0360-0300. S2CID 2921816.  Artxibatua PDF artxibatua 2008-12-03.
* Cleaveland, J. Craig (1986). An Introduction to Data Types. Addison-Wesley. ISBN 978-0201119404.

## Erreferentziak