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

Igor Khotin - Domain Specific Languages