Datatype

En datatype ( type ) er et sæt værdier og operationer på disse værdier (IEEE Std 1320.2-1998) [1] .

Andre definitioner:

En type definerer de mulige værdier og deres betydning, operationer og hvordan værdierne af typen opbevares. Studeret efter typeteori . En integreret del af de fleste programmeringssprog er typesystemer , som bruger typer til at give en vis grad af typesikkerhed .

Definition

Datatypen karakteriserer samtidig:

Den første egenskab kan ses som en mængdeteoretisk definition af begrebet type; den anden er som en proceduremæssig (eller adfærdsmæssig) definition.

I programmering anvendes derudover en lav-niveau definition af en type - som givne dimensionelle og strukturelle karakteristika for en hukommelsescelle, hvori en vis værdi svarende til disse karakteristika kan placeres. En sådan definition er et specialtilfælde af den mængdeteoretiske. I praksis er en række vigtige egenskaber forbundet med det (på grund af det særlige ved organisationen af ​​computerhukommelse ), der kræver særskilt overvejelse .

Den set-teoretiske definition, især i dens lavniveauvariant, bruges mest i imperativ programmering . Procedurel definition er mere forbundet med parametrisk polymorfi . Objektorienteret programmering bruger henholdsvis proceduredefinition, når den beskriver interaktionen mellem programkomponenter, og set-teoretisk definition, når den beskriver implementeringen af ​​disse komponenter på en computer, under hensyntagen til " klasse-som-adfærd " og " klasse-som-objekt i hukommelsen " " .

Operationen med at tildele en type til informationsenheder kaldes indtastning . Tildeling og typekonsistenskontrol kan udføres på forhånd ( statisk typning ), direkte ved brug ( dynamisk typning ) eller en kombination af begge metoder. Typer kan tildeles "en gang for alle" ( stærk indtastning ) eller lov til at ændre sig ( svag indtastning ).

Typer undgår Russells paradoks , især introducerede Church typer i lambdaregningen til netop dette formål [6] .

I naturligt sprog er spørgende stedord ansvarlige for at skrive .

Den ensartede behandling af data af forskellige typer kaldes polymorfi [7] [8] .

Begrebet typesikkerhed bygger primært på proceduremæssig typedefinition. For eksempel vil et forsøg på at dividere et tal med en streng blive afvist af de fleste sprog, da der ikke er defineret en tilsvarende adfærd for disse typer. Svagt indtastede sprog har en tendens til at være definitioner på lavt niveau. For eksempel har " nummer " og " record " forskellig adfærd, men værdien af ​​adressen på " record " i computerens hukommelse kan have samme lavniveaurepræsentation som "nummer". Svagt indtastede sprog giver mulighed for at bryde typesystemet ved at tildele " nummer " adfærd til en værdi gennem en cast - operation . Sådanne tricks kan bruges til at øge effektiviteten af ​​programmer, men medfører risiko for nedbrud og er derfor ikke tilladt på sikre sprog eller er strengt isolerede.

Klassifikation

Der er forskellige klassifikationer af typer og regler for deres tildeling.

Analogt med matematik opdeles datatyper i skalær ( primitiv ) og ikke- skalær ( aggregeret ). En værdi af en ikke-skalær type (en ikke-skalær værdi) har mange brugersynlige komponenter, mens en værdi af en skalar type (en skalær værdi) ikke har. [9] Eksempler på en ikke-skalær type er arrays , lister og så videre; eksempler på en skalartype er " heltal ", " boolesk " osv.

Strukturelle (aggregerede) typer bør ikke identificeres med datastrukturer : nogle datastrukturer er direkte inkorporeret af visse strukturelle typer, men andre er bygget gennem deres sammensætning, oftest rekursive. I sidstnævnte tilfælde taler man om rekursive datatyper . Et eksempel på datastrukturer, der næsten altid bygges gennem objektsammensætning af en rekursiv type, er binære træer .

