Tietotyyppi ( tyyppi ) on joukko arvoja ja toimintoja näille arvoille (IEEE Std 1320.2-1998) [1] .
Muut määritelmät:
Tyyppi määrittelee mahdolliset arvot ja niiden merkityksen, toiminnot ja kuinka tyypin arvot tallennetaan. Tyyppiteorian mukaan opiskellut . Olennainen osa useimpia ohjelmointikieliä ovat tyyppijärjestelmät , jotka käyttävät tyyppejä jonkinasteisen tyyppiturvallisuuden takaamiseksi .
Tietotyyppi luonnehtii samalla:
Ensimmäistä ominaisuutta voidaan pitää tyypin käsitteen joukkoteoreettisena määritelmänä; toinen on menettelyllinen (tai käyttäytymis-) määritelmä.
Lisäksi ohjelmoinnissa käytetään matalan tason määritelmää tyypistä - muistisolun annetuina mitta- ja rakenneominaisuuksina, joihin voidaan sijoittaa tietty näitä ominaisuuksia vastaava arvo. Tällainen määritelmä on joukkoteoreettisen määritelmän erikoistapaus. Käytännössä siihen liittyy useita tärkeitä ominaisuuksia (johtuen tietokoneen muistin järjestämisen erityispiirteistä ), jotka vaativat erillistä harkintaa .
Joukkoteoreettista määritelmää, erityisesti sen matalan tason muunnelmassa, käytetään yleisimmin pakottavassa ohjelmoinnissa . Proseduurimäärittely liittyy enemmän parametriseen polymorfismiin . Olio-ohjelmointi käyttää proseduurimäärittelyä kuvaillessaan ohjelman komponenttien vuorovaikutusta ja joukkoteoreettista määritelmää kuvaillessaan näiden komponenttien toteutusta tietokoneessa, ottaen huomioon " luokka käyttäytymisenä " ja " luokka-objektina muistissa " " .
Tyypin määrittämistä tietokokonaisuuksille kutsutaan kirjoitukseksi . Tehtävä ja tyyppiyhdenmukaisuuden tarkistus voidaan tehdä etukäteen ( staattinen kirjoitus ), suoraan käytössä ( dynaaminen tyyppikirjoitus ) tai molempien menetelmien yhdistelmä. Tyypit voidaan määrittää "kertakaikkiaan" ( vahva kirjoitus ) tai sallia muuttua ( heikko kirjoitus ).
Tyypit välttävät Russellin paradoksia , erityisesti Church lisäsi tyypit lambda-laskentaan juuri tätä tarkoitusta varten [6] .
Luonnollisessa kielessä kyselypronominit vastaavat kirjoittamisesta .
Erityyppisten tietojen yhtenäistä käsittelyä kutsutaan polymorfismiksi [7] [8] .
Tyyppiturvallisuuden käsite perustuu ensisijaisesti menettelylliseen tyypin määrittelyyn . Useimmat kielet hylkäävät esimerkiksi yrityksen jakaa numero merkkijonolla, koska näille tyypeille ei ole määritetty vastaavaa toimintaa. Heikosti kirjoitetut kielet ovat yleensä matalan tason määritelmiä. Esimerkiksi " numero " ja " tietue " käyttäytyvät eri tavalla, mutta tietokoneen muistissa olevan " tietueen " osoitteen arvolla voi olla sama matalan tason esitys kuin "numerolla". Heikosti kirjoitetut kielet tarjoavat mahdollisuuden katkaista tyyppijärjestelmä määrittämällä arvolle " numero " -käyttäytymistä cast - operaation avulla . Tällaisia temppuja voidaan käyttää ohjelmien tehokkuuden lisäämiseen, mutta niihin liittyy kaatumisriski , joten niitä ei sallita turvallisilla kielillä tai ne ovat tiukasti eristettyjä.
On olemassa erilaisia tyyppiluokituksia ja sääntöjä niiden osoittamiseksi.
Analogisesti matematiikan kanssa tietotyypit jaetaan skalaariin ( primitiivinen ) ja ei- skalaariin ( aggregaatti ). Ei-skalaarityypin arvolla (ei-skalaariarvolla) on monia käyttäjälle näkyviä komponentteja, kun taas skalaarityypin arvolla (skalaariarvo) ei ole. [9] Esimerkkejä ei-skalaarityypistä ovat taulukot , listat ja niin edelleen; esimerkkejä skalaarityypeistä ovat " integer ", " boolean " jne.
Rakenteellisia (aggregaattityyppejä) ei pidä tunnistaa tietorakenteiden kanssa : jotkin tietorakenteet sisältyvät suoraan tiettyihin rakennetyyppeihin, mutta toiset rakentuvat niiden koostumuksen perusteella, useimmiten rekursiivisia. Jälkimmäisessä tapauksessa puhutaan rekursiivisista tietotyypeistä . Esimerkki tietorakenteista, jotka rakennetaan lähes aina rekursiivisen objektikoostumuksen avulla, ovat binääripuut .
Toisen luokituksen mukaan tyypit jaetaan itsenäisiin ja riippuvaisiin . Jälkimmäisen tärkeitä lajikkeita ovat referenssityypit , jotka puolestaan ovat osoittimia . Viittaukset (mukaan lukien osoittimet) ovat ei-komposiittiriippuvaisia tyyppejä, joiden arvot ovat tietokoneen muistissa oleva toisen arvon osoite. Esimerkiksi C- tyypin järjestelmässä tyyppi " osoitin etumerkittömään kokonaislukuun " on kirjoitettu muodossa " unsigned *" , ML -kielessä tyyppi " viittaus etumerkittömään kokonaislukuun " kirjoitetaan muodossa " word ref" .
Tyypit jaetaan myös monomorfisiin ja polymorfisiin (katso tyyppimuuttuja ) .
Loogisilla tai Boolen arvoilla (keksijänsä nimen jälkeen - Boole) voi olla vain toinen kahdesta tilasta - "tosi" tai "epätosi". Eri kielillä ne on merkitty bool, BOOLtai boolean. "Totuus" voidaan merkitä true, TRUEtai #T. "False", vastaavasti false, FALSEtai #F. C:ssä ja C++:ssa mitä tahansa nollasta poikkeavaa lukua pidetään tosina ja nollaa epätosona. Pythonissa joillekin yksittäisille tyypeille on myös määritetty "looginen" arvo. Periaatteessa yksi bitti riittää tyypin toteuttamiseen, mutta mikroprosessorien luonteesta johtuen käytännössä Boolen arvojen koko on yleensä sama kuin konesanan koko .
Kokonaislukutyypit sisältävät numeroiksi tulkittuja arvoja (etumerkillisiä ja etumerkittömiä).
Käytetään edustamaan todellisia (ei välttämättä kokonaislukuja) lukuja. Tässä tapauksessa numero kirjoitetaan muodossa x=a*10^b. Missä 0<=a<1 ja b on jokin kokonaisluku tietyltä alueelta. a kutsutaan mantissaksi, b on järjestys. Mantissa tallentaa useita numeroita desimaalipilkun jälkeen, ja b on tallennettu kokonaan.
Merkkisarja, jota käsitellään muuttujan yhteydessä kokonaisuutena. Eri ohjelmointikielet asettavat erilaisia rajoituksia merkkijonomuuttujille. Merkkijonot voivat sisältää erotussarjoja .
Osoitin on muuttuja, jonka arvoalue koostuu muistipaikkojen osoitteista tai erityisestä arvosta, joka osoittaa, että muuttujaan ei ole tällä hetkellä tallennettu mitään.
Identiteettityyppejä ei tulkita numeroiksi, vaan yksilöllisiksi objektitunnisteiksi. Esimerkiksi FourCC .
Tietotyypit, jotka otetaan huomioon kontekstista ja toteutuksesta tietyllä ohjelmointikielellä riippumatta. Abstraktio matemaattisessa mielessä tarkoittaa, että dataalgebraa käsitellään isomorfismiin asti . Abstrakteja tyyppejä käytetään laajasti ohjelmointimetodologiassa, joka perustuu vaiheittaiseen ohjelmakehitykseen. Suunnitellun ohjelman spesifikaation rakentamisvaiheessa dataalgebra mallintaa aihealueen objektit ratkaistavan ongelman kannalta. Inkrementaalisen tarkennusprosessin aikana dataa konkretisoidaan siirtämällä väliesitykseen, kunnes sen toteutus löydetään käyttämällä käytetyn ohjelmointikielen taustalla olevaa dataalgebraa. On olemassa useita tapoja määritellä abstrakteja tyyppejä: algebrallinen, malli ja aksiomaattinen. Mallilähestymistavassa tietoelementit määritellään eksplisiittisesti. Algebrallinen lähestymistapa käyttää algebrallisten suhteiden menetelmiä, kun taas aksiomaattinen lähestymistapa käyttää loogista formalisointia.
Tyyppi voidaan parametroida toisella tyypillä abstraktion ja parametrisyyden periaatteiden mukaisesti . Esimerkiksi sekvenssien lajittelufunktion toteuttamiseksi ei tarvitse tietää kaikkia sen muodostavien elementtien ominaisuuksia - riittää, että ne mahdollistavat vertailutoiminnon - ja sitten yhdistelmätyyppi " sekvenssi " voidaan määritellä parametrisesti polymorfiseksi . . Tämä tarkoittaa, että sen komponentteja ei määritellä käyttämällä konkreettisia tyyppejä (kuten " kokonaisluku " tai " kokonaislukutaulukko "), vaan tyyppiparametreja. Tällaisia parametreja kutsutaan tyyppimuuttujiksi ( englanniksi type variable ) - niitä käytetään polymorfisen tyypin määrittelyssä samalla tavalla kuin arvoparametreja funktiomäärittelyssä. Betonityyppien korvaaminen polymorfisen tyypin todellisina parametreina tuottaa monomorfisen tyypin. Parametrisesti polymorfinen tyyppi on siis tyyppikonstruktori eli tyyppiaritmeettisten tyyppien operaattori.
Lajittelufunktion määrittäminen parametrisesti polymorfiseksi tarkoittaa, että se lajittelee abstraktin sekvenssin, eli jonkin (tuntemattoman) tyypin elementtien sarjan. Tässä tapauksessa funktion tarvitsee tietää vain kaksi ominaisuutta parametristaan - että se on sekvenssi ja että vertailuoperaatio on määritelty sen elementeille . Parametrien huomioiminen menettelytavalla eikä deklaratiivisella tavalla (eli niiden käyttäminen käyttäytymisen perusteella arvon sijaan) mahdollistaa yhden lajittelufunktion käyttämisen mille tahansa sekvenssille – kokonaislukujonoille, merkkijonojonoille, loogisten sekvenssien sarjoille. arvot ja niin edelleen – ja lisää merkittävästi koodin uudelleenkäyttökerrointa . Dynaaminen kirjoittaminen tarjoaa saman joustavuuden , mutta toisin kuin parametrinen polymorfismi , edelliseen liittyy yleiskustannuksia. Parametrinen polymorfismi on kehittynein Hindley-Milner-tyyppisissä kielissä , eli ML-kielen jälkeläisissä kielissä . Olio -ohjelmoinnissa parametrista polymorfismia kutsutaan geneeriseksi ohjelmoimiseksi .
Huolimatta parametrisen polymorfismin ilmeisistä eduista, joskus tulee tarpeelliseksi tarjota erilainen käyttäytyminen saman yleistyypin eri alatyypeille tai samanlainen käyttäytyminen yhteensopimattomille tyypeille - toisin sanoen jossain ad-hoc-polymorfismin muodossa . Matemaattista perustetta sille ei kuitenkaan ole, joten tyyppiturvallisuusvaatimus vaikeutti käyttöä pitkään. Ad-hoc-polymorfismi toteutettiin parametrisesti polymorfisessa tyyppijärjestelmässä eri temppuilla. Tätä tarkoitusta varten käytettiin joko varianttityyppejä tai parametrisia moduuleja ( funktioita tai ns. “ tyyppi - indeksoituja arvoja ”) , joilla puolestaan on myös useita toteutuksia [ 10] . Haskell - kieli tarjosi tyylikkäämmän ratkaisun tähän ongelmaan.
Jos kyseessä oleva tietokokonaisuus on tyyppi, tyypin määrittäminen sille johtaa käsitteeseen "tyyppityyppi" (" metatyyppi "). Tyyppiteoriassa tätä käsitettä kutsutaan " tyyppityypeiksi " ( eng. kind of a type tai type type ). Esimerkiksi suku " " sisältää kaikki tyypit ja suku " " sisältää kaikki unaarityyppiset konstruktorit . Sukupuolia käytetään nimenomaisesti tyypin täysohjelmoinnissa , esimerkiksi tyyppikonstruktoreina ML -perheen kielissä . ** -> *
Turvallisen polymorfisen tyyppijärjestelmän laajentaminen luokkiin ja tyyppisukuun teki Haskellista ensimmäisen täysin tyypitetyn kielen. Tuloksena oleva tyyppijärjestelmä on vaikuttanut muihin kieliin (esim. Scala , Agda ).
Rajoitettu muoto metatyyppejä on myös läsnä useissa oliopohjaisissa kielissä metaluokkien muodossa . Smalltalk-kielen jälkeläisissä (kuten Pythonissa ) jokainen ohjelman entiteetti on objekti, jolla on tyyppi, joka on itse objekti - metatyypit ovat siis luonnollinen osa kieltä. C++- kielessä RTTI - alijärjestelmä toteutetaan erillään kielen päätyyppijärjestelmästä , joka tarjoaa myös tyyppitietoa erityisrakenteen muodossa.
Metatyyppien dynaamista selvittämistä kutsutaan reflektioksi (ja myös refleksiiviseksi tai itsetutkiskeluksi).
Huomattavin ero todellisen ohjelmoinnin ja muodollisen informaatioteorian välillä on tehokkuuskysymysten huomioiminen ei vain O-merkinnän kannalta, vaan myös tiettyjen vaatimusten toteuttamisen taloudellisen toteutettavuuden kannalta fyysisesti valmistetussa tietokoneessa . Ja ennen kaikkea tämä vaikuttaa laskelmien sallittuun tarkkuuteen: "luvun" käsite tietokoneessa ei käytännössä ole identtinen aritmeettisen luvun käsitteen kanssa . Tietokoneessa olevaa numeroa edustaa muistisolu , jonka koon määrää tietokoneen arkkitehtuuri , ja numeron arvoaluetta rajoittaa tämän solun koko. Esimerkiksi Intel x86 -arkkitehtuurin prosessorit tarjoavat soluja, joiden koko tavuina on asetettu potenssiin kaksi: 1, 2, 4, 8, 16 jne . Setun -arkkitehtuurin prosessorit tarjoavat soluja, joiden ominaisuuksien koko on asetettu kolmen kerrannainen: 1, 3, 6, 9 jne.
Yritys kirjoittaa soluun arvo, joka ylittää sille sallitun enimmäisrajan (joka tunnetaan ), johtaa ylivuotovirheeseen . Jos on tarpeen laskea suuremmilla luvuilla, käytetään erityistä tekniikkaa, nimeltään pitkä aritmetiikka , jota ei voida suorittaa reaaliajassa merkittävän resurssiintensiteetin vuoksi. Tällä hetkellä yleisimmissä tietokonearkkitehtuureissa "natiivi" on solukoko 32 ja 64 bittiä (eli 4 ja 8 tavua ).
Lisäksi kokonaisluvuilla ja reaaliluvuilla on eri esitysmuodot näissä soluissa: ei-negatiiviset kokonaisluvut esitetään suoraan , negatiiviset kokonaisluvut esitetään kahden komplementissa ja reaaliluvut koodataan erityisellä tavalla . Näistä eroista johtuen lukujen " 1" ja " 0.1", jotka teoriassa antavat arvon " 1.1", lisääminen on suoraan mahdotonta tietokoneella. Sen toteuttamiseksi sinun on ensin suoritettava tyyppimuunnos , joka tuottaa 1uuden todellisen tyypin " " arvon kokonaislukutyypin " " arvon perusteella 1.0, ja vasta sitten lisätään " 1.0" ja " 0.1". Reaalilukujen toteutuksen erityispiirteistä johtuen tietokoneessa tällaista muunnosa ei suoriteta ehdottoman tarkasti, mutta tietyllä likimäärällä. Samasta syystä vahvasti kirjoitetut kielet (kuten Standard ML ) käsittelevät todellista tyyppiä tasa-arvotyypeinä (tai identiteettityypeinä) ( Equality type ).
Yhdistelmätyyppien matalan tason esityksessä tietojen kohdistuksen käsite on tärkeä . Korkean tason kielet yleensä eristävät (abstraktoivat) ohjelmoijan tästä ominaisuudesta, mutta se on otettava huomioon linkitettäessä itsenäisesti käännettyjä moduuleja toisiinsa. Jotkut kielet ( C -, C ++ ) tarjoavat kuitenkin mahdollisuuden hallita tyyppien matalan tason esitystä, mukaan lukien kohdistusta. Tällaisia kieliä kutsutaan joskus keskitason kieliksi.
Tietotyypit | |
---|---|
Käsittämätön | |
Numeerinen | |
Teksti | |
Viite | |
Komposiitti | |
abstrakti | |
Muut | |
liittyvät aiheet |