Nella progettazione e implenting un linguaggio di programmazione orientato agli oggetti, ad un certo punto si deve fare una scelta circa l'attuazione di tipi fondamentali (come int
, float
, double
o equivalenti) come classi o qualcos'altro. Chiaramente, i linguaggi della famiglia C hanno la tendenza a non definirli come classi (Java ha tipi primitivi speciali, C # li implementa come strutture immutabili, ecc.).
Posso 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 di Liskov del tipo root. Pertanto, evitiamo di complicare la lingua con boxe / unboxing (esplicito o implicito), tipi di wrapper, regole speciali di varianza, comportamento speciale, ecc.
Naturalmente, posso parzialmente capire perché i progettisti del linguaggio decidono il loro modo di fare: le istanze di classe tendono ad avere un sovraccarico spaziale (perché le istanze possono contenere una vtable o altri metadati nel loro layout di memoria), che le primitive / le strutture non devono avere (se la lingua non consente l'ereditarietà su quelli).
L'efficienza spaziale (e una migliore localizzazione spaziale, specialmente in array di grandi dimensioni) è l'unica ragione per cui i tipi fondamentali non sono spesso classi?
In genere ho ipotizzato 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) si dimostra rigorosamente Locale.
Quanto sopra è sbagliato o c'è qualcos'altro che mi manca?