SlideShare une entreprise Scribd logo
1  sur  27
Опыт создания DSL на Ruby.
Где применить, как готовить и
сколько добавить
метапрограммирования.

Антон Сидельников
ndmeredian@gmail.com
Содержание



• О самой концепции DSL
• Чем Ruby хорош для DSL
• Использование Ruby-based DSL в
  реальных проектах
• Ruby-based DSL Roadmap



                                   2
Предметно-ориентированный язык
(Domain Specific Language)



• Предназначен для решения узкого
  круга задач
• Понятия предметной области являются
  элементарными
• Задачи решаются в терминах
  предметной области


                                    3
Как можно применить DSL



•   Конфиги (apache, etc.), Make
•   Языки описания данных (HTML, TeX)
•   Язык описания правил (ipfw)
•   Язык для написания тестов
•   Высокоуровневый язык для написания
    бизнес-логики


                                         4
Использование DSL



             Pro                            Contra
•Повышение уровня абстракции     •Расходы на создание и
•Более явная логика кода         поддержку языка
•Повышение скорости разработки   •Область применения
                                 действительно мала
•Можно передать управление не-
программисту                     •Требует обучения пользователя




                                                                  5
Два подхода к созданию DSL



           External                          Internal
•Придумываем грамматику            •Выбираем язык по вкусу
•Пишем интерпретатор...            •Используем синтаксис и
•…транслятор...                    семантику старого языка для
•...или компилятор (если скучно)   создания иллюзии нового




                                                                 6
Ruby-based DSL


• Internal DSL
       • Поддерка IDE
       • Доступ к Ruby gems и прочему
         существующему коду
• Еще большая скорость разработки
• Гибкий синтаксис, обилие syntax sugar
• Развитая система метарограммирования
• Возможность интеграции с другими языками



                                             7
