Как и многие другие аспекты языкового дизайна, речь идет о компромиссе элегантности с производительностью (не говоря уже о некотором историческом влиянии более ранних языков).
альтернативы
Конечно, возможно (и довольно просто) создать язык программирования, который имеет только один тип натуральных чисел nat
. Почти все языки программирования, используемые для академического обучения (например, PCF, System F), имеют этот тип единого числа, который, как вы и предполагали, является более элегантным решением. Но языковой дизайн на практике - это не просто элегантность; мы также должны учитывать производительность (степень, в которой рассматривается производительность, зависит от предполагаемого применения языка). Производительность включает в себя как временные, так и пространственные ограничения.
Пространство
Разрешение программисту выбрать количество байтов заранее может сэкономить место в программах с ограниченным объемом памяти. Если все ваши номера будут меньше , чем 256, то вы можете использовать 8 раз больше , чем byte
с , как long
с, или использовать сохраненную память для более сложных объектов. Разработчику стандартных Java-приложений не нужно беспокоиться об этих ограничениях, но они все же возникают.
КПД
Даже если мы игнорируем пространство, мы все еще ограничены процессором, который имеет только инструкции, которые работают с фиксированным числом байтов (8 байтов в 64-битной архитектуре). Это означает, что даже предоставление одного 8-байтового long
типа значительно упростит реализацию языка по сравнению с неограниченным типом натуральных чисел, поскольку можно будет отображать арифметические операции непосредственно в отдельные базовые инструкции ЦП. Если вы позволяете программисту использовать произвольно большие числа, то одна арифметическая операция должна быть сопоставлена с последовательностью сложных машинных инструкций, что приведет к замедлению работы программы. Это пункт (1), который вы подняли.
Типы с плавающей точкой
Обсуждение до сих пор касалось только целых чисел. Типы с плавающей точкой - сложный зверь с чрезвычайно тонкой семантикой и крайними случаями. Таким образом, даже если мы могли бы легко заменить int
, long
, short
и byte
с помощью одного nat
типа, то не ясно , что тип чисел с плавающей точкой , даже есть . Очевидно, они не являются действительными числами, поскольку действительные числа не могут существовать в языке программирования. Они также не совсем рациональные числа (хотя при желании можно создать рациональный тип). По сути, IEEE выбрал способ сортировки приближенных действительных чисел, и с тех пор все языки (и программисты) были привязаны к ним.
В заключение:
Возможно, программист не хотел бы, чтобы кто-то мог использовать большее число, чем определенный размер, и это позволяет им ограничивать его.
Это не веская причина. Во-первых, я не могу представить себе каких-либо ситуаций, в которых типы могли бы естественно кодировать числовые границы, не говоря уже о том, что астрономически малы шансы, что границы, которые программист хочет установить, будут точно соответствовать размерам любого из примитивных типов.