При проектировании и implenting объектно-ориентированный язык программирования, в какой - то момент один должен сделать выбор о реализации основных типов (как int
, float
, double
или их эквиваленты) , как классы или что - то другое. Очевидно, что языки в семействе C имеют тенденцию не определять их как классы (Java имеет специальные примитивные типы, C # реализует их как неизменяемые структуры и т. Д.).
Я могу думать об очень важном преимуществе, когда фундаментальные типы реализуются как классы (в системе типов с унифицированной иерархией): эти типы могут быть собственными подтипами Лискова корневого типа. Таким образом, мы избегаем усложнения языка боксом / распаковкой (явной или неявной), типов-оболочек, специальных правил отклонения, специального поведения и т. Д.
Конечно, я могу частично понять, почему разработчики языка решают так, как они делают: экземпляры классов имеют тенденцию иметь некоторые пространственные издержки (потому что экземпляры могут содержать vtable или другие метаданные в их макете памяти), что примитивам / структурам не нужно есть (если язык не разрешает наследование на тех).
Является ли пространственная эффективность (и улучшенная пространственная локальность, особенно в больших массивах) единственной причиной, по которой фундаментальные типы часто не являются классами?
Я обычно предполагал, что ответом будет «да», но у компиляторов есть алгоритмы анализа побега, и, таким образом, они могут определить, могут ли они (выборочно) пропустить пространственные издержки, когда доказано, что экземпляр (любой экземпляр, а не просто фундаментальный тип) строго местный.
Это выше, или я что-то упускаю?