Bei der Konzeption und implenting eine objektorientierte Programmiersprache, muss irgendwann man eine Wahl trifft über grundlegende Arten der Umsetzung (wie int
, float
, double
oder Äquivalente) als Klassen oder etwas anderes. Offensichtlich Sprachen in der C - Familie eine Tendenz haben , nicht sie als Klassen zu definieren (Java hat spezielle Urtyp, C # implementiert sie als unveränderliche Strukturen, etc).
Ich kann mir einen sehr wichtigen Vorteil vorstellen, wenn grundlegende Typen als Klassen implementiert werden (in einem Typsystem mit einer einheitlichen Hierarchie): Diese Typen können richtige Liskov-Subtypen des Stammtyps sein. Auf diese Weise vermeiden wir, dass die Sprache durch (explizites oder implizites) Ein- und Auspacken, Wrapper-Typen, spezielle Varianzregeln, spezielles Verhalten usw. kompliziert wird.
Natürlich kann ich teilweise nachvollziehen, warum Sprachentwickler entscheiden, wie sie vorgehen: Klasseninstanzen haben in der Regel einen gewissen räumlichen Aufwand (da die Instanzen möglicherweise eine vtable oder andere Metadaten in ihrem Speicherlayout enthalten), den Primitive / Strukturen nicht benötigen haben (wenn die Sprache keine Vererbung für diese zulässt).
Ist räumliche Effizienz (und verbesserte räumliche Lokalität, insbesondere in großen Arrays) der einzige Grund, warum fundamentale Typen oft keine Klassen sind?
Ich habe allgemein angenommen, dass die Antwort ja ist, aber Compiler haben Escape-Analyse-Algorithmen und können daher ableiten, ob sie den räumlichen Aufwand (selektiv) weglassen können, wenn sich eine Instanz (jede Instanz, nicht nur ein grundlegender Typ) als streng erwiesen hat lokal.
Ist das oben Gesagte falsch oder fehlt mir noch etwas?