Комментарии 15

описание метода Object var4
в теле метода var3
public static void first$default(int var0, long var1, int mask, Object var4) {
if((var3 & 1) != 0) {
var0 = 11;
}
if((var3 & 2) != 0) {
var1 = 22L;
}
first(var0, var1);
}
inline в Kotlin сделан не от хорошей жизни, а потому, что JIT не умеет инлайнить лямбды, переданные по параметру. Это своего рода обход известного ограничения JIT. Из статьи же создается впечатления, что разработчики языка недоверяют стандартному инлайнингу. Вполне доверяют, но хотят большего.
Что значит "JIT не умеет инлайнить лямбды, переданные по параметру"?
Не стоит делать такие утверждения не будучи членом команды, которая принимала design decision о необходимости inline.
1) Inline-лямбды невероятно рулят на андроиде, где без inline приходится под каждую лямбду генерировать анонимный класс, раздувая итоговый размер приложения.
2) Без inline-лямбд гораздо сложнее сделать (и возможно только более ограниченную версию) reified generics и non-local returns.
3) Конструкции с лямбдами в котлине активно используются в качестве очень приятного сахара (классический пример c lock из документации), логично было бы сделать, чтоб такой сахар компилировался в тот же байткод, что аналогичная (и более громоздкая в случае с try-finally) конструкция на джаве.
4) JIT вполне себе сносно инлайнит лямбды. Да, на эту оптимизацию нельзя полагаться; тем не менее полагаться на то, что средний разработчик умеет инлайнить лучше, чем компилятор уж тем более не стоит.
Вот бенчмарк, где JIT инлайнит и метод, и переданную в него лямбду.
5) Было бы странно, если бы решения о дизайне языке принимались только на основании того, что неспецифицированный JIT-компилятор может или не может сделать.
NB: я к дизайну языка никакого отношения не имею
Очень может быть что я и ошибаюсь. Тем не менее я довольно давно слежу за развитием языка. И помню когда появилось ключевое слово inline и какой аргументацией сопровождалось его почвление. Reified, android и т.п. появились позже. Как развитие удачной идеи. Ну и JVM на месте не стоит. Возможно мой опыт устарел. Надо будет освежить.
Что-то не могу найти так сразу ссылку на пруф, но как раз при обсуждении inline с разработчиками Kotlin я и узнал, что ели передать лямбду как параметр метода, то тело метода заинлайнено может быть, а вот тело лямбды уже нет.
Inline Котлина же позволяет явно заинлайнить и тело метода и тело лямбды, которая туда была передана.
Ну а уже потом и reified туда наверну, превратив inkine вообще в киллер фичу.
Kotlin, компиляция в байткод и производительность (часть 1)