Quando si progetta e si impianta un linguaggio di programmazione orientato agli oggetti, ad un certo punto si deve fare una scelta sull'implementazione di tipi fondamentali (come int
, float
, double
o equivalenti) come classi o qualcos'altro. Chiaramente, le lingue nella famiglia C hanno la tendenza non a definirle come classi (Java ha tipi primitivi speciali, C # li implementa come strutture immutabili, ecc.)
Riesco a pensare a un vantaggio molto importante quando i tipi fondamentali sono implementati come classi (in un sistema di tipi con una gerarchia unificata): questi tipi possono essere sottotipi Liskov appropriati del tipo root. Pertanto, evitiamo di complicare la lingua con boxing / unboxing (esplicito o implicito), tipi di wrapper, regole di varianza speciali, comportamento speciale, ecc.
Naturalmente, posso parzialmente capire perché i progettisti di linguaggio decidono il loro modo di agire: le istanze di classe tendono ad avere un overhead spaziale (perché le istanze possono contenere un vtable o altri metadati nel loro layout di memoria), quelle primitive / structs don ' t necessario avere (se la lingua non consente l'ereditarietà su quelli).
L'efficienza spaziale (e la migliorata localizzazione spaziale, specialmente negli array di grandi dimensioni) è l'unica ragione per cui i tipi fondamentali sono spesso classi non ?
In genere ho pensato che la risposta fosse sì, ma i compilatori hanno algoritmi di analisi di escape e quindi possono dedurre se possono (selettivamente) omettere l'overhead spaziale quando un'istanza (qualsiasi istanza, non solo un tipo fondamentale) è provata essere strettamente locale.
Il testo sopra è sbagliato o c'è qualcos'altro che mi manca?