Jabel — как я потрошил компилятор Java
JDK 8 уже 5 лет, а многие проекты до сих пор используют эту версию байткода как целевую. Вот только сам язык Java развивается, появляются новые вкусные возможности синтаксиса (такие как "var", switch expressions, multi-line strings, улучшения для diamond оператора и абстрактных классов), а компилятор их позволяет использовать только с JDK той же версии.
Правда, если посмотреть на байткод, который генерируется для этих "фичей", он ничем не отличается от Java 8, что как бы намекает, что они являются чистым синтаксическим сахаром (в отличие от лямбд в Java 8, например). Так почему javac не позволяет их использовать для более старых целевых версий?
Этот вопрос мучал меня многие годы, и я решил полезть в код javac (а ведь он тоже на Java) и выяснить. И вы не поверите что я там нашёл! :)
Данный доклад расскажет, как устроены некоторые части javac, как работает добавление новых фичей, механизм plugin-ов, а так же что (и как) делает Jabel, чтобы позволить использовать синтаксис последних версий языка Java, при этом не нарушая Java 8 совместимость.