В основном дайджесте, посвященном новостям JVM-платформы, Scala начала занимать очень много места, поэтому мы решили сделать специальный выпуск новостей Scala-мира. Возможно, в будущем он превратится в самостоятельный Scala-дайджест, но это не точно.
В подготовке выпуска нам помогали участники сообщества: Вадим Челышов (соведущий подкаста Scalalaz) и Олег Нижников.
· Scala 2.12.5/2.12.6.
В конце марта вышло вышло целых два новых релиза Scala. В компиляторе решили слегка подтюнить генерацию байткода для интерполяции строк — теперь инстанс выделяемого буфера заранее учитывает размеры строковых литералов. Почитать на эту тему можно на Medium. Планируются дальнейшие оптимизации на базе JEP-280, но вряд ли это можно будет увидеть раньше, чем Scala откажется от поддержки Java 8. Также был задепрекейчен метод PartialFunction.apply, который при передаче литерала частичной функции приводил к неожиданным результатам. В 2.13 он будет заменен на fromFunction. Ну а если вы никогда на это не напарывались, то вот тут можно почитать, как правильно и неправильно объявлять PartialFunction.
В ходе релиза 2.12.5 случайно досталось макросам, которые перестали работать под JDK 9+, что и фиксит релиз 2.12.6, помимо каких-то улучшений для пользователей Emacs.
· Шустрый поиск имплиситов.
В ходе своей работы над индуктивным выводом имплиситов Miles Sabin обнаружил более простой способ ускорения их поиска без применения специализированных эвристик и специальных аннотаций. В ближайшем будущем уже не получится отмазаться долгой компиляцией shapeless, объясняя этим свою страсть к постоянному сидению в Scala-чатиках в рабочее время (ну или почему ты несколько раз ходил в столовую). По бенчмаркам, компиляция операций над HList’ом из 500 элементов скакнула с 415 секунд до 15! Этот фикс забэкпорчен в ветку 2.12. Подробности можно посмотреть здесь: раз, два.
· Top-20 Tiobe.
Да, если вдруг не слышали, то Scala второй раз за всю свою историю попала в Top-20 Tiobe. Будем надеяться, что в этот раз получится удержать позицию дольше одного месяца. Пока он не закончился, пользуйтесь шансом — нужно немедленно сообщить эту новость всем, кто любит говорить про смерть и стагнацию языка.
· Что с макросами в Dotty?
Как и обещалось, после анонса более точных дат релиза Scala3/Dotty, от авторов компилятора вышел следующий пост о будущем макросов, из которого становится ясно, что переход на Scala3 не будет столь легким, как заявлялось ранее. Текущий подход с выворачиванием наружу внутренностей компилятора будет заменен более стабильной оберткой над Tasty, что облегчит их поддержку, и новым концептом Principled Meta Programming, в котором также будут преимущества для typelevel-программирования. Вот тут можно поучаствовать в дискуссии о новом дизайне. Еще пара ссылок по теме: раз, два. Тем временем, в связи с тем, что Евгений Бурмако не может далее продолжать работу над экосистемой, разработчики текущей версии компилятора подхватывают поддержку Macro Paradise. В 2.13 подрубить поддержку Paradise можно будет через опцию компилятора. Подробности здесь.
· Драма вокруг bifunctor IO.
Всё никак не утихнут волнения вокруг темы IO и effect’ов и борьбы их разных реализаций. На этот раз OlegYch из Scala-чатика подбрасывает идею John A De Goes, и без того уже нашумевшему агресcивным форсингом своей реализацией IO в scalaz. Так как IO и так внутри основан на разновидности Either, если сделать IO бифунктором, это позволит не писать лишний трансформер EitherT для IO. Что и становится причиной вдохновения John’a на новую реализацию IO и быстро превращается в великую идею очень функциональной Скалы. Утверждается, что все его функции и так чистые, и ему совершенно не нужно ловить там никаких эксепшенов.
Параллельно с этим муза посещает и Luka Jacobowitz — он тоже пишет свой unexceptional IO и пишет новый блогпост. Его виденье, конечно, не столько радикально, как у Джона, помимо unexcecptional IO, основная суть статьи — объяснение необходимости введения нового тайп-класса с рабочим названием MonadBlunder, который бы позволил разделять и комбинировать оба типа эффектов, как обычные, так и чистые и неподверженные неожиданным ошибкам.
Далее в это всё врывается автор monix и cats-effects, Alexandru Nedelcu со своим блогпостом, где закапывает всю эту движуху вокруг бифункторного IO, сравнивая это с Checked Exceptions из Java и указывая на нелепость всей идеи по причине текущего состояния языков программирования и рантаймов.
· Обновления Future/Promise в 2.13.
Между тем Viktor Klang закидывает скромный пулреквест с доработками дефолтной реализации futures. Из изменений: добавляется новый метод defer плюс различные внутренние трюки для улучшения производительности.
· Зачем Lightbend’у Jakarta EE?
Среди всей это волны новостей о передаче Java EE в Eclipse Foundation, Lightbend также ошарашил всех новостью о своем участии в Jakarata EE. Для всех, кто хочет прояснить, чем же их могла привлечь Jakarta, вышел подкаст с их CEO Mark Brewer, где одной из основных целей было заявлено привнести туда все хорошие вещи из реактивного мира, что помогло бы большим энтерпрайзам менее болезненно переезжать в облачные инфраструктуры. Есть и другой пост, с более конкретным видением будущего API EE4J.