Al diseñar y implenting un lenguaje de programación orientado a objetos, en algún momento uno debe tomar una decisión sobre la aplicación de los tipos fundamentales (como int
, float
, double
o equivalentes) como clases o algo más. Claramente, los lenguajes en la familia C tienden a no definirlos como clases (Java tiene tipos primitivos especiales, C # los implementa como estructuras inmutables, etc.).
Puedo pensar en una ventaja muy importante cuando los tipos fundamentales se implementan como clases (en un sistema de tipos con una jerarquía unificada): estos tipos pueden ser subtipos de Liskov adecuados del tipo raíz. Por lo tanto, evitamos complicar el lenguaje con boxing / unboxing (ya sea explícito o implícito), tipos de envoltura, reglas de variación especiales, comportamiento especial, etc.
Por supuesto, puedo entender parcialmente por qué los diseñadores de idiomas deciden la forma en que lo hacen: las instancias de clase tienden a tener una sobrecarga espacial (porque las instancias pueden contener una vtable u otros metadatos en su diseño de memoria), que las primitivas / estructuras no necesitan tener (si el idioma no permite la herencia en esos).
¿Es la eficiencia espacial (y la localidad espacial mejorada, especialmente en matrices grandes) la única razón por la cual los tipos fundamentales a menudo no son clases?
En general, he asumido que la respuesta es sí, pero los compiladores tienen algoritmos de análisis de escape y, por lo tanto, pueden deducir si pueden omitir (selectivamente) la sobrecarga espacial cuando se demuestra que una instancia (cualquier instancia, no solo un tipo fundamental) es estrictamente local.
¿Está mal lo anterior o hay algo más que me falta?
fuente