https://kotlinlang.org logo
Title
l

lewik

02/27/2019, 3:16 PM
Почему нет примитивных типов?
m

miha-x64

02/27/2019, 3:20 PM
Зачем?
l

lewik

02/27/2019, 3:21 PM
Не знаю. А зачем они в java?
a

altavir

02/27/2019, 3:21 PM
По традиции
На самом деле примитивы есть, просто они скрыты. Это почти всегда хорошо, но иногда плохо.
m

miha-x64

02/27/2019, 3:22 PM
Наверное, лучше сначала разобраться, нужны ли нам в Java примитипы как отдельные ключевые слова. 🙂
a

altavir

02/27/2019, 3:23 PM
Есть один единственный кейс, когда примитивы нужны. Это оптимизация производительности во всяких численных операциях. Компилятор Kotlin сам их автоматически выставляет кроме случая с дженериками. Но примитивы в дженериках и в джаве не работают
Там есть некоторая проблема для высокопроизводительных вычислений, но не думаю, что вопрос был в этом.
l

lewik

02/27/2019, 3:24 PM
Все зашло дальше чем я предполагал. Но раз уж начал... Окей, зачем вообще в языках примитивы - наверно потому что изначально они были, не сразу же классы стали писать. Почему java не может избавиться от примитивов - понятно, апдейт все сломает. Почему kotlin избавился от примитивов - объяснил @altavir. Я ведь все правильно понимаю?
a

altavir

02/27/2019, 3:25 PM
Да
Примитивы еще единственные типы в Java, которые передаются по значению. В котлин, таких вообще нет.
g

gildor

02/27/2019, 3:33 PM
Примитивы нужны для перформанса, это почти то же самое с чем работает CPU, причем это не какое то умозрительное улучшение, а имеющее смысл почти для любой программы
a

altavir

02/27/2019, 3:34 PM
Там не в CPU дело, а в памяти. Разница, которую дает боксинг по количеству операций и скорости выполнения - от 4 до 10 раз. С такими вещами не шутят.
Но Котлин может оптимизировать эти штуки лучше, если пожертвует частью обратной совместимости с Java
g

gildor

02/27/2019, 3:36 PM
Там не только память, но и CPU, кеши
Пожертвует обратной совместимостью? Речь о коллекциях с примитивными типами вместо erased дженериков?
a

altavir

02/27/2019, 3:49 PM
Можно сделать автоматический анбоксинг и замену массивов на типизированные для финальных классов.
Второй вариант - это KEEP-176 и вынос всей перорманс критикал логики в расширения со статическим диспатчем
Еще вариант - дженерик специализация, но Елизаров был против.
g

ghedeon

02/27/2019, 4:14 PM
Полностью их скрыть вряд ли получится. Тот же IntArray торчит, про который потом спрашивают, зачем он нужен отдельный.
a

altavir

02/27/2019, 4:14 PM
Ну про полностью скрыть речи нет.
Единственная существенная проблема, это примитивы в дженериках.
И в лямбдах кстати. Все лямбды боксят автоматически. Вообще обсуждение явно для #mathematics
m

miha-x64

02/27/2019, 4:22 PM
единственные типы в Java, которые передаются по значению. В котлин, таких вообще нет.
Ой, для разработчика нет никакой разницы между передачей примитива и передачей неизменяемого объекта.
Примитивы нужны для перформанса
Компилятору/VM — да, языку/разработчику — не обязательно.
Все лямбды боксят автоматически.
Только неинлайновые. Именно поэтому собирались делать SAM-интерфейсы.
a

altavir

02/27/2019, 4:22 PM
Ой, для разработчика нет никакой разницы между передачей примитива и передачей неизменяемого объекта.
Ну это можете рассказать тем, кто на С пишет 🙂
m

miha-x64

02/27/2019, 4:41 PM
Я думал, мы говорим в контексте Java/Kotlin.
a

altavir

02/27/2019, 4:41 PM
Ну в Kotlin оно действительно не надо. И правильно, что его не стали тащить в язык