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