Предметно-ориентированные языки программирования                  Кириллов Александр, UNDEV
[ DSL ]Предметно-ориентированный язык -      это язык программирования с ограниченными      выразительными возможностями, ...
[ DSL ]Зачем?
[ DSL ]Зачем?
[ DSL ]Зачем?                          бк и...                    ско                эти             уж          Ох
[ DSL ]           BankAccount.configure do |account|                    account.number 1234                    account.typ...
[ Ключевые моменты ]Где и кто использует DSL?
[ Ключевые моменты ]Где и кто использует DSL:- конфигурации# TravisCI config file (.yaml)script: "bundle exec rake travis"...
[ Ключевые моменты ]Где и кто использует DSL:- конфигурации- зависимости пакетов# Gemfilesource http://rubygems.orggem rai...
[ Ключевые моменты ]Где и кто использует DSL:- конфигурации- зависимости пакетов- части фреймворков# Sample resource route...
[ Ключевые моменты ]Где и кто использует DSL:- конфигурации- зависимости пакетов- части фреймворков- системы тестирования#...
[ Ключевые моменты ]Где и кто использует DSL:- системы тестирования # language: ru Функционал: Сложение чисел   Чтобы не с...
[ Ключевые моменты ]Где и кто использует DSL:- и еще-еще-еще...
[ Ключевые моменты ]Язык программирования
[ Ключевые моменты ]Язык программированияДекларативный подход                        ЧТО делать                        вме...
[ Ключевые моменты ]Язык программированияДекларативный подходПрирода языка
[ Ключевые моменты ]Язык программированияДекларативный подходПрирода языкаОграниченные выразительныевозможности
[ Ключевые моменты ]Язык программированияДекларативный подходПрирода языкаОграниченные выразительныеВозможностиОриентирова...
[ Категории DSL ]{    Внутренний DSL: Lisp, Ruby, etc...,}
[ Категории DSL ]{    Внутренний DSL: Lisp, Ruby, etc...,    Внешний DSL: XML, RegExp, SQL, CSS}
[ Категории DSL ]{    Внутренний DSL: Lisp, Ruby, etc...,    Внешний DSL: XML, RegExp, SQL, CSS,    Языковые инструменталь...
[ Реализация DSL ]
[ Реализация DSL ]
[ Внутренний DSL ]> Текучий интерфейс (fluent interface) Применение обычного API: processor = Processor.new(arch: :i386, c...
[ Внутренний DSL ]> Текучий интерфейс (fluent interface) Применение обычного API:                                         ...
[ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов: computer()   .processor()     .cores(2)     ....
[ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов: $("#menu")   .fadeIn(fast)   .addClass("activ...
[ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов: $("#menu")   .fadeIn(fast)   .addClass("activ...
[ Внутренний DSL ]> Текучий интерфейс (fluent interface)              Связывание методов Последовательность функций: compu...
[ Внутренний DSL ]> Текучий интерфейс (fluent interface)                             Связывание методов              После...
[ Внутренний DSL ]> Текучий интерфейс (fluent interface)                                    Связывание методов            ...
[ Внутренний DSL ]> Текучий интерфейс (fluent interface)> Работа с синтаксическим деревом
[ Внутренний DSL ]> Текучий интерфейс (fluent interface)> Работа с синтаксическим деревом> Аннотации
[ Внутренний DSL ]> Текучий интерфейс (fluent interface)> Работа с синтаксическим деревом> Аннотации> Макросы
[ Внутренний DSL ]> Текучий интерфейс (fluent interface)> Работа с синтаксическим деревом> Аннотации                  def ...
[ Внешний DSL ]> Синтаксический анализ
[ Внешний DSL ]> Синтаксический анализВходной поток — это обычный текст (...обычно o_0)
[ Внешний DSL ]> Синтаксический анализ Управляемая разделителями трансляция Delimiter-Directed Translation event door_open...
[ Внешний DSL ]> Синтаксический анализ Управляемая разделителями трансляция Delimiter-Directed Translation                ...
[ Внешний DSL ]> Синтаксический анализ Управляемая разделителями трансляция Delimiter-Directed Translation                ...
[ Внешний DSL ]> Синтаксический анализ Синтаксически управляемая трансляция Syntax-Directed Translation                   ...
[ Внешний DSL ]> Синтаксический анализГрамматика входного языка.list            :   eventList    commandList        ;event...
[ Внешний DSL ]> Синтаксический анализГрамматика входного языка.Форма Бэкуса-Наура[E]BNFlist            :   eventList    c...
[ Внешний DSL ]> Синтаксический анализСинтаксический анализатор на основерекурсивного спускаRecursive Descent Parser
[ Внешний DSL ]> Синтаксический анализКомбинатор синтаксических анализаторовParser Combinator                        Комби...
[ Внешний DSL ]> Синтаксический анализГенератор синтаксических анализаторовParser Generator                     Генерация ...
[ Для чего все это? ]В результате мы должны иметьпостроенную семантическую модель
[ Для чего все это? ]В результате мы должны иметьпостроенную семантическую модель> Для использования в программном продукте
[ Для чего все это? ]В результате мы должны иметьпостроенную семантическую модель> Для использования в программном продукт...
[ Генерация кода ]> Генерация c помощью преобразователя  Transformer Generation
[ Генерация кода ]> Генерация c помощью преобразователя  Transformer Generation> Шаблонная генерация Templated Generation
[ Генерация кода ]> Генерация c помощью преобразователя  Transformer Generation> Шаблонная генерация Templated Generation>...
[ Если Вы заинтересованы ]                http://martinfowler.com/dslCatalog/
[ Спасибо за внимание! ]     Кириллов Александр       http://twitter.com/saratovsource
Upcoming SlideShare
Loading in …5
×

Предметно-ориентированные языки программирования (DSL)

2,039 views

Published on

Доклад с конференции "На Стачку" 2013, Ульяновск.

Published in: Technology
5 Comments
5 Likes
Statistics
Notes
No Downloads
Views
Total views
2,039
On SlideShare
0
From Embeds
0
Number of Embeds
185
Actions
Shares
0
Downloads
21
Comments
5
Likes
5
Embeds 0
No embeds

No notes for slide

Предметно-ориентированные языки программирования (DSL)

  1. 1. Предметно-ориентированные языки программирования Кириллов Александр, UNDEV
  2. 2. [ DSL ]Предметно-ориентированный язык - это язык программирования с ограниченными выразительными возможностями, ориентированный на некую конкретную предметную область Мартин Фаулер
  3. 3. [ DSL ]Зачем?
  4. 4. [ DSL ]Зачем?
  5. 5. [ DSL ]Зачем? бк и... ско эти уж Ох
  6. 6. [ DSL ] BankAccount.configure do |account| account.number 1234 account.type :checkingЗачем? Ruby: account.openDate 11.04.1974 account.balance 25382.20 account.holder do |holder| holder.lastName Singh holder.firstName Darshan end end BankAccount: number: 1234 type: checking open_date: 11.04.1974 YAML: balance: 25382.20 account_holder: last_name: Singh first_name: Darshan
  7. 7. [ Ключевые моменты ]Где и кто использует DSL?
  8. 8. [ Ключевые моменты ]Где и кто использует DSL:- конфигурации# TravisCI config file (.yaml)script: "bundle exec rake travis"before_script: ./bin/ci/before_build.shservices: mongodbrvm: - 1.9.3notifications: email: - didier@nocoffee.fr - mario@mariovisic.com irc: "irc.freenode.org#locomotivecms"branches: only: - master
  9. 9. [ Ключевые моменты ]Где и кто использует DSL:- конфигурации- зависимости пакетов# Gemfilesource http://rubygems.orggem rails, 3.2.12group :assets do gem therubyracer gem select2-rails, github: "argerim/select2-rails"endgroup :test do gem "minitest" gem mocha, require: falseend
  10. 10. [ Ключевые моменты ]Где и кто использует DSL:- конфигурации- зависимости пакетов- части фреймворков# Sample resource routeresources :products do resources :comments resources :sales do get recent, on: :collection endend
  11. 11. [ Ключевые моменты ]Где и кто использует DSL:- конфигурации- зависимости пакетов- части фреймворков- системы тестирования# Rspec exampledescribe Account do it "has a balance of zero when first created" do Account.new.balance.should eq(Money.new(0)) expect { @a = 5 }.to change { @a }.from(nil).to(5) endend
  12. 12. [ Ключевые моменты ]Где и кто использует DSL:- системы тестирования # language: ru Функционал: Сложение чисел Чтобы не складывать в уме Все, у кого с этим туго Хотят автоматическое сложение целых чисел Сценарий: Сложение двух целых чисел Допустим я ввожу число 50 И затем ввожу число 70 Если я нажимаю "+" То результатом должно быть число 120
  13. 13. [ Ключевые моменты ]Где и кто использует DSL:- и еще-еще-еще...
  14. 14. [ Ключевые моменты ]Язык программирования
  15. 15. [ Ключевые моменты ]Язык программированияДекларативный подход ЧТО делать вместо КАК делать
  16. 16. [ Ключевые моменты ]Язык программированияДекларативный подходПрирода языка
  17. 17. [ Ключевые моменты ]Язык программированияДекларативный подходПрирода языкаОграниченные выразительныевозможности
  18. 18. [ Ключевые моменты ]Язык программированияДекларативный подходПрирода языкаОграниченные выразительныеВозможностиОриентированность на предметную область
  19. 19. [ Категории DSL ]{ Внутренний DSL: Lisp, Ruby, etc...,}
  20. 20. [ Категории DSL ]{ Внутренний DSL: Lisp, Ruby, etc..., Внешний DSL: XML, RegExp, SQL, CSS}
  21. 21. [ Категории DSL ]{ Внутренний DSL: Lisp, Ruby, etc..., Внешний DSL: XML, RegExp, SQL, CSS, Языковые инструментальные средства: *}
  22. 22. [ Реализация DSL ]
  23. 23. [ Реализация DSL ]
  24. 24. [ Внутренний DSL ]> Текучий интерфейс (fluent interface) Применение обычного API: processor = Processor.new(arch: :i386, cores: 2) dsk1 = Disk.new(size: 150.GB, speed:7200) dsk2 = Disk.new(size: 70.GB, speed:7200) computer = Computer.new({ processor: processor, disks: [dsk1, dsk2] })
  25. 25. [ Внутренний DSL ]> Текучий интерфейс (fluent interface) Применение обычного API: ту processor = Processor.new(arch: :i386, cores: 2) рограммис dsk1 = Disk.new(size: 150.GB, speed:7200) ти... ас ятно п етной обл ...пон пр дм dsk2 = Disk.new(size: 70.GB, еspeed:7200) исту ециал computer = Computer.new({ processor:тно сп оня processor, неп[dsk1, dsk2] disks: })
  26. 26. [ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов: computer() .processor() .cores(2) .x64() .disk() .size(150) .speed(7200) .disk() .size(70) .speed(7200)
  27. 27. [ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов: $("#menu") .fadeIn(fast) .addClass("active") .css(marginRight, 10px);
  28. 28. [ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов: $("#menu") .fadeIn(fast) .addClass("active") .css(marginRight, 10px); $("#thumbnails li").mouseenter(function(e){ $(this).find(img) .stop() .animate({opacity: 0.8}, 300) .end() .find(.viewcasestudy) .fadeIn(fast); }).fadeIn(fast);
  29. 29. [ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов Последовательность функций: computer() --processor() ----cores(2) ----x64() --disk() ----size(150) ----speed(7200) --disk() ----size(70) ----speed(7200)
  30. 30. [ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов Последовательность функций Вложенные функции: computer( --processor( ----cores(2), ----x64() ––), --disk( ----size(150), ----speed(7200) ––), --disk( ----size(70), ----speed(7200) --) )
  31. 31. [ Внутренний DSL ]> Текучий интерфейс (fluent interface) Связывание методов Последовательность функций Вложенные функции Замыкания: ComputerBuilder.build do |c| c.processor do |p| p.cores 2 p.x64 p.speed 2.2 end c.disk do |d| d.size 120 end c.disk do |d| d.size 70 d.speed 7200 d.sata end end
  32. 32. [ Внутренний DSL ]> Текучий интерфейс (fluent interface)> Работа с синтаксическим деревом
  33. 33. [ Внутренний DSL ]> Текучий интерфейс (fluent interface)> Работа с синтаксическим деревом> Аннотации
  34. 34. [ Внутренний DSL ]> Текучий интерфейс (fluent interface)> Работа с синтаксическим деревом> Аннотации> Макросы
  35. 35. [ Внутренний DSL ]> Текучий интерфейс (fluent interface)> Работа с синтаксическим деревом> Аннотации def method_missing(m, *args, &block)> Макросы puts "Theres no method called #{m} here." end> Динамический отклик
  36. 36. [ Внешний DSL ]> Синтаксический анализ
  37. 37. [ Внешний DSL ]> Синтаксический анализВходной поток — это обычный текст (...обычно o_0)
  38. 38. [ Внешний DSL ]> Синтаксический анализ Управляемая разделителями трансляция Delimiter-Directed Translation event door_opened event link_clicked event window_closed command play_music command volume_up 10 command send_message "Hello, world"
  39. 39. [ Внешний DSL ]> Синтаксический анализ Управляемая разделителями трансляция Delimiter-Directed Translation разделитель event door_openedn event link_clicked event window_closed command play_music command volume_up 10 command send_message "Hello, world" инструкция
  40. 40. [ Внешний DSL ]> Синтаксический анализ Управляемая разделителями трансляция Delimiter-Directed Translation Ограничение: event door_opened event link_clicked event window_closed Нет способов обработки иерархического контекста command play_music command volume_up 10 command send_message "Hello, world"
  41. 41. [ Внешний DSL ]> Синтаксический анализ Синтаксически управляемая трансляция Syntax-Directed Translation commands event block door_opened link_clicked end command commandDec commandDec end command play_music volume_up 10 play_music volume_up 10 send_message "Hello, world" end
  42. 42. [ Внешний DSL ]> Синтаксический анализГрамматика входного языка.list : eventList commandList ;eventList : events eventDec* end;eventDec : identifier ;commandList : commands commandDec* end;commandDec : identifier identifier? ;
  43. 43. [ Внешний DSL ]> Синтаксический анализГрамматика входного языка.Форма Бэкуса-Наура[E]BNFlist : eventList commandList ;eventList : events eventDec* end;eventDec : identifier ;commandList : commands commandDec* end;commandDec : identifier identifier? ;
  44. 44. [ Внешний DSL ]> Синтаксический анализСинтаксический анализатор на основерекурсивного спускаRecursive Descent Parser
  45. 45. [ Внешний DSL ]> Синтаксический анализКомбинатор синтаксических анализаторовParser Combinator Комбинатор команд Анализатор Анализаторначала блока команд конца блока команд Комбинатор списка команд Анализатор Анализатор команды аргумента команды
  46. 46. [ Внешний DSL ]> Синтаксический анализГенератор синтаксических анализаторовParser Generator Генерация Грамматика Синтаксический a : ID INT ; анализатор ID : a..z+ ; INT : 0..9+;
  47. 47. [ Для чего все это? ]В результате мы должны иметьпостроенную семантическую модель
  48. 48. [ Для чего все это? ]В результате мы должны иметьпостроенную семантическую модель> Для использования в программном продукте
  49. 49. [ Для чего все это? ]В результате мы должны иметьпостроенную семантическую модель> Для использования в программном продукте> Для генерации нового кода
  50. 50. [ Генерация кода ]> Генерация c помощью преобразователя Transformer Generation
  51. 51. [ Генерация кода ]> Генерация c помощью преобразователя Transformer Generation> Шаблонная генерация Templated Generation
  52. 52. [ Генерация кода ]> Генерация c помощью преобразователя Transformer Generation> Шаблонная генерация Templated Generation> Встроенный помощник Embedment Helper
  53. 53. [ Если Вы заинтересованы ] http://martinfowler.com/dslCatalog/
  54. 54. [ Спасибо за внимание! ] Кириллов Александр http://twitter.com/saratovsource

×