Un tipo di valore è uno le cui istanze sono a loro volta salvate in variabili. Un tipo di riferimento è un tipo le cui istanze vengono salvate da qualche parte e le variabili contengono solo gli indirizzi delle istanze.
Alcune lingue, come Java, hanno entrambi i tipi. Ad esempio String è un tipo di riferimento e int è un tipo di valore.
public static void main(String[] args) {
int i; // allocates 4 bytes on the stack, to store an actual integer value
String s; // allocates 8 bytes on the stack (on 64 bit systems) to store an address
}
Questo è possibile in lingue tipizzate staticamente, perché il tipo di i non cambierà; quindi dopo aver assegnato 4 byte per questo, possiamo inserire qualsiasi valore intero.
Tuttavia, cosa accadrebbe se il tipo di i fosse dinamico? Ad esempio in Python, è possibile:
def demonstrate():
i = 20
name = 'george'
if input() == 'Make a string':
i = 'hello'
print('i is ' + i)
Tutti i tipi di Python sono tipi di riferimento. Tuttavia supponiamo che int di Python fosse un tipo di valore (e str ancora un tipo di riferimento) e come risultato proveremmo a mettere effettivamente il numero 20 in i . Nello stack dopo i , inseriamo un riferimento di 8 byte a 'george' .
Dopodiché, potremmo voler cambiare il valore di i in 'hello' . Ciò significa riallocarne lo spazio nello stack, anziché la stanza precedentemente allocata per il numero 20 .
La mia domanda è: è possibile (o pratico)? Esistono linguaggi dinamici che supportano tipi di valore? Se sì, come?