Przy projektowaniu i wykonawczym języka programowania obiektowego, w jakimś jednym punkcie musi dokonać wyboru o realizacji podstawowych typów (jak int
, float
, double
lub odpowiedników) jako klasy lub czegoś innego. Wyraźnie, języków z rodziny C mają tendencję nie je zdefiniować jako klasy (Java ma specjalnych typów prymitywnych, C # wdraża je jako niezmiennych strukturach, etc).
Mogę wymyślić bardzo ważną zaletę, gdy podstawowe typy są implementowane jako klasy (w systemie typów o ujednoliconej hierarchii): typy te mogą być odpowiednimi podtypami typu Liskov typu root. W ten sposób unikamy komplikowania języka z boksowaniem / rozpakowywaniem (jawnym lub niejawnym), typami opakowań, specjalnymi regułami wariancji, specjalnym zachowaniem itp.
Oczywiście, częściowo rozumiem, dlaczego projektanci języków decydują o tym, jak to robią: instancje klas mają zwykle pewien narzut przestrzenny (ponieważ instancje mogą zawierać vtable lub inne metadane w ich układzie pamięci), że prymitywy / struktury nie muszą mieć (jeśli język nie pozwala na dziedziczenie po nich).
Czy wydajność przestrzenna (i poprawiona lokalizacja przestrzenna, szczególnie w dużych tablicach) jest jedynym powodem, dla którego podstawowe typy często nie są klasami?
Generalnie założyłem, że odpowiedź brzmi „tak”, ale kompilatory mają algorytmy analizy ucieczki, dzięki czemu mogą wydedukować, czy mogą (selektywnie) pominąć narzut przestrzenny, gdy wystąpienie (dowolne wystąpienie, a nie tylko typ podstawowy) jest ściśle określone lokalny.
Czy powyższe jest złe, czy też brakuje mi czegoś jeszcze?