Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Павел Финкельштейн — Kotlin: Как работают привычные конструкции?

Павел Финкельштейн — Kotlin: Как работают привычные конструкции?

О том, как работают привычные конструкции в Kotlin — декомпилируем код и разбираемся, как же он работает и чего же это нам стоит.

Moscow JUG

March 13, 2019
Tweet

More Decks by Moscow JUG

Other Decks in Programming

Transcript

  1. Привет! Я Паша Финкельштейн Я тут потому что я думаю

    о перфомансе (и кода, и разработчиков) и люблю Kotlin 2
  2. Отказ от гарантий ▪ Я никак не аффилирован с JetBrains

    (пока) ▪ Я не отвечаю за то что вам захочется попробовать ▪ Так же как и за то, что вам не захочется ▪ Я знаю не всё, а значит могу ошибаться или неправильно понимать то, что другие люди понимают правильно или просто там не ошибаются. ▪ Но я стараюсь 3
  3. Несколько слов о себе? ▪ 12 лет в IT ▪

    10 лет в разработке ▪ Почти всё время — на JVM ▪ Учусь по референсам и на ошибках ▪ Экспериментирую ▪ Попробовал всякое от Java до Ceylon и Frege ▪ Пишем подкаст про технологии и жизнь: it.asm0dey.ru 4
  4. Intro: каким был мой первый раз ▪ Дока была в

    конфлюэнсе ▪ Аннотаций были без собак ▪ Перегруженные конструкторы? Не, не слышал. ▪ И я даже что-то предлагал :) 5 ▪ Котлин был ещё чайником
  5. 1. Перфоманс — это важно! 2. Мы пользуемся возможностями, не

    задумываясь 3. А там интересно 4. И иногда неожиданно Почему я об этом говорю 6
  6. ▪ Будем двигаться по примерам от простого к сложному ▪

    Будем компилировать, декомпилировать и рассуждать :) Как будет построен доклад 7
  7. Байткод ▪ Инструкция байткода — единица исполнения виртуальной машины ▪

    Напрямую не связан со строками ▪ В JVMмного инструкций: https://docs.oracle.com/javase/specs/jvms/se8/ html/jvms-6.html#jvms-6.5 ▪ И байткодом всё не ограничивается 9
  8. Как с ним работать ▪ Нас спасёт javap ▪ Полезные

    опции: ▫ -p — private ▫ -l — line and local variable table ▫ -c — disassemble ▫ -? 10
  9. Циклы В джаве напрашивается два вида циклов 1. Simplified for-loop

    for (String string: strings){} 2. Indexed loop for (int i=0; i<strings.size(); i++){} 12
  10. Циклы 1. Simplified в котлине можно взять такой же (или

    нет?) 2. А что взять в качестве indexed? 13
  11. Что только что было ▪ Компилятор иногда творит магию! ▪

    Есть практически полный аналог (на уровне байткода) indexed loop 15
  12. Что только что было ▪ ?. экономит кучу кода ▪

    let Эффективно компилируется ▪ let может заменить Optional ▪ Optional убирается extension’ами 19
  13. “Хвостовая рекурсия — частный случай рекурсии, при котором любой рекурсивный

    вызов является последней операцией перед возвратом из функции Wikipedia 21
  14. Что только что было ▪ Компилятор котлина умеет отлично оптимизировать

    хвосторекурсивные методы ▪ Но не все те вызовы хвосторекурсивны, которые такими кажутся 23
  15. Что только что было ▪ Котлин создаёт синтетический метод для

    дефолтных значений ▪ Работает очень быстро — на битовом AND (&) ▪ Не забывайте бенчмаркать 26
  16. Что только что было ▪ with полностью исчезает в байткоде,

    оставляя за собой лишь один указатель 29
  17. 31

  18. Что только что было При использовании crossinline всё равно инлайнится

    всё что может, а замыкание уходит в анонимный класс 32
  19. Reified дженерики ▪ В джаве в рантайме типы дженериков стираются

    ▪ Это заставляет нас использовать хаки: T <T> genericMethod(String arg, Class<T> clazz){} Или даже страшное T <T> genericMethod(String arg, TypeReference<T> typeRef){} ▪ Но в Kotlin этой проблемы нет: reified дженерики 33
  20. Что только что было Методы с reified дженериками полностью инлайнятся.

    А исходные методы для вызова из Java бесполезны, хоть и остаются в байткоде 35
  21. 37

  22. Что только что было ▪ Обмануть Kotlin можно ▪ Листы

    сложно ▪ Сеты тривиально ▪ А сиквенсами можно оперировать из джавы и это норм 41
  23. Выводы ▪ Нельзя делать выводы только на основе кода ▪

    Надо пользоваться инструментами ▪ Смотреть байткод ▪ Мало — декомпилировать его во что-то понятное ▪ Не всё так просто, как кажется 42