Ifølge en anden klassifikation er typer opdelt i uafhængige og afhængige . Vigtige sorter af sidstnævnte er referencetyper , som igen er pejlemærker . Referencer (inklusive pointere) er en ikke-sammensat afhængig type, hvis værdier er adressen i computerens hukommelse af en anden værdi. I C -typesystemet skrives f.eks . typen " peger til et heltal uden fortegn " som " unsigned *" , i ML -sproget skrives typen " henvisning til et heltal uden fortegn " som " word ref" .

Typer opdeles også i monomorfe og polymorfe (se typevariabel ).

Nogle almindelige datatyper

Boolsk type

Logiske eller boolske værdier (efter navnet på deres opfinder - Boole), kan kun have en af ​​to tilstande - "sand" eller "falsk". På forskellige sprog er de betegnet boolmed , BOOLeller boolean. "Sandhed" kan betegnes som true, TRUEeller #T. "False", henholdsvis false, FALSEeller #F. I C og C++ behandles ethvert tal, der ikke er nul, som sandt, og nul behandles som falsk. I Python er nogle enkelte typer også tildelt en "boolesk" værdi. I princippet er en bit nok til at implementere typen, men på grund af mikroprocessorernes natur er størrelsen af ​​boolske værdier normalt lig med størrelsen af ​​et maskinord i praksis .

Heltalstyper

Heltalstyper indeholder værdier fortolket som tal (med og uden fortegn).

Flydende kommatal

Bruges til at repræsentere reelle (ikke nødvendigvis heltal) tal. I dette tilfælde skrives tallet som x=a*10^b. Hvor 0<=a<1 og b er et helt tal fra et bestemt område. a kaldes mantissen, b er rækkefølgen. Mantissen gemmer flere cifre efter decimaltegnet, og b gemmes fuldt ud.

Strengtyper

En sekvens af tegn, der behandles som en helhed i sammenhæng med en variabel. Forskellige programmeringssprog pålægger forskellige begrænsninger på strengvariabler. Strenge kan indeholde escape-sekvenser .

Pointers

En pointer er en variabel, hvis værdiområde består af adresser på hukommelsesplaceringer eller en speciel værdi, der angiver, at intet i øjeblikket er gemt i variablen.

Identifikationstyper

Identitetstyper tolkes ikke som et tal, men som en unik objektidentifikator. For eksempel FourCC .

Abstrakte datatyper

Datatyper, der overvejes uanset kontekst og implementering i et bestemt programmeringssprog. Abstraktion i matematisk forstand betyder, at dataalgebraen behandles op til isomorfi . Abstrakte typer er meget udbredt i programmeringsmetodologi baseret på trin-for-trin programudvikling. På stadiet med at konstruere specifikationen af ​​det designede program modellerer dataalgebra objekterne i emneområdet i forhold til det problem, der skal løses. I processen med trinvis forfining konkretiseres data ved at overføres til mellemliggende repræsentationer, indtil implementeringen er fundet ved hjælp af den underliggende dataalgebra i det anvendte programmeringssprog. Der er flere måder at definere abstrakte typer på: algebraisk, model og aksiomatisk. I modeltilgangen defineres dataelementer eksplicit. Den algebraiske tilgang bruger metoder til algebraiske relationer, mens den aksiomatiske tilgang bruger logisk formalisering.

Eksempler

Selvansøgning

En type kan parameteriseres af en anden type i overensstemmelse med principperne om abstraktion og parametrisitet . For at implementere en funktion til sortering af sekvenser er det for eksempel ikke nødvendigt at kende alle egenskaberne af dets bestanddele - det er kun nødvendigt, at de tillader en sammenligningsoperation - og så kan den sammensatte type " sekvens " defineres som parametrisk polymorf . Dette betyder, at dets komponenter ikke defineres ved hjælp af konkrete typer (såsom " heltal " eller " række af heltal "), men typeparametre. Sådanne parametre kaldes typevariable ( engelsk  typevariabel ) - de bruges i definitionen af ​​en polymorf type på samme måde som værdiparametre i en funktionsdefinition. At erstatte betontyper som faktiske parametre for en polymorf type producerer en monomorf type. En parametrisk polymorf type er således en typekonstruktør , det vil sige en operator på typer i typearitmetik.

