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?