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

[SnowOne 2025] Портнов Петр: Банальные свичи

[SnowOne 2025] Портнов Петр: Банальные свичи

Свичи с разных сторон. Посмотрим, как они эволюционировали, какие ужасы (зачем-то) унаследовали из Ceylon, как устроена нетривиальщина (строки/энамы, pattern matching, exhaustiveness, неудачная реализация в OpenJDK) и чего им еще не хватает для красоты мира.

Видео: https://youtu.be/jG_Vx1JKmOY

Avatar for jugnsk

jugnsk

May 07, 2025
Tweet

More Decks by jugnsk

Other Decks in Programming

Transcript

  1. Откуда возникла конструкция switch? Как она развивалась? Как она устроена

    уровнем ниже? Какие сложности в её реализации? Что нас ждёт впереди? О чём этот доклад? AGENDA и дисклеймеры 4
  2. https://ikfia.ysn.ru/wp-content/uploads/2018/01/Klini1957ru.pdf #F. Пусть функция φ определяется следующим образом: φ(x1 ,

    ... , xn ) = φ1(x1 , ... , xn ) еслиQ1(x1 , ... , xn ), . . . . . . . . . . . . φm(x1 , ... , xn ) еслиQm(x1 , ... , xn ), φm+1(x1 , ... , xn ) в остальных случаях, где Q1 , ... , Qm — исключающие друг друга предикаты(илиφ(x1 , ... , xn) принимает значение, которое даёт первый применимый пункт). Тогда φ примитивно-рекурсивна относительноφ1, ..., φm+1, Q1, ..., Qm+1. (Определение пути разбора случаев.) 1952: Первое появление Введение в Математику, Стефен К. Клини 17
  3. 24

  4. Дизасм разный Актуально ли это сейчас? 32 Дизасм Duff's Device:

    https://godbolt.org/z/esxvThP9c Дизасм оригинала: https://godbolt.org/z/z7ch3PzvW
  5. Дизасм разный А если копирование памяти? 35 Дизасм Duff's Device:

    https://godbolt.org/z/on6oW4Eh3 Дизасм оригинала: https://godbolt.org/z/hqecYbEnP
  6. 40

  7. 43 Работает только с целыми числами до 32 бит (int).

    Унаследовал большую часть сишной семантики. Устройство Даффа не получится. Свойства
  8. 50 01 Для них есть удобное числовое значение — ordinal().

    Добавляем перечисления 02 Проблема? 03 ordinal() может меняться при перекомпиляции того, где объявлен enum.
  9. Можно ли поменять hashCode() у строки 65 Нет, потому что

    его значения захардкожены в ранее скомпилированных свичах
  10. 66 01 Отобразить T в int. Общий принцип для свича

    по T 02 Сделать switch по int- значению. O 1 либо O log2 𝑛 . 03 Чётко сверить T с ожидаемым значением.
  11. Универсального подхода к свичам Общая идея 70 01 Получаем в

    рантайме "преобразователь" T -> int через invokedynamic. 02 Преобразуем значение типа T в int и свичимся.
  12. Про особенности и подвохи Тагир Валеев Трансляция switch в Java-байткод

    Если нужно, размести тут QR-код или удали эту фигуру https://youtu.be/RBkYG5UblUk
  13. Новый сахар 76 01 case X -> — без fallthrough

    case X: — с fallthrough 02 Можно компактно перечислять варианты: case A, B, C ->
  14. Новый сахар 77 01 switch должен быть тотальным, то есть

    покрывать все возможные значения. 02 Но можно выбросить исключение. 03 (Внешние) break, return и continue — нельзя.
  15. 80 И всё? Dependencies … Future support for pattern matching,

    beginning with JEP 305, will build on this JEP. Хмм...
  16. 81 Pattern matching involves testing whether an object has a

    particular structure, then extracting data from that object if there's a match. ВНИМАНИЕ https://docs.oracle.com/en/java/javase/17/language/pattern-matching.html
  17. Подробнее про любовь к ADT Пётр Портнов Продвинутые системы типов.

    Чего еще мне не хватает в Java из Rust Если нужно, размести тут QR-код или удали эту фигуру https://youtu.be/Rijd-I34s8w
  18. 128 8268766: Desugaring of pattern matching enum switch should be

    improved Для `enum`ов добавили свои методы построения таблички. (потребовалась доработка в `javac`)
  19. 129 8291966: SwitchBootstrap.typeSwitch could be faster Если мы попали в

    ветку по типу, но не прошли guard, то продолжаем перебор веток оттуда, где остановились.
  20. 130 8319220: Pattern matching switch with a lot of cases

    is unduly slow Заменить цепочку instanceof, построенную через MethodHandle’ы на аналог через рантайм- генерацию байткода.
  21. Выводы Свичи в Java — результат эволюции старых решений с

    учётом всё новых функций Patten matching — мощный инструмент, упрощающий разработку и предотвращающий ошибки Философия сместилась от «просто, но эффективно» к «гибко и динамически» 137