Почему нет примитивных типов?
# russian
l
Почему нет примитивных типов?
m
Зачем?
l
Не знаю. А зачем они в java?
a
По традиции
На самом деле примитивы есть, просто они скрыты. Это почти всегда хорошо, но иногда плохо.
m
Наверное, лучше сначала разобраться, нужны ли нам в Java примитипы как отдельные ключевые слова. 🙂
a
Есть один единственный кейс, когда примитивы нужны. Это оптимизация производительности во всяких численных операциях. Компилятор Kotlin сам их автоматически выставляет кроме случая с дженериками. Но примитивы в дженериках и в джаве не работают
Там есть некоторая проблема для высокопроизводительных вычислений, но не думаю, что вопрос был в этом.
l
Все зашло дальше чем я предполагал. Но раз уж начал... Окей, зачем вообще в языках примитивы - наверно потому что изначально они были, не сразу же классы стали писать. Почему java не может избавиться от примитивов - понятно, апдейт все сломает. Почему kotlin избавился от примитивов - объяснил @altavir. Я ведь все правильно понимаю?
a
Да
Примитивы еще единственные типы в Java, которые передаются по значению. В котлин, таких вообще нет.
g
Примитивы нужны для перформанса, это почти то же самое с чем работает CPU, причем это не какое то умозрительное улучшение, а имеющее смысл почти для любой программы
a
Там не в CPU дело, а в памяти. Разница, которую дает боксинг по количеству операций и скорости выполнения - от 4 до 10 раз. С такими вещами не шутят.
Но Котлин может оптимизировать эти штуки лучше, если пожертвует частью обратной совместимости с Java
g
Там не только память, но и CPU, кеши
Пожертвует обратной совместимостью? Речь о коллекциях с примитивными типами вместо erased дженериков?
a
Можно сделать автоматический анбоксинг и замену массивов на типизированные для финальных классов.
Второй вариант - это KEEP-176 и вынос всей перорманс критикал логики в расширения со статическим диспатчем
Еще вариант - дженерик специализация, но Елизаров был против.
g
Полностью их скрыть вряд ли получится. Тот же IntArray торчит, про который потом спрашивают, зачем он нужен отдельный.
a
Ну про полностью скрыть речи нет.
Единственная существенная проблема, это примитивы в дженериках.
И в лямбдах кстати. Все лямбды боксят автоматически. Вообще обсуждение явно для #mathematics
m
единственные типы в Java, которые передаются по значению. В котлин, таких вообще нет.
Ой, для разработчика нет никакой разницы между передачей примитива и передачей неизменяемого объекта.
Примитивы нужны для перформанса
Компилятору/VM — да, языку/разработчику — не обязательно.
Все лямбды боксят автоматически.
Только неинлайновые. Именно поэтому собирались делать SAM-интерфейсы.
a
Ой, для разработчика нет никакой разницы между передачей примитива и передачей неизменяемого объекта.
Ну это можете рассказать тем, кто на С пишет 🙂
m
Я думал, мы говорим в контексте Java/Kotlin.
a
Ну в Kotlin оно действительно не надо. И правильно, что его не стали тащить в язык