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

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

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

3fc5b5eb32bd3b48d7810fd67b37f9a1?s=128

Moscow JUG

March 13, 2019
Tweet

Transcript

  1. Kotlin: Как работают привычные конструкции?

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

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

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

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

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

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

    Будем компилировать, декомпилировать и рассуждать :) Как будет построен доклад 7
  8. Байткод И с чем его едят 8

  9. Байткод ▪ Инструкция байткода — единица исполнения виртуальной машины ▪

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

    опции: ▫ -p — private ▫ -l — line and local variable table ▫ -c — disassemble ▫ -? 10
  11. Поехали! 11

  12. Циклы В джаве напрашивается два вида циклов 1. Simplified for-loop

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

    нет?) 2. А что взять в качестве indexed? 13
  14. Demo time! 14

  15. Что только что было ▪ Компилятор иногда творит магию! ▪

    Есть практически полный аналог (на уровне байткода) indexed loop 15
  16. 16 Пока, Java

  17. .let ▪ Позволяет прокинуть this как аргумент замыкания (it) 17

  18. Demo time! 18

  19. Что только что было ▪ ?. экономит кучу кода ▪

    let Эффективно компилируется ▪ let может заменить Optional ▪ Optional убирается extension’ами 19
  20. tailrec Оптимизация хвостовой рекурсии 20

  21. “Хвостовая рекурсия — частный случай рекурсии, при котором любой рекурсивный

    вызов является последней операцией перед возвратом из функции Wikipedia 21
  22. Demo time! 22 Улучшить всё что было

  23. Что только что было ▪ Компилятор котлина умеет отлично оптимизировать

    хвосторекурсивные методы ▪ Но не все те вызовы хвосторекурсивны, которые такими кажутся 23
  24. Дефолтные значения параметров Котлин позволяет указывать дефолтные значения параметров. Но

    как это работает? 24
  25. Demo time! 25 Улучшить всё что было

  26. Что только что было ▪ Котлин создаёт синтетический метод для

    дефолтных значений ▪ Работает очень быстро — на битовом AND (&) ▪ Не забывайте бенчмаркать 26
  27. .with Используется когда нам надо провести последовательные действия над объектом

    27
  28. Demo time! 28

  29. Что только что было ▪ with полностью исчезает в байткоде,

    оставляя за собой лишь один указатель 29
  30. crossinline Иногда в inline-метод нам надо передать функцию, которая будет

    выполняться в рамках замыкания 30
  31. 31

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

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

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

  35. Что только что было Методы с reified дженериками полностью инлайнятся.

    А исходные методы для вызова из Java бесполезны, хоть и остаются в байткоде 35
  36. Sealed классы Классы с закрытой иерархией наследования. Но нельзя ли

    этого сломать из джавы? 36
  37. 37

  38. Что только что было Так просто Kotlin не обманешь! 38

  39. Immutable коллекции В Kotlin есть два типа коллекций: Mutable и

    Immutable 39
  40. Demo time! 40

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

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

    Надо пользоваться инструментами ▪ Смотреть байткод ▪ Мало — декомпилировать его во что-то понятное ▪ Не всё так просто, как кажется 42
  43. Спасибо! Вопросы? @asm0dey it.asm0dey.ru asm0dey@asm0dey.ru twitter.com/asm0di0 fb.com/asm0dey 43