SlideShare ist ein Scribd-Unternehmen logo
1 von 30
Downloaden Sie, um offline zu lesen
Макросы в Скале



Евгений Бурмако
École Polytechnique Fédérale de Lausanne
О чем речь?


Доклад в двух предложениях:
•  Зачем люди используют кодогенерацию?
•  Что в этом плане можно сделать в Скале?
Копипаста



Копипаста это плохо
Абстракция


•  Все мы умеем абстрагироваться от частностей и
   обобщать повторяющийся код
•  Все мы знаем, что иногда это не работает
Примеры

•  Геттеры-сеттеры-конструкторы
•  Публикация и подписка на события
•  Переносчики данных
•  Доменно-специфические языки
Что делать?


•  Мучительно писать горы однотипного кода
•  Колбасить кодогенераторы
•  Поменять язык программирования
Кодогенерация

•  Плагины к билд тулу, генерирующие текст
•  Текстовые макросы (C/C++)
•  Cинтаксические макросы (Lisp, Nemerle, Scala)
•  Постпроцессоры байткода
•  Рантаймовая кодогенерация
Макросы	
  в	
  Скале	
  2.10.х
                              	
  
Что умеют?
Превращать вызовы специально объявленных
функций в произвольный код.


Было:
assert(2	
  +	
  2	
  ==	
  4,	
  "сообщение	
  об	
  ошибке")


Стало:
if	
  (2	
  +	
  2	
  !=	
  4)	
  raise("сообщение	
  об	
  ошибке")	
  
Как это работает?
•  Макросы = функции, которые вызывает
   компилятор
•  В эти функции передается код программы
•  Эти функции возвращают код
•  Сгенерированный код компилируется как
   написанный вручную
•  Детали: http://scalamacros.org/documentation.html
Пример
	
  
assert(2	
  +	
  2	
  ==	
  4,	
  "сообщение	
  об	
  ошибке")	
  
	
  
def	
  assert(cond:	
  Boolean,	
  msg:	
  Any)	
  =	
  	
  
	
  	
  macro	
  impl	
  
	
  
def	
  impl(c:	
  Ctx)(cond:	
  c.Tree,	
  msg:	
  c.Tree)	
  =	
  
	
  	
  If(Select(cond,	
  TermName("$unary_bang")),	
  
	
  	
  	
  	
  Apply(Ident(TermName("raise")),	
  List(msg)),	
  
	
  	
  	
  	
  Literal(Constant(())))	
  
	
  
	
  
Сильные стороны
•  Исполнение произвольного кода (макросы - это
   обычные скальные функции)
•  Генерация произвольного кода (вызовы методов,
   объявления локальных классов/функций)
•  Интроспекция (код компилируемой программы,
   список мемберов классов, загрузка аннотаций)
•  Общение с тайпчекером (тайпчек, поиск
   имплиситов, проверка сабтайпинга)
•  http://www.scala-lang.org/api/current/
   index.html#scala.reflect.macros.Context
Временные сложности

•  Приходится работать на самом низком уровне
   (деревья для представления кода, внутренние
   структуры данных компилятора)
•  API для общения макросов и компилятора пока
   что не отличается стабильностью
•  Проблемы с инфраструктурой (IDE, отладка,
   инкрементальная компиляция, раздельная
   компиляция)
Кто	
  уже	
  использует	
  макросы?	
  
Slick
val	
  coffees	
  =	
  Queryable[Coffee]	
  
val	
  result	
  =	
  coffees.map(c	
  =>	
  (c.name,	
  c.price))	
  

•  Вроде бы обычные filter и map на самом деле
   являются макросами
•  Эти макросы ничего не делают с аргументами во
   время компиляции, а просто сохраняют эти
   функции на будущее (реификация)
•  В рантайме сохраненные функции транслируются
   в SQL (или во что еще угодно)
Play
Скала 2.9:
case	
  class	
  Person(name:	
  String)	
  
implicit	
  val	
  personReads	
  =	
  (	
  
	
  	
  (__	
  	
  'name).reads[String]	
  
)(Person)	
  

Скала 2.10:
case	
  class	
  Person(name:	
  String)	
  
implicit	
  val	
  personReads	
  =	
  Json.reads[Person]	
  

Скала 2.11:
case	
  class	
  Person(name:	
  String)	
  
SBT
Было:
myTask	
  <<=	
  (aTask,	
  bTask)	
  map	
  {	
  (a,	
  b)	
  =>	
  
	
  	
  f(a,	
  b)	
  
}	
  
	
  
Стало:
myTask	
  :=	
  f(a.value,	
  b.value)	
  

•  Аналогично можно создавать свои нотации и в
   других случаях, перегружая разнообразные
   языковые конструкции (точку с запятой, условия,
   циклы, объявления и так далее)
Sqltyped
scala>	
  val	
  q	
  =	
  sql("select	
  name	
  from	
  person")	
  
scala>	
  q()	
  map	
  (_	
  get	
  name)	
  
res0:	
  List[String]	
  =	
  List("Martin",	
  "Jason")	
  
	
  
scala>	
  q()	
  map	
  (_	
  get	
  salary)	
  
<console>:24:	
  error:	
  No	
  such	
  key	
  salary	
  


•  Сиквел-запросы, валидируемые и типизируемые
   во время компиляции
•  Да, макросы натурально берут и стучатся в базу
   данных в компайл-тайме
Declosurify
for	
  (i	
  <-­‐	
  0	
  until	
  100000000	
  optimized)	
  {	
  ...	
  }	
  


•  Циклы на функциях высшего порядка это удобно
•  Но Скала пока что не умеет эффективно
   компилировать такие функции
•  При помощи макроса можно взять красиво
   записанный цикл и преобразовать его в
   некрасивую, но быструю форму - бенчмарки
   сыты, глаза целы
Макросы	
  в	
  будущей	
  Скале	
  
Прогресс не стоит на месте



С момента кодофриза Скалы 2.10.0 мы работали
над новыми фишечками не покладая рук
Что нас интересует?

•  Как сделать написание макросов гуманным?
•  Какие еще возможности дать нашим
   пользователям?
•  Как скрестить возможности макросов и
   тайпчекера?
Квазицитаты

Было:
•  Apply(Ident(TermName("future")),	
  List(body))	
  
•  case	
  ClassDef(name,	
  _,	
  Template(_,	
  _,	
  _	
  ::	
  
   defs)	
  =>	
  ...	
  


Стало:
•  q"future	
  {	
  $body	
  }	
  "	
  
•  case	
  q"class	
  $name	
  {	
  ..${_	
  ::	
  defs}	
  }"	
  =>	
  ...	
  
Тайп макросы
type	
  H2Db(url:	
  String)	
  =	
  macro	
  impl	
  
	
  
object	
  Db	
  extends	
  H2Db("coffees”)	
  
println(Db.Coffees.all)	
  


•  Уже как несколько месяцев макросы умеют
   генерировать публично видимые определения
   (классы, трейты, объекты)
•  Очевидное применение – строго типизированная
   работа с данными, но есть и более веселые вещи
Макро аннотации
@Serializable	
  
class	
  Foo(val	
  x:	
  Int,	
  val	
  y:	
  String)	
  


•  Совсем недавно я научился добавлять мемберы
   в произвольные классы в компилируемой
   программе.
•  Открывающиеся возможности очень широки:
       •  Кастомные кейс классы
       •  Удобная сериализация
       •  Более удобное реактивное
          программирование
Эзотерика

Макросы + тайпчекер:
•  Имплисит макросы
•  Нетипизированные макросы
•  Макросы, влияющие на вывод типов
•  Вычисления на типах при помощи макросов
Macro paradise

•  Кодовое название форка Скалы, в котором
   тусуются штучки из этого раздела доклада
•  Некоторые из фич в парадайзе уже
   заинтересовали наших продакшен ребят
•  Заюзать парадайз очень легко – надо всего лишь
   поменять scalaOrganization в SBT билде
Заключение	
  
Заключение
•  Макросы = легковесные и портабельные плагины
   к компилятору Скалы
•  Они уже с нами в продакшен релизе Скалы 2.10.0
•  Такие популярные библиотеки как Slick, SBT и
   Play используют макросы
•  Мы не стоим на месте и постоянно развиваем
   концепцию макросов в Скале
Вопросы и ответы


Евгений Бурмако
École Polytechnique Fédérale de Lausanne
eugene.burmako@epfl.ch
http://xeno-by.livejournal.com

Weitere ähnliche Inhalte

Andere mochten auch

CodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM LanguageCodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM LanguageCodeFest
 
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...CodeFest
 
CodeFest 2014. Осипов К. — NoSQL: вангуем вместе
CodeFest 2014. Осипов К. — NoSQL: вангуем вместеCodeFest 2014. Осипов К. — NoSQL: вангуем вместе
CodeFest 2014. Осипов К. — NoSQL: вангуем вместеCodeFest
 
Codefest 2011. Вольфтруб А. — О чем стоит подумать, приступая к разработке вы...
Codefest 2011. Вольфтруб А. — О чем стоит подумать, приступая к разработке вы...Codefest 2011. Вольфтруб А. — О чем стоит подумать, приступая к разработке вы...
Codefest 2011. Вольфтруб А. — О чем стоит подумать, приступая к разработке вы...CodeFest
 
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистовCodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистовCodeFest
 
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest
 
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
CodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest
 
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest
 
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest
 
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest
 
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest
 
CodeFest 2014. Сибирев А. — Управление инфраструктурой под Cocaine
CodeFest 2014. Сибирев А. — Управление инфраструктурой под CocaineCodeFest 2014. Сибирев А. — Управление инфраструктурой под Cocaine
CodeFest 2014. Сибирев А. — Управление инфраструктурой под CocaineCodeFest
 
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest
 
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest
 
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest
 
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVMCodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVMCodeFest
 
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...CodeFest
 
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest
 

Andere mochten auch (20)

CodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM LanguageCodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
CodeFest 2010. Иноземцев И. — Fantom. Cross-VM Language
 
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
CodeFest 2013. Rauschmayer A. — An overview of ECMAScript 6, the next version...
 
CodeFest 2014. Осипов К. — NoSQL: вангуем вместе
CodeFest 2014. Осипов К. — NoSQL: вангуем вместеCodeFest 2014. Осипов К. — NoSQL: вангуем вместе
CodeFest 2014. Осипов К. — NoSQL: вангуем вместе
 
Codefest 2011. Вольфтруб А. — О чем стоит подумать, приступая к разработке вы...
Codefest 2011. Вольфтруб А. — О чем стоит подумать, приступая к разработке вы...Codefest 2011. Вольфтруб А. — О чем стоит подумать, приступая к разработке вы...
Codefest 2011. Вольфтруб А. — О чем стоит подумать, приступая к разработке вы...
 
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистовCodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
CodeFest 2010. Погребняк А. — Проблемы оценки труда программистов
 
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
CodeFest 2012. Каплинский К. — Разработка Open Source продуктов как прибыльны...
 
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородахCodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
CodeFest 2010. Орлов А. — Лидерство или о грядках и огородах
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
CodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомленияCodeFest 2013. Конев М. — Push-уведомления
CodeFest 2013. Конев М. — Push-уведомления
 
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все граблиCodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
CodeFest 2010. Горбатовский С. — Заказные проекты: как не собрать все грабли
 
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подходCodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
CodeFest 2012. Ильин А. — Метрики покрытия. Прагматичный подход
 
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
CodeFest 2012. Рыжиков С. — Архитектура и запуск облачного сервиса в Amazon A...
 
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
CodeFest 2011. Сидоров А. — Почему некоторые программисты любят изобретать «в...
 
CodeFest 2014. Сибирев А. — Управление инфраструктурой под Cocaine
CodeFest 2014. Сибирев А. — Управление инфраструктурой под CocaineCodeFest 2014. Сибирев А. — Управление инфраструктурой под Cocaine
CodeFest 2014. Сибирев А. — Управление инфраструктурой под Cocaine
 
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
CodeFest 2013. Иванов В. — Уменьшение расхода оперативной памяти в Java-прило...
 
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
CodeFest 2013. Гилев Е. — Создание пользовательского интерфейса без программи...
 
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о ManageabilityCodeFest 2011. Юферев Р. — Пора задуматься о Manageability
CodeFest 2011. Юферев Р. — Пора задуматься о Manageability
 
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVMCodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
CodeFest 2012. Иванов В. — G1: новый сборщик мусора в HotSpot JVM
 
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
CodeFest 2013. Агафонкин В. — Высокопроизводительные визуализации данных в бр...
 
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
CodeFest 2014. Орешкина Е. — Информационная архитектура в быту, работе и стар...
 

Ähnlich wie CodeFest 2013. Бурмако Е. — Макросы в Скале

SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинSergey Xek
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только одинHappyDev
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013Alex Chistyakov
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»e-Legion
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011CodeCamp
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Ontico
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Badoo Development
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Ontico
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустяYuriy Nasretdinov
 
Эдуард Клементьев «Использование Scala для backend задач»
Эдуард Клементьев «Использование Scala для backend задач»Эдуард Клементьев «Использование Scala для backend задач»
Эдуард Клементьев «Использование Scala для backend задач»e-Legion
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned Alexander Syrotenko
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 

Ähnlich wie CodeFest 2013. Бурмако Е. — Макросы в Скале (20)

SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только одинSECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
SECON'2016. Сергей Аверин. Javascript-фреймворки:
 должен остаться только один
 
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только одинSECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
SECON'2016. Аверин Сергей, Javascript-фреймворки:
 должен остаться только один
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
2015-12-05 Сергей Аверин - Javascript-фреймворки: должен остаться только один
 
Scala: introduction
Scala: introductionScala: introduction
Scala: introduction
 
WebAssembly
WebAssemblyWebAssembly
WebAssembly
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 
Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»Юрий Буянов «Архитектура Goozy»
Юрий Буянов «Архитектура Goozy»
 
YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011YuryByyanov (e-legion) @ CodeCamp2011
YuryByyanov (e-legion) @ CodeCamp2011
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
 
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
Облако в Badoo год спустя - работа над ошибками, Юрий Насретдинов (Badoo)
 
Облако в Badoo год спустя
Облако в Badoo год спустяОблако в Badoo год спустя
Облако в Badoo год спустя
 
Эдуард Клементьев «Использование Scala для backend задач»
Эдуард Клементьев «Использование Scala для backend задач»Эдуард Клементьев «Использование Scala для backend задач»
Эдуард Клементьев «Использование Scala для backend задач»
 
How to cook a blockchain and not get burned
How to cook a blockchain and not get burned How to cook a blockchain and not get burned
How to cook a blockchain and not get burned
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 

Mehr von CodeFest

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита ПрокоповCodeFest
 
Денис Баталов
Денис БаталовДенис Баталов
Денис БаталовCodeFest
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена ГальцинаCodeFest
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр КалашниковCodeFest
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина ИвановаCodeFest
 
Marko Berković
Marko BerkovićMarko Berković
Marko BerkovićCodeFest
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис КортуновCodeFest
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр ЗиминCodeFest
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей КрапивенскийCodeFest
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей ИгнатовCodeFest
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай КрапивныйCodeFest
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander GraebeCodeFest
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим СмирновCodeFest
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин ОсиповCodeFest
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele RialdiCodeFest
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим ПугачевCodeFest
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene GroeschkeCodeFest
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван БондаренкоCodeFest
 
Mete Atamel
Mete AtamelMete Atamel
Mete AtamelCodeFest
 

Mehr von CodeFest (20)

Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Никита Прокопов
Никита ПрокоповНикита Прокопов
Никита Прокопов
 
Денис Баталов
Денис БаталовДенис Баталов
Денис Баталов
 
Елена Гальцина
Елена ГальцинаЕлена Гальцина
Елена Гальцина
 
Александр Калашников
Александр КалашниковАлександр Калашников
Александр Калашников
 
Ирина Иванова
Ирина ИвановаИрина Иванова
Ирина Иванова
 
Marko Berković
Marko BerkovićMarko Berković
Marko Berković
 
Денис Кортунов
Денис КортуновДенис Кортунов
Денис Кортунов
 
Александр Зимин
Александр ЗиминАлександр Зимин
Александр Зимин
 
Сергей Крапивенский
Сергей КрапивенскийСергей Крапивенский
Сергей Крапивенский
 
Сергей Игнатов
Сергей ИгнатовСергей Игнатов
Сергей Игнатов
 
Николай Крапивный
Николай КрапивныйНиколай Крапивный
Николай Крапивный
 
Alexander Graebe
Alexander GraebeAlexander Graebe
Alexander Graebe
 
Вадим Смирнов
Вадим СмирновВадим Смирнов
Вадим Смирнов
 
Константин Осипов
Константин ОсиповКонстантин Осипов
Константин Осипов
 
Raffaele Rialdi
Raffaele RialdiRaffaele Rialdi
Raffaele Rialdi
 
Максим Пугачев
Максим ПугачевМаксим Пугачев
Максим Пугачев
 
Rene Groeschke
Rene GroeschkeRene Groeschke
Rene Groeschke
 
Иван Бондаренко
Иван БондаренкоИван Бондаренко
Иван Бондаренко
 
Mete Atamel
Mete AtamelMete Atamel
Mete Atamel
 

CodeFest 2013. Бурмако Е. — Макросы в Скале

  • 1. Макросы в Скале Евгений Бурмако École Polytechnique Fédérale de Lausanne
  • 2. О чем речь? Доклад в двух предложениях: •  Зачем люди используют кодогенерацию? •  Что в этом плане можно сделать в Скале?
  • 4. Абстракция •  Все мы умеем абстрагироваться от частностей и обобщать повторяющийся код •  Все мы знаем, что иногда это не работает
  • 5. Примеры •  Геттеры-сеттеры-конструкторы •  Публикация и подписка на события •  Переносчики данных •  Доменно-специфические языки
  • 6. Что делать? •  Мучительно писать горы однотипного кода •  Колбасить кодогенераторы •  Поменять язык программирования
  • 7. Кодогенерация •  Плагины к билд тулу, генерирующие текст •  Текстовые макросы (C/C++) •  Cинтаксические макросы (Lisp, Nemerle, Scala) •  Постпроцессоры байткода •  Рантаймовая кодогенерация
  • 9. Что умеют? Превращать вызовы специально объявленных функций в произвольный код. Было: assert(2  +  2  ==  4,  "сообщение  об  ошибке") Стало: if  (2  +  2  !=  4)  raise("сообщение  об  ошибке")  
  • 10. Как это работает? •  Макросы = функции, которые вызывает компилятор •  В эти функции передается код программы •  Эти функции возвращают код •  Сгенерированный код компилируется как написанный вручную •  Детали: http://scalamacros.org/documentation.html
  • 11. Пример   assert(2  +  2  ==  4,  "сообщение  об  ошибке")     def  assert(cond:  Boolean,  msg:  Any)  =        macro  impl     def  impl(c:  Ctx)(cond:  c.Tree,  msg:  c.Tree)  =      If(Select(cond,  TermName("$unary_bang")),          Apply(Ident(TermName("raise")),  List(msg)),          Literal(Constant(())))      
  • 12. Сильные стороны •  Исполнение произвольного кода (макросы - это обычные скальные функции) •  Генерация произвольного кода (вызовы методов, объявления локальных классов/функций) •  Интроспекция (код компилируемой программы, список мемберов классов, загрузка аннотаций) •  Общение с тайпчекером (тайпчек, поиск имплиситов, проверка сабтайпинга) •  http://www.scala-lang.org/api/current/ index.html#scala.reflect.macros.Context
  • 13. Временные сложности •  Приходится работать на самом низком уровне (деревья для представления кода, внутренние структуры данных компилятора) •  API для общения макросов и компилятора пока что не отличается стабильностью •  Проблемы с инфраструктурой (IDE, отладка, инкрементальная компиляция, раздельная компиляция)
  • 15. Slick val  coffees  =  Queryable[Coffee]   val  result  =  coffees.map(c  =>  (c.name,  c.price))   •  Вроде бы обычные filter и map на самом деле являются макросами •  Эти макросы ничего не делают с аргументами во время компиляции, а просто сохраняют эти функции на будущее (реификация) •  В рантайме сохраненные функции транслируются в SQL (или во что еще угодно)
  • 16. Play Скала 2.9: case  class  Person(name:  String)   implicit  val  personReads  =  (      (__    'name).reads[String]   )(Person)   Скала 2.10: case  class  Person(name:  String)   implicit  val  personReads  =  Json.reads[Person]   Скала 2.11: case  class  Person(name:  String)  
  • 17. SBT Было: myTask  <<=  (aTask,  bTask)  map  {  (a,  b)  =>      f(a,  b)   }     Стало: myTask  :=  f(a.value,  b.value)   •  Аналогично можно создавать свои нотации и в других случаях, перегружая разнообразные языковые конструкции (точку с запятой, условия, циклы, объявления и так далее)
  • 18. Sqltyped scala>  val  q  =  sql("select  name  from  person")   scala>  q()  map  (_  get  name)   res0:  List[String]  =  List("Martin",  "Jason")     scala>  q()  map  (_  get  salary)   <console>:24:  error:  No  such  key  salary   •  Сиквел-запросы, валидируемые и типизируемые во время компиляции •  Да, макросы натурально берут и стучатся в базу данных в компайл-тайме
  • 19. Declosurify for  (i  <-­‐  0  until  100000000  optimized)  {  ...  }   •  Циклы на функциях высшего порядка это удобно •  Но Скала пока что не умеет эффективно компилировать такие функции •  При помощи макроса можно взять красиво записанный цикл и преобразовать его в некрасивую, но быструю форму - бенчмарки сыты, глаза целы
  • 21. Прогресс не стоит на месте С момента кодофриза Скалы 2.10.0 мы работали над новыми фишечками не покладая рук
  • 22. Что нас интересует? •  Как сделать написание макросов гуманным? •  Какие еще возможности дать нашим пользователям? •  Как скрестить возможности макросов и тайпчекера?
  • 23. Квазицитаты Было: •  Apply(Ident(TermName("future")),  List(body))   •  case  ClassDef(name,  _,  Template(_,  _,  _  ::   defs)  =>  ...   Стало: •  q"future  {  $body  }  "   •  case  q"class  $name  {  ..${_  ::  defs}  }"  =>  ...  
  • 24. Тайп макросы type  H2Db(url:  String)  =  macro  impl     object  Db  extends  H2Db("coffees”)   println(Db.Coffees.all)   •  Уже как несколько месяцев макросы умеют генерировать публично видимые определения (классы, трейты, объекты) •  Очевидное применение – строго типизированная работа с данными, но есть и более веселые вещи
  • 25. Макро аннотации @Serializable   class  Foo(val  x:  Int,  val  y:  String)   •  Совсем недавно я научился добавлять мемберы в произвольные классы в компилируемой программе. •  Открывающиеся возможности очень широки: •  Кастомные кейс классы •  Удобная сериализация •  Более удобное реактивное программирование
  • 26. Эзотерика Макросы + тайпчекер: •  Имплисит макросы •  Нетипизированные макросы •  Макросы, влияющие на вывод типов •  Вычисления на типах при помощи макросов
  • 27. Macro paradise •  Кодовое название форка Скалы, в котором тусуются штучки из этого раздела доклада •  Некоторые из фич в парадайзе уже заинтересовали наших продакшен ребят •  Заюзать парадайз очень легко – надо всего лишь поменять scalaOrganization в SBT билде
  • 29. Заключение •  Макросы = легковесные и портабельные плагины к компилятору Скалы •  Они уже с нами в продакшен релизе Скалы 2.10.0 •  Такие популярные библиотеки как Slick, SBT и Play используют макросы •  Мы не стоим на месте и постоянно развиваем концепцию макросов в Скале
  • 30. Вопросы и ответы Евгений Бурмако École Polytechnique Fédérale de Lausanne eugene.burmako@epfl.ch http://xeno-by.livejournal.com