Che cos'è una variabile? (o anche "passaggio by-? in Python")
Inviato: 06/01/2020, 00:53
Ciao.
1) Per il linguaggio C++ (o in C) che cos'è una variabile? (mi interessa capirlo "a basso livello"). In altre parole, mi rimbomba nella testa che "le istanze di tipi primitivi sono storate nello stack, mentre gli oggetti più complessi possono essere messi nello heap", ma che significa esattamente ciò? La riga di codice
2) Che accade in Java? Per quanto ne so, le variabili lì sono effettivamente dei contenitori per un indirizzo, di una cosa che però è automaticamente storata nel posto più consono (secondo il compilatore, non secondo il programmatore). Se però consideriamo le chiamate dei metodi
su un oggetto di tipo
ci accorgiamo di alcune stranezze. Il motivo di tali è la scelta progettuale di nascondere i puntatori e gli operatori
3) Veniamo a Python (2.7). Non mi è molto chiara la cosa. Il prof. non vuole sentir chiamare le variabili "variabili" (tantomeno "puntatori"), ma "riferimenti". Mi sembra però che Python non superi lo
Questa cosa si può fare eccome in C++:
appunto perché in C++ esistono i riferimenti (o alias) veri, non come in Java. E in Python, cosa sono le variabili (o chi per loro)?
(scusate per gli abusi di linguaggio: è da un sacco che non tocco queste cose).
1) Per il linguaggio C++ (o in C) che cos'è una variabile? (mi interessa capirlo "a basso livello"). In altre parole, mi rimbomba nella testa che "le istanze di tipi primitivi sono storate nello stack, mentre gli oggetti più complessi possono essere messi nello heap", ma che significa esattamente ciò? La riga di codice
int p = 0;
"dichiara e inizializza una variabile" p
: posso vedere p
esattamente come il numero 0
? O è più giusto pensare a essa come ad un contenitore per l'indirizzo di un oggetto 0
nello stack? (Non mi pare di ricordare di "un'indirizzo di una cosa nello stack", però...).2) Che accade in Java? Per quanto ne so, le variabili lì sono effettivamente dei contenitori per un indirizzo, di una cosa che però è automaticamente storata nel posto più consono (secondo il compilatore, non secondo il programmatore). Se però consideriamo le chiamate dei metodi
- Codice:
public static void foo_1(Foo f) {
f = new Foo();
}
- Codice:
public static void foo_2(Foo f) {
f.fuckUp();
}
su un oggetto di tipo
Foo
avente un metodo fuckUp
abbastanza autoesplicativo, ad esempio come- Codice:
Foo f = new Foo();
foo_1(f);
// f è ancora lo stesso di prima
// ma...
foo_2(f);
// ...ora no >:S
ci accorgiamo di alcune stranezze. Il motivo di tali è la scelta progettuale di nascondere i puntatori e gli operatori
*
e ->
di dereference; più il fatto che i riferimenti in stile C++ in Java non ci sono: il che rende "strano" il comportamento di cose passate by-value (unica "modalità di passaggio" di cui Java dispone, in ogni caso). Sbaglio? È per questo che certe persone inveiscono contro chi usa il termine "puntatore", riguardo a Java?3) Veniamo a Python (2.7). Non mi è molto chiara la cosa. Il prof. non vuole sentir chiamare le variabili "variabili" (tantomeno "puntatori"), ma "riferimenti". Mi sembra però che Python non superi lo
swap
-test (non posso definire una funzione swap
che (pseudocodice)- Codice:
swap(a,b) {
tmp = a
a = b
b = tmp
}
a, b = 10,57
swap(a,b)
// a,b sono ora 57,10
Questa cosa si può fare eccome in C++:
- Codice:
void swap(Foo& a, Foo& b) {
Foo tmp = a;
a = b;
b = tmp;
}
appunto perché in C++ esistono i riferimenti (o alias) veri, non come in Java. E in Python, cosa sono le variabili (o chi per loro)?
(scusate per gli abusi di linguaggio: è da un sacco che non tocco queste cose).