Person bender = new Person("Bender");
 bender.wish("lunapark", new HashMap<String, String[]>() {{ put(“with", new String[]{"blackjack", "hookers"} ); }});
 bender.wish("death", new HashMap<String, String[]>() {{ put("to_all", new String[]{"humans"} ); });




                                       bender = Person.new 'Bender'
                                       bender.wishes :lunapark, :with => [:blackjack, :hookers]
                                       bender.wishes :death, :to_all => :humans




Bender.wishes {
   lunapark with blackjack, hookers
   death to_all humans
}


                                                                                                                8
“По моему опыту, большинство грамотно
написанных на Ruby программ уже являются
 DSL – просто по природе синтаксиса Ruby.”
                      - Jamis Buck, 37 signals




                                                 9
Простой пример
                                                          Перепиши мне
                                                         конфиг, а то я тут
                                                       ничего не понимаю..!
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<repository>
  <solver class="implementation.solvers.SempSolver">
    <setup>
      <param type="string" name="SOLVER_HOME">"~/.wine/drive_c/semp/"</param>
    </setup>
    <method name="EfficiencyTrendAnalysis" input="reflexive">
      <param type="string"
name="MODULE_PATH">"modules/EfficiencyTrendAnalysis/"<param>
      ...
    </method>
    ...
  </solver>
</repository>




                                                                                10
Простой пример
                                                   Перепиши мне
                                                  конфиг, а то я тут
                                                ничего не понимаю..!


require 'repo'

solver("implementation.solvers.SempSolver") {
  SOLVER_HOME = "~/.wine/drive_c/semp/"
  MODULES_HOME = File.join SOLVER_HOME, "modules"
  method {
    name "EfficiencyTrendAnalysis"                       Сам перепиши!
    MODULE_PATH = File.join MODULES_HOME, name
  }
}




                                                                       11
Жизненный пример

monkey – язык для функционального
тестирования промышленных
энергетических сетей.

Основные функции:
  • Описание тест-кейсов
  • Сбор статистики
  • Анализ результатов исполнения тест-
    кейсов

                                      12
Исходная инфраструктура
системы


•   Система управления сетями, написанная на
    Java
•   Доступ к данным через удаленную SQL-базу
•   Надо тестировать код на mockup-системах
•   Нужен контроль состояния работающих
    систем




                                               13
Исходная ситуация с
                тестированием
                                                  А как нам писать
                                               функциональные тесты
                                                  для диагностики
                             Сервер
Окей, вот вам                                   работающи систем?
  WebAPI
                    Java Core     SQL-база



                    WebAPI        SSH-доступ   А тесты на PHP писать?!




                                                                  14
Решение: JRuby
(в других условиях здесь могли бы быть С-Ruby,
    IronRuby, а может и другие языки, например Scala
    или Clojure)




                                                       15
JRuby

• Выполняется на JVM
• Прямая работа с Java-объектами через
  публичные интерфейсы
• Контроль результатов и сбор данных
  напрямую из SQL-базы
• Обработка данных и анализ результатов
  на стороне Ruby
• Быстро и эффективно

                                     16
Результат

                   Сервер
       Java Core               SQL-база



Запросы к     Сбор данных       Методы анализа
  ядру           из БД             данных

             Ruby DSL-framework



                            А где PHP, к которому мы уже
                                     привыкли?!


                                                           17
Результат

TestTouCostOneDay = testcase(MockBaseTestCase, 'TestTouCostOneDay') {

        request categorizedMetricDataRequest(subscriber, sdp) {
        metric(Cost)
        granularity(DAY)
        interval(accountInterval.start, accountInterval.start)
        timezone("PST")
    }

        validate {
            granularity.should == DAY
            processor(TouProcessor).cost.should be_granular_limited
                    dpAccount.servicePlan.costLimit
        }
}



                                                                        18
Как подойти к созданию
       Ruby-DSL?



                         19
DSL Roadmap


•   Начните с фиксации предполагаемого DSL в
    виде валидного Ruby-синтаксиса
•   Не увлекайтесь моделью – все равно её
    переделывать
•   Сразу подумайте о том, как вы хотите
    соединить DSL с существующей средой




                                               20
DSL Roadmap


• Используйте Test-Driven Development – это
  естественный способ опробовать язык до того,
  как он окончательно создан
• Ведите разработку малыми итерациями
• Согласуйте вид DSL с экспертом предметной
  области, если сами им не являетесь




                                            21
DSL Roadmap

• Разберитесь с тем, что может, и что не может
  Ruby. Метапрограммирование является
  основой создания DSL.
• Убедитесь, что знаете все эти слова:
      • eval, instance_eval и class_eval
      • define_method и alias_method
      • method_missing и const_missing
      • Open class(1.8) или Refinements (1.9)
• Но повторяю – не увлекайтесь моделью!


                                                 22
DSL Roadmap


• Минимизируйте зашумленность языка
• Используйте syntax sugar:
      • опциональные скобки и терминальные
        символы
      • символы вместо строк
      • блоки
      • литеральные массивы и хэши
      • группировка аргументов



                                         23
DSL Roadmap



•   Зафиксируйте модель, когда вы целиком
    разобрались с внешним видом языка
•   Наведите порядок, проведите рефакторинг




                                              24
Дополнительная
          информация:


•   Книга “Metaprogramming Ruby” из серии “The Pragmatic
    Bookshelf”
•   http://rubyconf2008.confreaks.com/advanced-dsls-in-ruby.html
•   http://obiefernandez.com/presentations/obie_fernandez-agile_d
•   Martin Fowler “Domain Specific Languages”




                                                          25
О чем это все было?


• Существуют случаи, когда использование DSL
  оправдано
• Динамические языки позволяют сравнительно
  дешево получать это преимущество
• Современные языки можно интегрировать в
  широкий класс промышленных проектов
• Лучший способ оценить плюсы и минусы –
  попробовать


                                          26
Вопросы?


Сидельников Антон
ndmeredian@gmail.com
+7(923)114-5551


                       27

Contenu connexe

Tendances

Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...Ontico
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)Ontico
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахAleksander Alekseev
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?Vasil Remeniuk
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyAlex Chistyakov
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilationNikita Lipsky
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Top10 доводов против языка Ruby
Top10 доводов против языка RubyTop10 доводов против языка Ruby
Top10 доводов против языка Rubyguest5f907e
 
Node.js Меньше сложности, больше надежности Holy.js 2021
Node.js Меньше сложности, больше надежности Holy.js 2021Node.js Меньше сложности, больше надежности Holy.js 2021
Node.js Меньше сложности, больше надежности Holy.js 2021Timur Shemsedinov
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Ontico
 
Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Fwdays
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Fwdays
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинSergey Xek
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ontico
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полнойОмские ИТ-субботники
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Ontico
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей ФедоровCodeFest
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Николай Лавлинский
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Ontico
 
[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoFAleksey Shipilev
 

Tendances (20)

Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
Выбираем СУБД для хранения временных рядов / Павел Филонов (Лаборатория Каспе...
 
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
NodeJS в HighLoad проекте / Акрицкий Владимир (iAge Engineering)
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Опыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на RubyОпыт эксплуатации большого проекта на Ruby
Опыт эксплуатации большого проекта на Ruby
 
Java Ahead-Of-Time compilation
Java Ahead-Of-Time compilationJava Ahead-Of-Time compilation
Java Ahead-Of-Time compilation
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Top10 доводов против языка Ruby
Top10 доводов против языка RubyTop10 доводов против языка Ruby
Top10 доводов против языка Ruby
 
Node.js Меньше сложности, больше надежности Holy.js 2021
Node.js Меньше сложности, больше надежности Holy.js 2021Node.js Меньше сложности, больше надежности Holy.js 2021
Node.js Меньше сложности, больше надежности Holy.js 2021
 
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
Функциональное тестирование высоконагруженных проектов / Илья Пастушков (2ГИС)
 
Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"Anton Tsitou "Cycle ORM and Graphs"
Anton Tsitou "Cycle ORM and Graphs"
 
Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"Serghei Iakovlev "Chaos engineering in action"
Serghei Iakovlev "Chaos engineering in action"
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
Ангелы и демоны многопоточного программирования / Алексей Федоров (Одноклассн...
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
 
Алексей Федоров
Алексей ФедоровАлексей Федоров
Алексей Федоров
 
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
Чеклист по клиентской оптимизации - Лавлинский Николай, РИТ++ 2017
 
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
 
[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF[jeeconf-2011] Java Platform Performance BoF
[jeeconf-2011] Java Platform Performance BoF
 

En vedette

введение в Ror олег андреев
введение в Ror   олег андрееввведение в Ror   олег андреев
введение в Ror олег андреевMedia Gorod
 
Ruby on Rails снижаем стоимость разработки
Ruby on Rails снижаем стоимость разработкиRuby on Rails снижаем стоимость разработки
Ruby on Rails снижаем стоимость разработкиMedia Gorod
 
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"railsclub
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Pavel Tsukanov
 
10 reasons I love RubyOnRails
10 reasons I love RubyOnRails10 reasons I love RubyOnRails
10 reasons I love RubyOnRailsPavel Gabriel
 
Разрушаем негативные мифы Ruby, Rails.
Разрушаем негативные мифы Ruby, Rails.Разрушаем негативные мифы Ruby, Rails.
Разрушаем негативные мифы Ruby, Rails.Ravil Bayramgalin
 
Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Constantin Kichinsky
 
Ruby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйRuby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйAlex Mikitenko
 

En vedette (10)

Erlang ruby
Erlang rubyErlang ruby
Erlang ruby
 
введение в Ror олег андреев
введение в Ror   олег андрееввведение в Ror   олег андреев
введение в Ror олег андреев
 
Ruby on Rails снижаем стоимость разработки
Ruby on Rails снижаем стоимость разработкиRuby on Rails снижаем стоимость разработки
Ruby on Rails снижаем стоимость разработки
 
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
Антон Веснин - "Обзорное сравнение серверов приложений ruby-on-rails"
 
Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?Ruby - или зачем мне еще один язык программирования?
Ruby - или зачем мне еще один язык программирования?
 
Ruby on Rails for noobs
Ruby on Rails for noobsRuby on Rails for noobs
Ruby on Rails for noobs
 
10 reasons I love RubyOnRails
10 reasons I love RubyOnRails10 reasons I love RubyOnRails
10 reasons I love RubyOnRails
 
Разрушаем негативные мифы Ruby, Rails.
Разрушаем негативные мифы Ruby, Rails.Разрушаем негативные мифы Ruby, Rails.
Разрушаем негативные мифы Ruby, Rails.
 
Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!Ruby On Rails: Web-разработка по-другому!
Ruby On Rails: Web-разработка по-другому!
 
Ruby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивыйRuby: интерпретируемый, динамичный, человеколюбивый
Ruby: интерпретируемый, динамичный, человеколюбивый
 

Similaire à CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как готовить и сколько добавить метапрограммирования

Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrusAlex Chistyakov
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...GoQA
 
Debbug Rails Application For Dummies
Debbug Rails Application For DummiesDebbug Rails Application For Dummies
Debbug Rails Application For DummiesAndrey Subbota
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)Ontico
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...IT-Portfolio
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended versionIvan Krylov
 
Профессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseПрофессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseAlexander Granin
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Ruby Meditation
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС 2ГИС Технологии
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на RailsAndrei Kaleshka
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)Alexander Gornik
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!Roman Dvornov
 
IOP202 Redis in Azure
IOP202 Redis in AzureIOP202 Redis in Azure
IOP202 Redis in Azuremourhoon
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Couchbase, что за зверь и на что способен.
Couchbase, что за зверь и на что способен.Couchbase, что за зверь и на что способен.
Couchbase, что за зверь и на что способен.Alexey Rusnak
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruYandex
 

Similaire à CodeFest 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как готовить и сколько добавить метапрограммирования (20)

Daemons In Web on #devrus
Daemons In Web on #devrusDaemons In Web on #devrus
Daemons In Web on #devrus
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
ОЛЕКСАНДР ХОТЕМСЬКИЙ «Антипаттерни та велосипеди в JavaScript автоматизації» ...
 
Debbug Rails Application For Dummies
Debbug Rails Application For DummiesDebbug Rails Application For Dummies
Debbug Rails Application For Dummies
 
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)Путь от монолита на PHP к микросервисам на Scala  / Денис Иванов (2GIS)
Путь от монолита на PHP к микросервисам на Scala / Денис Иванов (2GIS)
 
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
20 апреля, DEV {highload}, "Демоны в большом проекте – проблемы и их решения ...
 
Разговор про Java 9. Extended version
Разговор про Java 9. Extended versionРазговор про Java 9. Extended version
Разговор про Java 9. Extended version
 
Профессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом EnterpriseПрофессиональная разработка в суровом Enterprise
Профессиональная разработка в суровом Enterprise
 
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
Reinventing the wheel - why do it and how to feel good about it - Julik Tarkh...
 
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС «Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
«Путь от монолита на PHP к микросервисам на Scala» – Денис Иванов, 2ГИС
 
Корпоративное приложение на Rails
Корпоративное приложение на RailsКорпоративное приложение на Rails
Корпоративное приложение на Rails
 
Little Service in 2h
Little Service in 2hLittle Service in 2h
Little Service in 2h
 
разработка бизнес приложений (7)
разработка бизнес приложений (7)разработка бизнес приложений (7)
разработка бизнес приложений (7)
 
Баба Яга против!
Баба Яга против!Баба Яга против!
Баба Яга против!
 
IOP202 Redis in Azure
IOP202 Redis in AzureIOP202 Redis in Azure
IOP202 Redis in Azure
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Couchbase, что за зверь и на что способен.
Couchbase, что за зверь и на что способен.Couchbase, что за зверь и на что способен.
Couchbase, что за зверь и на что способен.
 
Крыша 2.0
Крыша 2.0Крыша 2.0
Крыша 2.0
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 

Plus de 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
 

Plus de 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 2012. Сидельников А. — Опыт создания DSL на Ruby. Где применить, как готовить и сколько добавить метапрограммирования

  • 1. Опыт создания DSL на Ruby. Где применить, как готовить и сколько добавить метапрограммирования. Антон Сидельников ndmeredian@gmail.com
  • 2. Содержание • О самой концепции DSL • Чем Ruby хорош для DSL • Использование Ruby-based DSL в реальных проектах • Ruby-based DSL Roadmap 2
  • 3. Предметно-ориентированный язык (Domain Specific Language) • Предназначен для решения узкого круга задач • Понятия предметной области являются элементарными • Задачи решаются в терминах предметной области 3
  • 4. Как можно применить DSL • Конфиги (apache, etc.), Make • Языки описания данных (HTML, TeX) • Язык описания правил (ipfw) • Язык для написания тестов • Высокоуровневый язык для написания бизнес-логики 4
  • 5. Использование DSL Pro Contra •Повышение уровня абстракции •Расходы на создание и •Более явная логика кода поддержку языка •Повышение скорости разработки •Область применения действительно мала •Можно передать управление не- программисту •Требует обучения пользователя 5
  • 6. Два подхода к созданию DSL External Internal •Придумываем грамматику •Выбираем язык по вкусу •Пишем интерпретатор... •Используем синтаксис и •…транслятор... семантику старого языка для •...или компилятор (если скучно) создания иллюзии нового 6
  • 7. Ruby-based DSL • Internal DSL • Поддерка IDE • Доступ к Ruby gems и прочему существующему коду • Еще большая скорость разработки • Гибкий синтаксис, обилие syntax sugar • Развитая система метарограммирования • Возможность интеграции с другими языками 7
  • 8. Person bender = new Person("Bender"); bender.wish("lunapark", new HashMap<String, String[]>() {{ put(“with", new String[]{"blackjack", "hookers"} ); }}); bender.wish("death", new HashMap<String, String[]>() {{ put("to_all", new String[]{"humans"} ); }); bender = Person.new 'Bender' bender.wishes :lunapark, :with => [:blackjack, :hookers] bender.wishes :death, :to_all => :humans Bender.wishes { lunapark with blackjack, hookers death to_all humans } 8
  • 9. “По моему опыту, большинство грамотно написанных на Ruby программ уже являются DSL – просто по природе синтаксиса Ruby.” - Jamis Buck, 37 signals 9
  • 10. Простой пример Перепиши мне конфиг, а то я тут ничего не понимаю..! <?xml version="1.0" encoding="UTF-8" standalone="no"?> <repository> <solver class="implementation.solvers.SempSolver"> <setup> <param type="string" name="SOLVER_HOME">"~/.wine/drive_c/semp/"</param> </setup> <method name="EfficiencyTrendAnalysis" input="reflexive"> <param type="string" name="MODULE_PATH">"modules/EfficiencyTrendAnalysis/"<param> ... </method> ... </solver> </repository> 10
  • 11. Простой пример Перепиши мне конфиг, а то я тут ничего не понимаю..! require 'repo' solver("implementation.solvers.SempSolver") { SOLVER_HOME = "~/.wine/drive_c/semp/" MODULES_HOME = File.join SOLVER_HOME, "modules" method { name "EfficiencyTrendAnalysis" Сам перепиши! MODULE_PATH = File.join MODULES_HOME, name } } 11
  • 12. Жизненный пример monkey – язык для функционального тестирования промышленных энергетических сетей. Основные функции: • Описание тест-кейсов • Сбор статистики • Анализ результатов исполнения тест- кейсов 12
  • 13. Исходная инфраструктура системы • Система управления сетями, написанная на Java • Доступ к данным через удаленную SQL-базу • Надо тестировать код на mockup-системах • Нужен контроль состояния работающих систем 13
  • 14. Исходная ситуация с тестированием А как нам писать функциональные тесты для диагностики Сервер Окей, вот вам работающи систем? WebAPI Java Core SQL-база WebAPI SSH-доступ А тесты на PHP писать?! 14
  • 15. Решение: JRuby (в других условиях здесь могли бы быть С-Ruby, IronRuby, а может и другие языки, например Scala или Clojure) 15
  • 16. JRuby • Выполняется на JVM • Прямая работа с Java-объектами через публичные интерфейсы • Контроль результатов и сбор данных напрямую из SQL-базы • Обработка данных и анализ результатов на стороне Ruby • Быстро и эффективно 16
  • 17. Результат Сервер Java Core SQL-база Запросы к Сбор данных Методы анализа ядру из БД данных Ruby DSL-framework А где PHP, к которому мы уже привыкли?! 17
  • 18. Результат TestTouCostOneDay = testcase(MockBaseTestCase, 'TestTouCostOneDay') { request categorizedMetricDataRequest(subscriber, sdp) { metric(Cost) granularity(DAY) interval(accountInterval.start, accountInterval.start) timezone("PST") } validate { granularity.should == DAY processor(TouProcessor).cost.should be_granular_limited dpAccount.servicePlan.costLimit } } 18
  • 19. Как подойти к созданию Ruby-DSL? 19
  • 20. DSL Roadmap • Начните с фиксации предполагаемого DSL в виде валидного Ruby-синтаксиса • Не увлекайтесь моделью – все равно её переделывать • Сразу подумайте о том, как вы хотите соединить DSL с существующей средой 20
  • 21. DSL Roadmap • Используйте Test-Driven Development – это естественный способ опробовать язык до того, как он окончательно создан • Ведите разработку малыми итерациями • Согласуйте вид DSL с экспертом предметной области, если сами им не являетесь 21
  • 22. DSL Roadmap • Разберитесь с тем, что может, и что не может Ruby. Метапрограммирование является основой создания DSL. • Убедитесь, что знаете все эти слова: • eval, instance_eval и class_eval • define_method и alias_method • method_missing и const_missing • Open class(1.8) или Refinements (1.9) • Но повторяю – не увлекайтесь моделью! 22
  • 23. DSL Roadmap • Минимизируйте зашумленность языка • Используйте syntax sugar: • опциональные скобки и терминальные символы • символы вместо строк • блоки • литеральные массивы и хэши • группировка аргументов 23
  • 24. DSL Roadmap • Зафиксируйте модель, когда вы целиком разобрались с внешним видом языка • Наведите порядок, проведите рефакторинг 24
  • 25. Дополнительная информация: • Книга “Metaprogramming Ruby” из серии “The Pragmatic Bookshelf” • http://rubyconf2008.confreaks.com/advanced-dsls-in-ruby.html • http://obiefernandez.com/presentations/obie_fernandez-agile_d • Martin Fowler “Domain Specific Languages” 25
  • 26. О чем это все было? • Существуют случаи, когда использование DSL оправдано • Динамические языки позволяют сравнительно дешево получать это преимущество • Современные языки можно интегрировать в широкий класс промышленных проектов • Лучший способ оценить плюсы и минусы – попробовать 26