?

Log in

No account? Create an account

scala.meta: новая платформа для метапрограммирования Скалы - Excelsior

Jul. 5th, 2014

12:16 am - scala.meta: новая платформа для метапрограммирования Скалы

Previous Entry Share Next Entry

scala.reflect - наш публичный API, появившийся в Скале версии 2.10 - оказался весьма полезным на практике. Благодаря макросам, основанным на новом API, стало возможным реализовать такие библиотеки как async (DSL для упрощения работы с асинхронностью), pickling (статически генерируемые сериализаторы с отличным перфомансом), scala-blitz (ускорялка стандартных коллекций), а также улучшить ряд уже существующих решений в scalatest, Play!, parboiled и других популярных библиотеках.

Однако у scala.reflect есть и ряд недостатков, связанных с тем, что он был реализован на скорую руку на основе уже существующих абстракций компилятора Скалы. Время благодаря этом мы, конечно, сэкономили, но результат получился переусложненным, требующим знаний внутренней кухни компилятора и полностью привязанным к платформе scalac.

Основываясь на нашем опыте с scala.reflect и на отзывах пользователей макросов, мы спроектировали scala.meta - новую платформу для метапрограммирования Скалы, главной целью которой является легкость в использовании и портабельность относительно существующих (Scala 2, Intellij) и планирующихся (Scala 3) реализаций языка. Первый technology preview релиз scala.meta намечен на эту осень, а пока что предлагаю посмотреть видео нашей презентации с ScalaDays и обсудить дальнейшие планы в каментах.

Слайды: Easy Metaprogramming For Everyone!
Видео: Запись презентации на parleys.com

Tags: ,

Comments:

From:ext_2116506
Date:July 4th, 2014 11:44 pm (UTC)
(Link)
Прямо захотелось поучаствовать!

И еще мелочный вопрос: раз оно тащит все в рантайм (я правильно вообще понял?), то это ж дженерики теперь не затираются!? Ну, потенциально. М?
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:July 5th, 2014 06:27 pm (UTC)
(Link)
Они не затираются из исходников, но будут все равно затираться из инстансов объектов. Например, если нам откуда-то пришел List[Int], а статически известен тип Any (например, def foo(x: Any) = ...; foo(List(1, 2, 3))), то информация о том, что у листа был тайп аргумент Int, будет безвозвратно потеряна.
(Reply) (Parent) (Thread)
From:ext_2116506
Date:July 8th, 2014 08:07 am (UTC)
(Link)
Чтоб два раза не хоидть, спрошу здесь - pickling же не забросили? Последний коммит два месяца назад :/
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:July 8th, 2014 08:21 am (UTC)
(Link)
Если честно, я уже давно не в курсе состояния дел в пиклинге. Наверное, лучше всего будет спросить в ишью трекере проекта.
(Reply) (Parent) (Thread)
From:ex_juan_gan
Date:July 5th, 2014 02:25 am (UTC)
(Link)
Роскошно! Восторг! Сижу тут парсеры комбинаторы несчастные курочу - а у них бац, десериализация чисто через кью.

Это на какой хоть скале, на 11-й?
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:July 5th, 2014 06:23 pm (UTC)
(Link)
Библиотека с новым API для метапрограммирования и контрактом для хостов разрабатывается относительно 2.11. Сохранение AST и раскрытие новых макросов требуют специального плагина для компилятора 2.11. Поддержка для IDE и SBT делается в форках соответствующих тулов. В целом, пока что ничего не предвещает необходимости форкать компилятор, но даже если и будет такая необходимость, то мы приложим все силы для того, чтобы этого избежать (для этого уже есть проверенные подходы :)).
(Reply) (Parent) (Thread)
[User Picture]
From:_xacid_
Date:July 6th, 2014 04:27 pm (UTC)
(Link)
в 2.12 на "работает из коробки" надежда есть? или уже в 3й только ? :)

Edited at 2014-07-06 04:28 pm (UTC)
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:July 6th, 2014 04:51 pm (UTC)
(Link)
Если под "работает из коробки" подразумевается "входит в стандартную поставку языка", то скорее всего нет. Сейчас, в отличие от прошлых лет, Scala team гораздо более консервативнее относится к включению новых фич/библиотек в язык, поэтому новым вещам приходится вначале хорошо зарекомендовать себя на практике, и только потом начинаются разговоры о включению их по умолчанию.

К счастью, как показал опыт с macro paradise, плагины к компилятору очень просто распространять и использовать (1 строчка в sbt билде) + я знаю некоторые проекты, которые не стесняются использовать плагин парадайза даже в продакшене. Соответственно, я надеюсь, что распространять мету как плагин будет продуктивно и плодотворно.

Поэтому пока что наши планы выглядят следующим образом:
1) Cкорейшая реализация задуманного в рамках плагина для 2.11 (и для 2.12, когда начнут выходить майлстоуны 2.12).
2a) Эксперименты по миграции существующих макросов с scala.reflect на scala.meta.
2б) Разработка новой функциональности, основанной на уникальных фичах scala.meta (например, meta таск для sbt).
3) На основе опыта, полученного в процессе 2а и 2б, разговор с ребятами из Typesafe на тему (частичного или полного) включения меты в стандартную поставку.

Edited at 2014-07-06 04:52 pm (UTC)
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:unstablebear
Date:July 5th, 2014 05:35 pm (UTC)
(Link)
Крутая презентация. Я вот не понял, а с AST доступным в runtime можно и type erasure победить, или это не особо для scala актуально?
(Reply) (Thread)
[User Picture]
From:_xacid_
Date:July 6th, 2014 04:30 pm (UTC)
(Link)
не о том думаете :D

вам compile-time API дают а Вы всё runtime да runtime требуете ...
(Reply) (Parent) (Thread)
[User Picture]
From:xeno_by
Date:July 6th, 2014 04:42 pm (UTC)
(Link)
Одна из целей новой платформы - обеспечить anytime metaprogramming.

На слайде 53 кратко упоминается о том, что сохранение AST обеспечивает равные возможности для всех хостов. Это значит, что в новой системе не должно быть разницы между compile-time и runtime метапрограммированием - и там, и там будет информация про полный AST программы. По факту, единственной проблемой, которую мы пока что заметили, является erasure, но тут без тяжелой артиллерии не справиться.

Для примера. Сейчас в разработке находится GSoC проект по рантайм экспаншену макросов. По задумке, он предоставит возможность откладывать раскрытие определенных макро вызовов до рантайма, позволяя макросы, исполняемые во время компиляции, прозрачно раскрывать в рантайме. Посмотрим как оно будет, но пока что я надеюсь, что удастся во многом стереть границу между compile-time и runtime.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:_xacid_
Date:July 6th, 2014 04:48 pm (UTC)
(Link)
скоро в lisp превратитесь так :) шутка

а ваще конечно круто будет

когда (в какой версии) можно будет это использовать на работе? :)
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:sorhed
Date:July 6th, 2014 07:33 pm (UTC)
(Link)
Вау! Наконец-то!

Для scala.reflect я был слишком тупой, а тут всё кристально ясно.

А как тигрицу уговорили? :)
(Reply) (Thread)
[User Picture]
From:xeno_by
Date:July 7th, 2014 11:10 am (UTC)
(Link)
Тигрица все понимает. Действительно ведь со scala.reflect открылся ряд проблем, которые мы либо не предполагали, либо сильно преуменьшали их значимость. scala.meta предоставляет выход из этой невеселой ситуации, поэтому никто в принципе не против - осталось только, чтобы реализация оправдала ожидания, которые на нее возлагают. Будем стараться.
(Reply) (Parent) (Thread)