At definere en sorteringsfunktion som parametrisk polymorf betyder, at den sorterer en abstrakt sekvens, det vil sige en sekvens af elementer af en eller anden (ukendt) type. I dette tilfælde behøver funktionen kun at kende to egenskaber om dens parameter - at det er en sekvens , og at sammenligningsoperationen er defineret for dens elementer . At overveje parametre på en proceduremæssig snarere end deklarativ måde (det vil sige at bruge dem baseret på adfærd snarere end værdi) giver dig mulighed for at bruge en enkelt sorteringsfunktion for alle sekvenser - for sekvenser af heltal, for sekvenser af strenge, for sekvenser af sekvenser af boolesk værdier og så videre— og øger kodegenbrugsfaktoren markant . Dynamisk skrivning giver den samme fleksibilitet , men i modsætning til parametrisk polymorfi kommer førstnævnte med overhead. Parametrisk polymorfi er mest udviklet i Hindley-Milner-type sprog , det vil sige efterkommere af ML-sproget . I objektorienteret programmering kaldes parametrisk polymorfi generisk programmering .

På trods af de åbenlyse fordele ved parametrisk polymorfi bliver det nogle gange nødvendigt at give forskellig adfærd for forskellige undertyper af den samme generelle type, eller lignende adfærd for inkompatible typer - det vil sige i en eller anden form for ad-hoc polymorfi . Der er dog ikke noget matematisk grundlag for det, så typesikkerhedskravet gjorde det svært at bruge i lang tid. Ad-hoc polymorfi blev implementeret inden for et parametrisk polymorf type system gennem forskellige tricks. Til dette formål blev der brugt enten varianttyper eller parametriske moduler ( funktioner eller de såkaldte " type - indekserede værdier "), som til gengæld også har en række implementeringer [ 10] .  Typeklasser , introduceret i Haskell-sproget , gav en mere elegant løsning på dette problem.

Hvis den pågældende informationsenhed er en type, vil tildeling af en type til den føre til konceptet om en " type type " (" metatype "). I typeteorien kaldes dette begreb " type typer " ( eng.  type of a type eller type kind ). For eksempel inkluderer slægten " *" alle typer, og slægten " * -> *" inkluderer alle unære typekonstruktører . Køn bruges eksplicit i typefuld programmering  , for eksempel som typekonstruktører sprog i ML -familien .

Udvidelsen af ​​det sikre polymorfe typesystem til klasser og typeslægter gjorde Haskell til det første fuldt maskinskrevne sprog. Det resulterende typesystem har påvirket andre sprog (f.eks. Scala , Agda ).

En begrænset form for metatyper er også til stede i en række objektorienterede sprog i form af metaklasser . I efterkommerne af Smalltalk-sproget (såsom Python ) er hver entitet i et program et objekt, der har en type, der selv er et objekt - således er metatyper en naturlig del af sproget. I C++- sproget er RTTI - undersystemet implementeret separat fra sprogets hovedtypesystem , som også giver typeinformation i form af en speciel struktur.

Den dynamiske belysning af metatyper kaldes refleksion (og også refleksivitet eller introspektion).

Computerrepræsentation

Den mest bemærkelsesværdige forskel mellem ægte programmering og formel informationsteori er overvejelsen af ​​effektivitetsspørgsmål, ikke kun med hensyn til O-notation , men også ud fra synspunktet om den økonomiske gennemførlighed af at implementere visse krav i en fysisk fremstillet computer . Og først og fremmest påvirker dette den tilladte nøjagtighed af beregninger: Begrebet "tal" i en computer er i praksis ikke identisk med begrebet et tal i aritmetik . Tallet i computeren er repræsenteret af en hukommelsescelle , hvis størrelse bestemmes af computerens arkitektur , og rækkevidden af ​​værdier af tallet er begrænset af størrelsen af ​​denne celle. For eksempel giver processorer af Intel x86 -arkitekturen celler, hvis størrelse i bytes er sat til en potens på to: 1, 2, 4, 8, 16 osv. Processorer i Setun- arkitekturen giver celler, hvis størrelse i træk er indstillet til en multiplum af tre: 1, 3, 6, 9 osv.

