Предметно-ориентированные языки программирования (DSL)
-
Upload
- -
Category
Technology
-
view
1.476 -
download
0
description
Transcript of Предметно-ориентированные языки программирования (DSL)
![Page 1: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/1.jpg)
Предметно-ориентированныеязыки программирования
Кириллов Александр, UNDEV
![Page 2: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/2.jpg)
[ DSL ]
Предметно-ориентированный язык - Предметно-ориентированный язык -
это язык программирования с ограниченными выразительными возможностями, ориентированный на некую конкретную предметную область
Мартин Фаулер
![Page 3: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/3.jpg)
[ DSL ]
Зачем?
![Page 4: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/4.jpg)
[ DSL ]
Зачем?
![Page 5: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/5.jpg)
[ DSL ]
Ох уж эти скобки...
Зачем?
![Page 6: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/6.jpg)
[ DSL ]BankAccount.configure do |account| account.number 1234 account.type :checking account.openDate '11.04.1974' account.balance 25382.20 account.holder do |holder| holder.lastName 'Singh' holder.firstName 'Darshan' endend
BankAccount: number: 1234 type: checking open_date: '11.04.1974' balance: 25382.20 account_holder: last_name: Singh first_name: Darshan
Ruby:
YAML:
Зачем?
![Page 7: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/7.jpg)
[ Ключевые моменты ]
Где и кто использует DSL?
![Page 8: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/8.jpg)
[ Ключевые моменты ]
Где и кто использует DSL:- конфигурации# TravisCI config file (.yaml)script: "bundle exec rake travis"before_script: ./bin/ci/before_build.shservices: mongodbrvm: - 1.9.3notifications: email: - [email protected] - [email protected] irc: "irc.freenode.org#locomotivecms"branches: only: - master
![Page 9: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/9.jpg)
[ Ключевые моменты ]
Где и кто использует DSL:- конфигурации- зависимости пакетов# Gemfilesource 'http://rubygems.org'
gem 'rails', '3.2.12'group :assets do gem 'therubyracer' gem 'select2-rails', github: "argerim/select2-rails"endgroup :test do gem "minitest" gem 'mocha', require: falseend
![Page 10: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/10.jpg)
[ Ключевые моменты ]
Где и кто использует DSL:- конфигурации- зависимости пакетов- части фреймворков# Sample resource routeresources :products do resources :comments resources :sales do get 'recent', on: :collection endend
![Page 11: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/11.jpg)
[ Ключевые моменты ]
Где и кто использует 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
![Page 12: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/12.jpg)
[ Ключевые моменты ]
Где и кто использует DSL:- системы тестирования# language: ruФункционал: Сложение чисел Чтобы не складывать в уме Все, у кого с этим туго Хотят автоматическое сложение целых чисел
Сценарий: Сложение двух целых чисел Допустим я ввожу число 50 И затем ввожу число 70 Если я нажимаю "+" То результатом должно быть число 120
![Page 13: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/13.jpg)
[ Ключевые моменты ]
Где и кто использует DSL:- и еще-еще-еще...
![Page 14: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/14.jpg)
[ Ключевые моменты ]
Язык программирования
![Page 15: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/15.jpg)
[ Ключевые моменты ]
Язык программирования
Декларативный подходЧТО делатьвместо
КАК делать
![Page 16: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/16.jpg)
[ Ключевые моменты ]
Язык программирования
Декларативный подход
Природа языка
![Page 17: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/17.jpg)
[ Ключевые моменты ]
Язык программирования
Декларативный подход
Природа языка
Ограниченные выразительныевозможности
![Page 18: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/18.jpg)
[ Ключевые моменты ]
Язык программирования
Декларативный подход
Природа языка
Ограниченные выразительныеВозможности
Ориентированность на предметную область
![Page 19: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/19.jpg)
[ Категории DSL ]
{
Внутренний DSL: 'Lisp, Ruby, etc...',
}
![Page 20: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/20.jpg)
[ Категории DSL ]
{
Внутренний DSL: 'Lisp, Ruby, etc...',
Внешний DSL: 'XML, RegExp, SQL, CSS'
}
![Page 21: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/21.jpg)
[ Категории DSL ]
{
Внутренний DSL: 'Lisp, Ruby, etc...',
Внешний DSL: 'XML, RegExp, SQL, CSS',
Языковые инструментальные средства: '*'
}
![Page 22: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/22.jpg)
[ Реализация DSL ]
![Page 23: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/23.jpg)
[ Реализация DSL ]
![Page 24: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/24.jpg)
[ Внутренний DSL ]
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]})
Применение обычного API:
> Текучий интерфейс (fluent interface)
![Page 25: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/25.jpg)
[ Внутренний DSL ]
> Текучий интерфейс (fluent interface)
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]})
Применение обычного API:
...понятно програ
ммисту
непонятно специа
листу предметной об
ласти...
![Page 26: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/26.jpg)
[ Внутренний DSL ]
computer() .processor() .cores(2) .x64() .disk() .size(150) .speed(7200) .disk() .size(70) .speed(7200)
Связывание методов:Связывание методов:
> Текучий интерфейс (fluent interface)
![Page 27: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/27.jpg)
[ Внутренний DSL ]
$("#menu") .fadeIn('fast') .addClass("active") .css('marginRight', '10px');
Связывание методов:Связывание методов:
> Текучий интерфейс (fluent interface)
![Page 28: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/28.jpg)
[ Внутренний DSL ]
$("#menu") .fadeIn('fast') .addClass("active") .css('marginRight', '10px');
Связывание методов:Связывание методов:
> Текучий интерфейс (fluent interface)
$("#thumbnails li").mouseenter(function(e){ $(this).find('img') .stop() .animate({opacity: 0.8}, 300) .end() .find('.viewcasestudy') .fadeIn('fast');}).fadeIn('fast');
![Page 29: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/29.jpg)
[ Внутренний DSL ]
computer()--processor()----cores(2)----x64()--disk()----size(150)----speed(7200)--disk()----size(70)----speed(7200)
Последовательность функций:Последовательность функций:Связывание методов
> Текучий интерфейс (fluent interface)
![Page 30: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/30.jpg)
[ Внутренний DSL ]
computer(--processor(----cores(2),----x64()––),--disk(----size(150),----speed(7200)––),--disk(----size(70),----speed(7200)--))
Вложенные функции:Вложенные функции:Связывание методовПоследовательность функций
> Текучий интерфейс (fluent interface)
![Page 31: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/31.jpg)
[ Внутренний DSL ]
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 endend
Замыкания:Замыкания:Последовательность функцийВложенные функции
Связывание методов> Текучий интерфейс (fluent interface)
![Page 32: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/32.jpg)
[ Внутренний DSL ]
> Текучий интерфейс (fluent interface)
> Работа с синтаксическим деревом
![Page 33: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/33.jpg)
[ Внутренний DSL ]
> Текучий интерфейс (fluent interface)
> Работа с синтаксическим деревом
> Аннотации
![Page 34: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/34.jpg)
[ Внутренний DSL ]
> Текучий интерфейс (fluent interface)
> Работа с синтаксическим деревом
> Аннотации
> Макросы
![Page 35: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/35.jpg)
[ Внутренний DSL ]
> Текучий интерфейс (fluent interface)
> Работа с синтаксическим деревом
> Аннотации
> Макросы
> Динамический отклик
def method_missing(m, *args, &block) puts "There's no method called #{m} here."end
![Page 36: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/36.jpg)
[ Внешний DSL ]
> Синтаксический анализ
![Page 37: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/37.jpg)
[ Внешний DSL ]
> Синтаксический анализ
Входной поток — это обычный текст (...обычно o_0)
![Page 38: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/38.jpg)
[ Внешний DSL ]
> Синтаксический анализ
event door_openedevent link_clickedevent window_closed
command play_musiccommand volume_up 10command send_message "Hello, world"
Управляемая разделителями трансляцияDelimiter-Directed Translation
![Page 39: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/39.jpg)
[ Внешний DSL ]
> Синтаксический анализ
event door_opened\nevent link_clickedevent window_closed
command play_musiccommand volume_up 10command send_message "Hello, world"
разделитель
инструкция
Управляемая разделителями трансляцияDelimiter-Directed Translation
![Page 40: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/40.jpg)
[ Внешний DSL ]
> Синтаксический анализ
event door_openedevent link_clickedevent window_closed
command play_musiccommand volume_up 10command send_message "Hello, world"
Управляемая разделителями трансляцияDelimiter-Directed Translation
Ограничение:
Нет способов обработкииерархического контекста
![Page 41: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/41.jpg)
[ Внешний DSL ]
> Синтаксический анализ
event door_opened link_clickedend
command play_music volume_up 10 send_message "Hello, world"end
Синтаксически управляемая трансляцияSyntax-Directed Translation
commandsblock
command endcommandDec commandDec
play_music volume_up 10
![Page 42: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/42.jpg)
[ Внешний DSL ]
> Синтаксический анализ
Грамматика входного языка.
list : eventList commandList ;eventList : 'events' eventDec* 'end';eventDec : identifier ;commandList : 'commands' commandDec* 'end';commandDec : identifier identifier? ;
![Page 43: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/43.jpg)
[ Внешний DSL ]
> Синтаксический анализ
Грамматика входного языка.
Форма Бэкуса-Наура
[E]BNFlist : eventList commandList ;eventList : 'events' eventDec* 'end';eventDec : identifier ;commandList : 'commands' commandDec* 'end';commandDec : identifier identifier? ;
![Page 44: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/44.jpg)
[ Внешний DSL ]
> Синтаксический анализ
Синтаксический анализатор на основерекурсивного спускаRecursive Descent Parser
![Page 45: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/45.jpg)
[ Внешний DSL ]
> Синтаксический анализ
Комбинатор синтаксических анализаторовParser Combinator
Комбинаторкоманд
Анализаторначала блока команд
Комбинаторсписка команд
Анализаторконца блока команд
Анализаторкоманды
Анализатораргумента команды
![Page 46: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/46.jpg)
[ Внешний DSL ]
> Синтаксический анализ
Генератор синтаксических анализаторовParser Generator
Грамматика
a : ID INT ;ID : 'a'..'z'+ ;INT : '0'..'9'+;
Синтаксическийанализатор
Генерация
![Page 47: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/47.jpg)
[ Для чего все это? ]
В результате мы должны иметьпостроенную семантическую модель
![Page 48: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/48.jpg)
[ Для чего все это? ]
В результате мы должны иметьпостроенную семантическую модель
> Для использования в программном продукте
![Page 49: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/49.jpg)
[ Для чего все это? ]
В результате мы должны иметьпостроенную семантическую модель
> Для использования в программном продукте
> Для генерации нового кода
![Page 50: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/50.jpg)
[ Генерация кода ]
> Генерация c помощью преобразователя Transformer Generation
![Page 51: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/51.jpg)
[ Генерация кода ]
> Генерация c помощью преобразователя Transformer Generation
> Шаблонная генерация Templated Generation
![Page 52: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/52.jpg)
[ Генерация кода ]
> Генерация c помощью преобразователя Transformer Generation
> Шаблонная генерация Templated Generation
> Встроенный помощник Embedment Helper
![Page 53: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/53.jpg)
[ Если Вы заинтересованы ]
http://martinfowler.com/dslCatalog/
![Page 54: Предметно-ориентированные языки программирования (DSL)](https://reader034.fdocuments.net/reader034/viewer/2022050804/548493305906b5886f8b4764/html5/thumbnails/54.jpg)
[ Спасибо за внимание! ]
Кириллов Александрhttp://twitter.com/saratovsource