Lors de la conception et implenting un langage de programmation orienté objet, à un un point doit faire un choix sur la mise en œuvre des types fondamentaux (comme int
, float
, double
ou équivalents) sous forme de classes ou autre chose. De toute évidence, les langages de la famille C ont tendance à ne pas les définir comme des classes (Java a des types primitifs spéciaux, C # les implémente comme des structures immuables, etc.).
Je peux penser à un avantage très important lorsque les types fondamentaux sont implémentés en tant que classes (dans un système de types avec une hiérarchie unifiée): ces types peuvent être des sous-types Liskov appropriés du type racine. Ainsi, nous évitons de compliquer le langage avec la boxe / unboxing (explicite ou implicite), les types de wrapper, les règles de variance spéciales, le comportement spécial, etc.
Bien sûr, je peux comprendre en partie pourquoi les concepteurs de langage décident de leur façon: les instances de classe ont tendance à avoir une surcharge spatiale (car les instances peuvent contenir une vtable ou d'autres métadonnées dans leur disposition de mémoire), que les primitives / structures n'ont pas besoin de avoir (si la langue ne permet pas l'héritage sur ceux-ci).
L'efficacité spatiale (et l'amélioration de la localisation spatiale, en particulier dans les grands tableaux) est-elle la seule raison pour laquelle les types fondamentaux ne sont souvent pas des classes?
J'ai généralement supposé que la réponse était oui, mais les compilateurs ont des algorithmes d'analyse d'échappement et ils peuvent donc déduire s'ils peuvent (sélectivement) omettre la surcharge spatiale lorsqu'une instance (n'importe quelle instance, pas seulement un type fondamental) se révèle être strictement local.
Est-ce que ce qui précède est faux ou y a-t-il autre chose qui me manque?