Et forsøg på at skrive til en celle en værdi, der overskrider den maksimalt tilladte grænse for den (som er kendt ) resulterer i en overløbsfejl . Hvis det er nødvendigt at beregne på større tal, anvendes en speciel teknik, kaldet lang aritmetik , som på grund af den betydelige ressourceintensitet ikke kan udføres i realtid. For de mest almindelige computerarkitekturer på nuværende tidspunkt er "native" cellestørrelsen på 32 og 64 bit (det vil sige 4 og 8 bytes ).

Derudover har heltal og reelle tal forskellige repræsentationer i disse celler: ikke-negative heltal er repræsenteret direkte , negative heltal er repræsenteret i to's komplement , og reelle tal er kodet på en særlig måde . På grund af disse forskelle er tilføjelsen af ​​tal " 1" og " 0.1", som i teorien giver værdien " 1.1", direkte umulig på en computer. For at implementere det skal du først udføre en typekonvertering , der genererer en 1ny værdi af den rigtige type " " baseret på værdien af ​​heltalstypen " 1.0", og først derefter tilføje " 1.0" og " 0.1". På grund af detaljerne i implementeringen af ​​reelle tal på en computer udføres en sådan transformation ikke helt nøjagtigt, men med en vis grad af tilnærmelse. Af samme grund behandler stærkt indtastede sprog (såsom Standard ML ) den virkelige type som lighedstyper (eller identitetstyper) ( Equality type ).

For repræsentationen på lavt niveau af sammensatte typer er begrebet datajustering vigtigt . Sprog på højt niveau isolerer (abstrakt) normalt programmøren fra denne egenskab, men det skal tages i betragtning, når uafhængigt kompilerede moduler forbindes med hinanden. Nogle sprog ( C -, C ++ ) giver dog mulighed for at kontrollere lavniveaurepræsentationen af ​​typer, inklusive justering. Sådanne sprog kaldes undertiden mellemsprog.

Noter

  1. IEEE Std 1320.2-1998 (R2004) IEEE Standard for Conceptual Modeling Language Syntax and Semantics for IDEF1X97:
    et sæt værdier og operationer på disse værdier
  2. ISO/IEC/IEEE 24765-2010 Systems and software engineering - Ordforråd Arkiveret 17. juni 2016 på Wayback Machine :
    en klasse af data, karakteriseret ved medlemmerne af klassen og de operationer, der kan anvendes på dem
  3. IEEE Std 1320.2-1998 (R2004) IEEE Standard for Conceptual Modeling Language Syntax and Semantics for IDEF1X97:
    en kategorisering af et abstrakt sæt af mulige værdier, karakteristika og sæt af operationer for en attribut
  4. ISO/IEC 19500-2:2003, Informationsteknologi - Åben distribueret behandling - Del 2: General Inter-ORB Protocol (GIOP)/Internet Inter-ORB Protocol (IIOP):
    en kategorisering af værdier operationsargumenter, der typisk dækker både adfærd og repræsentation
  5. C. J. Dato . Om de logiske forskelle mellem typer, værdier og variabler // Dato på databasen: Writings 2000-2006, Apress, 2006, ISBN 978-1-59059-746-0
  6. Harrison J. Introduktion til funktionel programmering  = http://www.cl.cam.ac.uk/Teaching/Lectures/funprog-jrh-1996/ . - 1997. Arkiveret 11. januar 2015.
  7. Strachey, 1967 , 3.6.4. Polymorfisme, s. 36-37.
  8. Cardelli, 1991 , 2. Typefulde sprog, s. 5.
  9. Dato K.J., 2005 .
  10. Typeindekserede værdier . Hentet 15. juli 2014. Arkiveret fra originalen 21. april 2016.

Litteratur