Valore (informatica)
In informatica e nella programmazione software, un valore è la rappresentazione di un'entità che può essere manipolata da un programma. I membri di un tipo di dato rappresentano i valori di quel tipo.[1]
Il valore di una variabile è determinato dalla mappatura corrispondente nel contesto di tipizzazione dei dati.[2] Nei linguaggi con variabili assegnabili diventa necessario distinguere tra il contenuto (r-value) e la posizione (l-value) di una variabile.[3]
Nei linguaggi dichiarativi di alto livello i valori devono essere referenzialmente trasparenti. Ciò significa che il valore risultante è indipendente dalla posizione dell'espressione necessaria per calcolare il valore. Solo i contenuti della posizione (ovvero i bit, a prescindere se valgano 1 o 0) e la loro interpretazione sono significativi.
Categorie di valore
[modifica | modifica wikitesto]A dispetto del nome, negli standard del linguaggio di programmazione C++ questa terminologia viene impiegata per categorizzare le espressioni e non i valori.[4]
Assegnazione: l-value e r-value
[modifica | modifica wikitesto]Alcuni linguaggi adottano l'idea di l-value (left value) e r-value (right value), derivanti dalla modalità tipica di valutazione sui lati sinistro e destro di una dichiarazione di assegnazione. Un l-value si riferisce ad un oggetto che persiste oltre una singola espressione, mentre un r-value è un valore temporaneo che non persiste oltre l'espressione che lo utilizza.[5]
Le nozioni di l-value e r-value vennero introdotte dal Combined Programming Language (CPL). Le nozioni in un'espressione di r-value, l-value e r-value/l-value sono analoghe alle modalità dei parametri rispettivamente di input (ha un valore), di output (può essere assegnato) e di input/output (ha un valore e può essere assegnato), sebbene i dettagli tecnici differiscano tra contesti e linguaggi.
R-value ed indirizzi
[modifica | modifica wikitesto]In molti linguaggi, in particolare nella famiglia di linguaggi C, gli l-value hanno degli indirizzi di archiviazione che sono programmaticamente accessibili al programma in esecuzione (ad esempio, tramite qualche operatore di indirizzo come "&" in C/C++), il che significa che sono variabili o riferimenti dereferenziati ad una determinata posizione di memoria. Gli r-value possono essere l-value o non l-value (un termine usato solo per distinguerli dagli l-value). Si consideri ad esempio l'espressione 4 + 9
nel linguaggio C. Quando viene eseguita, il computer genera un valore intero pari a 13, ma poiché il programma non ha designato esplicitamente dove è memorizzato nel computer questo valore, l'espressione è un non l-value. Al contrario, se un programma in C dichiara una variabile x e assegna il valore di 13 a x, allora l'espressione x
ha un valore pari a 13 ed è un l-value.
In C, il termine l-value originariamente significava qualcosa a cui poteva essere assegnato (da qui il nome, indicante il fatto che si trova sul lato sinistro dell'operatore di assegnazione), ma poiché la parola riservata const
(costante) era stata aggiunta al linguaggio, questo termine viene oggi denominato "l-value modificabile". In C++11 esiste uno speciale glifo semantico &&
(da non confondere con l'operatore &&
usato per le operazioni logiche) per denotare l'uso/accesso dell'indirizzo dell'espressione solo per il compilatore; per esempio, l'indirizzo non può essere recuperato usando l'operatore address-of &
durante l'esecuzione del programma. L'aggiunta della semantica di spostamento ha complicato la tassonomia della classificazione dei valori, aggiungendovi il concetto di un xvalue (valore in scadenza), che si riferisce a un oggetto prossimo alla fine della sua vita le cui risorse possono essere riutilizzate (tipicamente spostandole). Ciò ha portato anche alla creazione delle categorie (definite nello standard C++17[6]) glvalue (l-value generalizzato), in cui ci sono lvalue e xvalue, e prvalues (r-value puri), in cui ci sono r-value che non sono xvalue.[7]
Questo tipo di riferimento può essere applicato a tutti gli r-value, compresi i non l-value così come gli l-value. Alcuni processori forniscono una o più istruzioni che assumono un valore immediato. Un valore immediato viene memorizzato come parte dell'istruzione che lo utilizza, solitamente per caricare, aggiungere o sottrarre da un registro. Le altre parti dell'istruzione sono l'opcode e la destinazione (quest'ultima può essere implicita). Un valore non immediato può risiedere in un registro o essere memorizzato altrove nella memoria, richiedendo che l'istruzione contenga un indirizzo diretto o indiretto (ad esempio l'indirizzo del registro indice) al valore.
L'espressione l-value designa un oggetto. Un l-value non modificabile è indirizzabile, ma non assegnabile. Un l-value modificabile consente di modificare ed esaminare l'oggetto designato. Un r-value è una qualsiasi espressione, mentre un non l-value è una qualsiasi espressione che non è un l-value. Un tipico esempio è un valore immediato, che di conseguenza non è indirizzabile.
Note
[modifica | modifica wikitesto]- ^ Mitchell, p. 9.
- ^ (EN) Alfred V. Aho, Monica S. Lam, Ravi Sethi e Jeffrey D. Ullman, Compilers: Principles, Techniques, and Tools, 1986, ISBN 0-201-10088-6.
- ^ Mitchell, pp. 389-390.
- ^ (EN) ISO/IEC 14882:2017 Programming languages — C++, su iso.org, 2017. URL consultato il 15 luglio 2023.
- ^ (EN) Lvalues and Rvalues (C++), su Microsoft Developer Network (archiviato dall'url originale l'11 aprile 2016).
- ^ (EN) Lvalues and Rvalues (C++), su Microsoft Learn. URL consultato il 15 luglio 2023.
- ^ (EN) William M. Miller, A Taxonomy of Expression Value Categories (PDF), 12 marzo 2010. URL consultato il 15 luglio 2023.
Bibliografia
[modifica | modifica wikitesto]- (EN) John C. Mitchell, Foundations for Programming Languages, The MIT Press, 1996, ISBN 0-262-13321-0.
- (EN) Christopher Strachey, Fundamental Concepts in Programming Languages, in Higher-Order and Symbolic Computation, vol. 13, 2000, pp. 11-49, DOI:10.1023/A:1010000313106.
Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Value Object, su c2.com.
- (EN) Core J2EE Patterns - Transfer Object, su oracle.com.