Как kotlin оптимизирует проверки того, что число принадлежит диапазону?

Я исследую котлин с помощью декомпиляции в Java-код.

Нашел один интересный нюанс и не могу понять, как это реализовано.

Вот код котлина:

val result = 50 in 1..100

Я использую декомпиляцию идеи intelij для поиска эквивалента Java-кода, и вот что у нас есть:

public final class Test14Kt {
   private static final boolean result = true;

   public static final boolean getResult() {
      return result;
   }
}

Насколько я понимаю, kotlinc каким-то образом знает, что элемент находится в диапазоне, и сохраняет значение true для переменной результата на этапе компиляции.

Это круто. Но как этого добиться?

0
0
53
1

Ответы 1

Это очень просто постоянное сворачивание:

Terms in constant expressions are typically simple literals, such as the integer literal 2, but they may also be variables whose values are known at compile time. Consider the statement:

i = 320 * 200 * 32;

Most modern compilers would not actually generate two multiply instructions and a store for this statement. Instead, they identify constructs such as these and substitute the computed values at compile time (in this case, 2,048,000). The resulting code would load the computed value and store it rather than loading and multiplying several values.

Constant folding can even use arithmetic identities. When x is an integer type, the value of 0 * x is zero even if the compiler does not know the value of x.

Здесь,

50 in 1..100 == 
1 <= 50 && 50 <= 100 == 
true && true == 
true

Спасибо, Алексей. Теперь ясно. Меня просто удивило, что такую ​​форму сворачивания можно применить к сложным типам, например диапазонам ...

the_kaba 11.04.2018 12:49

Что ж, in <x>..<y> просто по определению преобразуется в два сравнения, диапазон даже не появляется. Конечно, компилятор мог на самом деле создает диапазон и вызывает для него метод contains, но его встраивание легко и приносит большую пользу.

Alexey Romanov 11.04.2018 13:44

Плюс у разработчиков Kotlin был пример Scala, который настаивал на том, чтобы нет делал это и как это сказывалось на производительности.

Alexey Romanov 11.04.2018 13:48

То есть в scala такой оптимизации нет?

the_kaba 11.04.2018 13:56

По крайней мере, когда я в последний раз слышал, не было.

Alexey Romanov 11.04.2018 14:08

Другие вопросы по теме