Värde (datavetenskap)
Inom datavetenskap och programvaruprogrammering är ett värde representationen av någon enhet som kan manipuleras av ett program. Medlemmarna av en typ är värdena för den typen.
"Värdet på en variabel" ges av motsvarande mappning i miljön . I språk med tilldelbara variabler blir det nödvändigt att skilja mellan r-värdet (eller innehållet) och l-värdet (eller platsen) för en variabel.
I deklarativa (högnivå) språk måste värden vara referenstransparenta . Detta innebär att det resulterande värdet är oberoende av platsen för uttrycket som behövs för att beräkna värdet. Endast innehållet i platsen (bitarna, oavsett om de är 1 eller 0) och deras tolkning är signifikanta. [ citat behövs ]
Värdekategori
Trots namnet används denna terminologi i C++-språkstandarderna för att kategorisera uttryck, inte värden.
Uppgift: l-värden och r-värden
Vissa språk använder idén om l-värden och r-värden , som härrör från det typiska utvärderingssättet på vänster och höger sida av en uppgiftsförklaring. Ett l-värde hänvisar till ett objekt som kvarstår bortom ett enda uttryck. Ett r-värde är ett tillfälligt värde som inte består utöver det uttryck som använder det.
Begreppet l-värden och r-värden introducerades av Combined Programming Language (CPL). Begreppen i ett uttryck för r-värde, l-värde och r-värde/l-värde är analoga med parameterlägena för ingångsparameter (har ett värde), utgångsparameter (kan tilldelas) och in-/utgångsparameter (har ett värde och kan tilldelas), även om de tekniska detaljerna skiljer sig åt mellan sammanhang och språk.
R-värden och adresser
På många språk, särskilt C-familjen , har l-värden lagringsadresser som är programmatiskt tillgängliga för det pågående programmet (t.ex. via någon adress-till-operatör som "&" i C/C++), vilket betyder att de är variabler eller de- refererade referenser till en viss minnesplats. R-värden kan vara l-värden (se nedan) eller icke-l-värden - en term som endast används för att skilja från l-värden. Betrakta C-uttrycket 4 + 9
. När den exekveras genererar datorn ett heltalsvärde på 13, men eftersom programmet inte uttryckligen har angett var i datorn denna 13 är lagrad, är uttrycket ett icke-l-värde. Å andra sidan, om ett C-program deklarerar en variabel x och tilldelar värdet 13 till x, så har uttrycket x
värdet 13 och är ett l-värde.
I C betydde termen l-värde ursprungligen något som kunde tilldelas (därav namnet, vilket anger att det är på vänster sida av tilldelningsoperatorn), men eftersom det reserverade ordet const (konstant) lades till språket
, termen är nu 'modifierbart l-värde'. I C++11 finns en speciell semantisk glyf &&
(inte att förväxla med &&
-operatorn som används för logiska operationer), för att beteckna användningen/åtkomsten av uttryckets adress endast för kompilatorn ; dvs adressen kan inte hämtas med adress-of &
operatorn under programmets körning (se användningen av flytta semantik ) . Tillägget av rörelsesemantik komplicerade värdeklassificeringstaxonomien genom att lägga till konceptet med ett xvärde (utgående värde) som refererar till ett objekt nära slutet av dess livstid vars resurser kan återanvändas (vanligtvis genom att flytta dem). Detta ledde också till skapandet av kategorierna glvalue(generalized lvalue) som är lvalues och xvalues och prvalues(rena rvalues) som är rvalues som inte är xvalues.
Denna typ av referens kan tillämpas på alla r-värden inklusive icke-l-värden såväl som l-värden. Vissa processorer tillhandahåller en eller flera instruktioner som har ett omedelbart värde , ibland kallat "omedelbart" för kort. Ett omedelbart värde lagras som en del av instruktionen som använder det, vanligtvis för att ladda in, lägga till eller subtrahera från ett register. De andra delarna av instruktionen är opcode och destination. Det senare kan vara underförstått. (Ett icke-omedelbart värde kan finnas i ett register, eller lagras någon annanstans i minnet, vilket kräver att instruktionen innehåller en direkt eller indirekt adress [t.ex. indexregisteradress] till värdet.)
Uttrycket l-värde betecknar (hänvisar till) ett objekt. Ett icke-modifierbart l-värde är adresserbart, men kan inte tilldelas. Ett modifierbart l-värde gör att det designerade objektet kan ändras och undersökas. Ett r-värde är vilket uttryck som helst, ett icke-l-värde är vilket uttryck som helst som inte är ett l-värde. Ett exempel är ett "omedelbart värde" (se nedan) och följaktligen inte adresserbart..
På assemblerspråk
Ett värde kan vara praktiskt taget vilken typ av data som helst av en given datatyp , till exempel en sträng, en siffra, en enda bokstav.
Processorer stöder ofta mer än en storlek av omedelbar data, t.ex. 8 eller 16 bitar, som använder en unik opkod och minnesminne för varje instruktionsvariant. Om en programmerare tillhandahåller ett datavärde som inte passar, utfärdar assemblern ett felmeddelande "Out of range". De flesta assemblerare tillåter att ett omedelbart värde uttrycks som ASCII , decimal , hexadecimal , oktal eller binär data. Således är ASCII-tecknet 'A'
detsamma som 65
eller 0x41
. Byteordningen , beroende på assembler och datorarkitektur.
Anteckningar
- Mitchell, John C. (1996). Grunder för programmeringsspråk . MIT Press. ISBN 0-262-13321-0 .
- Strachey, Christopher (2000). "Grundläggande begrepp i programmeringsspråk". Högre ordning och symbolisk beräkning . 13 : 11–49. doi : 10.1023/A:1010000313106 . S2CID 14124601 .