Domain Specific Languages Игорь Хотинь E-mail: khotin@gmx.com
Background <ul><li>10+ лет в IT-индустрии
6+ лет с Java
Agile-практик
Сторонник гибкого дизайна </li></ul>
Наше удивительное путешествие... <ul><li>Введение в DSL
Пример DSL
Java и DSL
Перспективы
Q&A </li></ul>
Что такое DSL? Сленг - атрибут профессиональной среды
Что такое DSL? <ul>Domain-Specific Language – это ограниченный язык программирования заточенный под определённую область п...
Кто использует DSL?
Ретроспектива DSL <ul><li>Термин DSL появился сравнительно недавно
Сама концепция широко применялась в индустрии десятки лет
4GL, MDD, MDA... </li></ul>
Unix <ul>shell </ul>grep awk make lexx yacc troff
DSLs <ul><li>PostScript, VRML, POV-Ray
Csound, PureData
Maple, Maxima
QuakeC, UnrealScript
макросы Lisp и словари Forth </li></ul>
XML <ul><li>XPath
XQuery
XSLT
XSL-FO
…
Конфигурации приложений </li></ul>
Что считать DSL? <ul><li>Субъективная перспектива
Эволюция языков </li><ul><li>Logo – загадочные черепашки
Erlang – родом из DSL </li></ul></ul>
Формы DSLs <ul><li>Internal DSLs </li><ul><li>API vs DSL
OpenGL
Lisp
Forth
Rebol </li></ul><li>External DSLs </li></ul>
DSL <ul><li>Фокус
Песочница </li></ul>API <ul><li>Возможности </li></ul>Функциональность
Синтаксис DSL <ul><li>Лаконичный синтаксис
Валидация бизнес-логики
Доступность </li></ul><ul><li>Еще один язык </li></ul>API <ul><li>Поддержка IDE </li></ul><ul><li>Громоздкий синтаксис
Тесты и условия для валидации
Доступность ограничена </li></ul>
Домен DSL <ul><li>Гибкий дизайн
Понимание домена </li></ul>API <ul><li>Однообразность </li></ul><ul><li>Сложно выделить домен </li></ul>
Regular Expressions RegExPattern  pattern  =  new   RegExPattern(); pattern .add( &quot;http://&quot; ) .openBlock() .add(...
Regular Expressions &quot; http://regex.test.org &quot; .matches( &quot;http://[A-Za-z0-9.-]*.[A-Za-z]{3}&quot; );
Pizza Wars <ul><li>Java Pizza
XML Pizza
Decaf Pizza </li></ul>
Java Pizza public void  makePizza() { PizzaRobot  robot  = PizzaRobot.getInstance(); robot .establishCrust( Crust.MEDIUM_A...
Java Pizza public void  makePizza() { PizzaRobot  robot  = PizzaRobot.getInstance(); robot .establishCrust( Crust.MEDIUM_A...
Java Pizza public void  makePizza() { PizzaRobot  robot  = PizzaRobot.getInstance(); robot .establishCrust( Crust.MEDIUM_A...
Java Pizza public void  makePizza() { PizzaRobot  robot  = PizzaRobot.getInstance(); robot .addCheese( Cheese.CHEDDAR ,  1...
Java Pizza public void  makePizza()  throws  IOException { PizzaRobot  robot  = PizzaRobot.getInstance(); robot .addCheese...
Java Pizza
XML Pizza <pizza> <crust size=&quot;medium&quot; thikness=&quot;thin&quot;> <chesse> <name>Cheddar</name> <quantity>150</q...
XML Pizza <pizza> <crust  size = &quot;medium&quot;   thikness = &quot;thin&quot; > <chesse> <name> Cheddar </name> <quant...
XML Pizza public void  makePizza() { PizzaRobot  robot = PizzaRobot.parseRecipe( &quot;capricciosa.xml&quot; ); robot .mak...
Decaf Pizza capricciosa.pizza: On medium thin crust add: sauce tomato  30 chesse Cheddar  150 mushroms  200 olives  50 pac...
Decaf Pizza capricciosa.pizza: sauce tomato  30 chesse Cheddar  150 mushroms  200 olives  50 Pack >>  Error! No crust defi...
Java Pizza public void  makePizza() { PizzaRobot  robot  = PizzaRobot.getInstance(); robot .establishCrust( Crust.MEDIUM_A...
Upcoming SlideShare
Loading in …5
×

Igor Khotin - Domain Specific Languages

1,704 views

Published on

Экскурс в мир DSL. Технологии и инструменты для их создания для Java-платформы.

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,704
On SlideShare
0
From Embeds
0
Number of Embeds
449
Actions
Shares
0
Downloads
14
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Igor Khotin - Domain Specific Languages

  1. 1. Domain Specific Languages Игорь Хотинь E-mail: khotin@gmx.com
  2. 2. Background <ul><li>10+ лет в IT-индустрии
  3. 3. 6+ лет с Java
  4. 4. Agile-практик
  5. 5. Сторонник гибкого дизайна </li></ul>
  6. 6. Наше удивительное путешествие... <ul><li>Введение в DSL
  7. 7. Пример DSL
  8. 8. Java и DSL
  9. 9. Перспективы
  10. 10. Q&A </li></ul>
  11. 11. Что такое DSL? Сленг - атрибут профессиональной среды
  12. 12. Что такое DSL? <ul>Domain-Specific Language – это ограниченный язык программирования заточенный под определённую область применения </ul>Сленг - атрибут профессиональной среды
  13. 13. Кто использует DSL?
  14. 14. Ретроспектива DSL <ul><li>Термин DSL появился сравнительно недавно
  15. 15. Сама концепция широко применялась в индустрии десятки лет
  16. 16. 4GL, MDD, MDA... </li></ul>
  17. 17. Unix <ul>shell </ul>grep awk make lexx yacc troff
  18. 18. DSLs <ul><li>PostScript, VRML, POV-Ray
  19. 19. Csound, PureData
  20. 20. Maple, Maxima
  21. 21. QuakeC, UnrealScript
  22. 22. макросы Lisp и словари Forth </li></ul>
  23. 23. XML <ul><li>XPath
  24. 24. XQuery
  25. 25. XSLT
  26. 26. XSL-FO
  27. 27.
  28. 28. Конфигурации приложений </li></ul>
  29. 29. Что считать DSL? <ul><li>Субъективная перспектива
  30. 30. Эволюция языков </li><ul><li>Logo – загадочные черепашки
  31. 31. Erlang – родом из DSL </li></ul></ul>
  32. 32. Формы DSLs <ul><li>Internal DSLs </li><ul><li>API vs DSL
  33. 33. OpenGL
  34. 34. Lisp
  35. 35. Forth
  36. 36. Rebol </li></ul><li>External DSLs </li></ul>
  37. 37. DSL <ul><li>Фокус
  38. 38. Песочница </li></ul>API <ul><li>Возможности </li></ul>Функциональность
  39. 39. Синтаксис DSL <ul><li>Лаконичный синтаксис
  40. 40. Валидация бизнес-логики
  41. 41. Доступность </li></ul><ul><li>Еще один язык </li></ul>API <ul><li>Поддержка IDE </li></ul><ul><li>Громоздкий синтаксис
  42. 42. Тесты и условия для валидации
  43. 43. Доступность ограничена </li></ul>
  44. 44. Домен DSL <ul><li>Гибкий дизайн
  45. 45. Понимание домена </li></ul>API <ul><li>Однообразность </li></ul><ul><li>Сложно выделить домен </li></ul>
  46. 46. Regular Expressions RegExPattern pattern = new RegExPattern(); pattern .add( &quot;http://&quot; ) .openBlock() .add( RegExPattern. DIGIT ) .add( RegExPattern.SYMBOL ) .add( &quot;.&quot; ).add( &quot;-&quot; ) .closeBloc().add( RegExPattern. ONE_OR_MORE ) .openBlock() .add( RegExPattern. SYMBOL ) .closeBloc().times( 3 ); pattern .match( &quot; http://regex.test.org &quot; );
  47. 47. Regular Expressions &quot; http://regex.test.org &quot; .matches( &quot;http://[A-Za-z0-9.-]*.[A-Za-z]{3}&quot; );
  48. 48. Pizza Wars <ul><li>Java Pizza
  49. 49. XML Pizza
  50. 50. Decaf Pizza </li></ul>
  51. 51. Java Pizza public void makePizza() { PizzaRobot robot = PizzaRobot.getInstance(); robot .establishCrust( Crust.MEDIUM_AND_THIN ); robot .addSauce( Sauce.TOMMATO , 30 ); robot .addCheese( Cheese.CHEDDAR, 150 ); robot .addMushrooms( 200 ); robot .addOlives( 50 ); robot .pack(); }
  52. 52. Java Pizza public void makePizza() { PizzaRobot robot = PizzaRobot.getInstance(); robot .establishCrust( Crust.MEDIUM_AND_THIN ); robot .addCheese( Cheese.CHEDDAR, 150 ); robot .addMushrooms( 200 ); robot .addOlives( 50 ); robot .addSauce( Sauce.TOMMATO , 30 ); robot .pack(); }
  53. 53. Java Pizza public void makePizza() { PizzaRobot robot = PizzaRobot.getInstance(); robot .establishCrust( Crust.MEDIUM_AND_THIN ); robot .addCheese( Cheese.CHEDDAR, 150 ); robot .addMushrooms( 200 ); robot .addOlives( 50 ); robot .addSauce(Sauce.TOMMATO, 30); robot .pack(); }
  54. 54. Java Pizza public void makePizza() { PizzaRobot robot = PizzaRobot.getInstance(); robot .addCheese( Cheese.CHEDDAR , 150 ); robot .addMushrooms( 200 ); robot .addOlives( 50 ); robot .pack(); }
  55. 55. Java Pizza public void makePizza() throws IOException { PizzaRobot robot = PizzaRobot.getInstance(); robot .addCheese( Cheese.CHEDDAR , 150 ); robot .addMushrooms( 200 ); Socket socket = new Socket( &quot;localhost&quot; , 80 ); robot .addOlives( 50 ); robot .pack(); }
  56. 56. Java Pizza
  57. 57. XML Pizza <pizza> <crust size=&quot;medium&quot; thikness=&quot;thin&quot;> <chesse> <name>Cheddar</name> <quantity>150</quantity> </cheese> <mushroms><quantity>200</quantity></mushroms> <olives><quantity>50</quantity></olives> <sauce> <name>tomato</name> <quantity>50</quantity> </sauce> </crust> </pizza>
  58. 58. XML Pizza <pizza> <crust size = &quot;medium&quot; thikness = &quot;thin&quot; > <chesse> <name> Cheddar </name> <quantity> 150 </quantity> </cheese> <mushroms><quantity> 200 </quantity></mushroms> <olives><quantity> 50 </quantity></olives> <sauce> <name> tomato </name> <quantity> 50 </quantity> </sauce> </crust> </pizza>
  59. 59. XML Pizza public void makePizza() { PizzaRobot robot = PizzaRobot.parseRecipe( &quot;capricciosa.xml&quot; ); robot .make(); }
  60. 60. Decaf Pizza capricciosa.pizza: On medium thin crust add: sauce tomato 30 chesse Cheddar 150 mushroms 200 olives 50 pack public void makePizza() { PizzaRobot.execute( &quot;capricciosa.pizza&quot; ); }
  61. 61. Decaf Pizza capricciosa.pizza: sauce tomato 30 chesse Cheddar 150 mushroms 200 olives 50 Pack >> Error! No crust defined!
  62. 62. Java Pizza public void makePizza() { PizzaRobot robot = PizzaRobot.getInstance(); robot .establishCrust( Crust.MEDIUM_AND_THIN ); robot .addSauce( Sauce.TOMMATO , 30 ); robot .addCheese( Cheese.CHEDDAR, 150 ); robot .addMushrooms( 200 ); robot .addOlives( 50 ); robot .pack(); }
  63. 63. XML Pizza <pizza> <crust size = &quot;medium&quot; thikness = &quot;thin&quot; > <chesse> <name> Cheddar </name> <quantity> 150 </quantity> </cheese> <mushroms><quantity> 200 </quantity></mushroms> <olives><quantity> 50 </quantity></olives> <sauce> <name> tomato </name> <quantity> 50 </quantity> </sauce> </crust> </pizza>
  64. 64. Decaf Pizza capricciosa.pizza: On medium thin crust add: sauce tomato 30 chesse Cheddar 150 mushroms 200 olives 50 pack
  65. 66. Voodoo Magic Компиляторы и интерпретаторы
  66. 67. Voodoo Magic <ul><li>Возможности, полезные для внутренних DSL </li><ul><li>аннотации
  67. 68. аспекты
  68. 69. reflection
  69. 70. динамическая загрузка кода </li></ul></ul>
  70. 71. Voodoo Magic Tools <ul><li>Препроцессоры
  71. 72. Генераторы кода
  72. 73. Интерпретаторы
  73. 74. Компиляторы </li></ul>
  74. 75. Voodoo Preprocessors <ul><li>Простота реализации
  75. 76. Прозрачность интеграции </li></ul><ul><li>Избыточные зависимости в коде </li></ul>
  76. 77. <ul><li>Относительная простота </li></ul><ul><li>Ограниченная интеграция с IDE </li></ul>Voodoo Generators
  77. 78. <ul><li>Усложнение стукруры проекта
  78. 79. Нельзя изменять сгенерированный код
  79. 80. Легко модификациями в DSL или генераторе поломать код на Java </li></ul>Voodoo Generators
  80. 81. <ul><li>Проще, чем компиляторы </li></ul><ul><li>Медленнее байт-кода
  81. 82. Необходима поддержка в Run-time </li></ul>Voodoo Interpreters
  82. 83. <ul><li>Все преимущества байт-кода JVM </li></ul><ul><li>Сложность реализации и поддержки </li></ul>Voodoo Compilers
  83. 84. Voodoo JVMagic <ul><li>Стабильная мультиплатформенная среда
  84. 85. Верификация кода
  85. 86. Безопастность
  86. 87. Hotspot-компиляция
  87. 88. State of the art garbage collector
  88. 89. JRuby работает быстрее, чем родная имплементация Ruby </li></ul>
  89. 90. <ul><li>Синтаксис DSL должен отражать домен
  90. 91. Следует избегать синтаксического сахара
  91. 92. DSL должен предоставлять высокий уровень абстракции
  92. 93. Хороший DSL изолирует
  93. 94. нас от сервисного уровня
  94. 95. и других доменов </li></ul>Voodoo Syntax
  95. 96. Генераторы parser-ов <ul><li>ANTLR - ANother Tool for Language Recognition
  96. 97. JavaCC
  97. 98. SableCC
  98. 99. Coco/R </li></ul>
  99. 100. Bytecode <ul><li>Jasmin
  100. 101. Jamaica
  101. 102. Asm
  102. 103. Javassist </li></ul>
  103. 104. <ul><li>Xtext – Language Development Framework
  104. 105. Основан на Eclipse Modeling Framework
  105. 106. Интеграция DSL в Eclipse </li></ul>
  106. 107. Подсветка и валидация синтаксиса – Out of the box
  107. 108. Meta Programming System <ul><li>Сергей Дмитриев и Language Oriented Programming
  108. 109. JetBrains MetaProgramming System
  109. 110. IDE для DSL – подсветка синтаксиса, автодополнение, контекстный поиск </li></ul>
  110. 111. Meta Programming System
  111. 112. Meta Programming System
  112. 113. Meta Programming System Чем не IDE?
  113. 114. Что со всем этим делать?
  114. 115. Внедрение DSL <ul><li>Технология подразумевает компромиссы
  115. 116. Внедрение в экосистему проекта – утилиты, средства мониторинга, тесты
  116. 117. DSL – это не только синтаксис и транслятор, но и весь инструментарий, тесты, документация и библиотеки времени исполнения
  117. 118. Тесты – важнейший элемент инфраструктуры DSL </li></ul>
  118. 119. Внедрение DSL
  119. 120. Внедрение DSL
  120. 121. DSL и дизайн <ul><li>Архитектура, как набор DSL
  121. 122. Java + динамические и функциональные языки + DSLs = ultimate platform </li></ul>
  122. 123. Java <ul><li>Изменение парадигмы одна платформа = один язык
  123. 124. Инновации и Java
  124. 125. Рост популярности функциональных языков = рост популярности DSL </li></ul>
  125. 126. Всего лишь байты...
  126. 127. Спасибо!
  127. 128. Ресурсы <ul><li>http://martinfowler.com/dsl.html
  128. 129. http://www.eclipse.org/Xtext
  129. 130. http://www.jetbrains.com/mps
  130. 131. http://www.antlr.org
  131. 132. http://jasmin.sourceforge.net
  132. 133. http://asm.ow2.org </li></ul>
  133. 134. Литература <ul><li>Sergey Dmitriev, JetBrains, 2004. Language Oriented Programming: The Next Programming Paradigm.
  134. 135. Martin Fowler, 2010. Domain-Specific Languages
  135. 136. Fergal Dearle , 2010. Groovy for Domain-Specific Languages
  136. 137. Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman, 2006. Compilers: Principles, Techniques, and Tools (2nd Edition) </li></ul>
  137. 138. Контакты E-mail: [email_address] Blog: ikhotin.com Twitter: chaostarter linkedin .com/pub/igor-khotin/5/193/257

×