Hlavní navigace

Domain-Specific Language: programování pro každého

Jakub Šťastný

Jste už unaveni XML na stojedna způsobů? Nudí vás jeho fádní syntaxe? Irituje vás jeho ukecanost? Omezují vás jeho možnosti? Štve vás neustálé eskapování entit? Nemají jej rádi vaši uživatelé? Co takhle seznámit se s Domain-Specific language?

Já jsem DSL, těší mne

Ne, nebude řeč o internetové konektivitě ani o Damn Small Linuxu, nýbrž o tzv. Domain-Specific Language. Domain-Specific Language, který je často zkracován na DSL, se spolu s webem 2.0 a AJAXem řadí mezi letošní hitovky, takže je dosti možné, že jste o něm již slyšeli.

Co přesně je Domain Specific Language? Wikipedie praví, že se jedná o jazyk navržený a určený k plnění určitého specifického úkolu. V praxi se může jednat například o jakýkoliv framework či sestavovací systém. V DSL lze také velmi dobře psát konfigurační soubory.

Článek je silně inspirovaný prezentací Martina Fowlera a Neala Forda o jazykově orientovaném programování. Veškeré ukázky v článku jsou z této prezentace přejaty.

Proč používat DSL?

  • Čitelnější pro člověka
  • Umožňuje použít konstrukce programovacího jazyka
  • Rychlejší parsování (minimálně v případě interního DSL)
  • Je in ;)

Jazykově orientované programování: stromečky vs. jazykový popis

Posledních několik desetiletí v programování je ve znamení stromového popisu – třeba takové XML je toho živým dokladem. Lidský mozek však uvažuje jiným způsobem, nikoliv stromečky, ale jazykem. Jak mluvíme, tak také myslíme, proto aby pro nás byl programovací jazyk co nejpochopitelnější, měl by být co nejpodobnější lidské řeči.

Klíčkovým faktorem pro jazykový popis je kontext, který je u DSL narozdíl od API implicitní.

Popis v API:

Coffee latte = new Coffee(Size.VENTI);
latte.setFatContent(FatContent.NON_FAT);
latte.setWhip(Whip.NONE);
latte.setFoam(Foam.NONE);
latte.setTemperature(Temp.EXTRA_HOT);
latte.setStrength(5);

Totéž vyjádřeno v DSL:

Venti half-caf, non-fat, extra hot, no foam, no whip latte

Typy DSL

Existují dva základní typy DSL – interní a externí. Interní DSL je nadstavba nad určitým jazykem, je jím vyhodnocována, není tedy třeba psát žádný parser. Velkou výhodou je, že jsou k dispozici veškeré možnosti, které má k dispozici „mateřský“ jazyk.

Externím DSL naproti tomu musíme parser napsat my. To je jistě mnohem náročnější, nemůžeme také použít možností žádného jiného jazyka, ledaže bychom je tam sami doprogramovali, ale o tom DSL není. Na druhou stranu výhoda je v tom, že není třeba uživatele otravovat se závorkami a uvozovkami.

Kde se DSL používá?

DSL není pouze teze hozená od akademického stolu, již dnes se s ním velmi často setkáváme. Mezi jeho nejpopulárnější příklady lze zařadit webový framework Ruby on Rails a sestavovací systém RakeRuby, jejich ekvivalenty Grails a Gant v Groovy, utilitku Capistrano pro deploying railsových aplikací a mnohé další.

DSL v praxi

Ideálními jazyky pro psaní DSL jsou jazyky, které si příliš nepotrpí na různé závorky, středníky, které umožňují více možností zápisu a vůbec jsou syntakticky volnější. Podpora closures je další velkou výhodou. Mezi takovéto jazyky podle Martina Fowlera patří především Ruby a Groovy.

class IpBlock < ActiveRecord::Base
    validates_presence_of :cidr, :address, :prefix_length
    validates_numericality_of :prefix_length, :only_integer => true
    belongs_to  :function
    belongs_to  :supernet, :class_name => 'IpBlock', :foreign_key => 'supernet_id'
    belongs_to  :anycast_parent, :class_name => 'IpBlock', :foreign_key => 'parent_id'
    has_many    :anycast_children, :class_name => 'IpBlock', :foreign_key => 'parent_id'
    before_destroy { |ip_block| IpBlock.destroy_all "nat_id = #{ip_block.id}" }
    before_destroy do |ip_block|
      IpBlock.destroy_all "anycast_parent_id = #{ip_block.id}"
    end
...
end

Závěr, aneb ovlivní DSL budoucnost programování?

Vzhledem k tomu, že sám nejen používám, ale také jsem vytvořil několik doménově specifických jazyků pro různé účely, myslím si, že DSL určitě význam mají – jak z hlediska syntaxe, která je jednoduchá tak, že jej může mnohdy může pochopit i laik, tak z hlediska úspory času, která může být opravdu enormní. Napsání skromnějšího interního DSL přitom je práce na několik málo hodin. A co vy, zkoušeli jste si již také nějaký DSL napsat?

Odkazy

Anketa

Znali jste DSL?

Našli jste v článku chybu?

4. 12. 2007 19:49

Hm, budu vsetci okolo toho DSL tancovat, aky je uzasny, resp, aky je naprd? Alebo uz niekto KONECNE povie aku to ma syntax, kde zozeniem prekladac, ako nakodim Hello world?? Je to vobec pre programatorov, alebo sa o tom len tak rozprava? Fakt nemam najmensiu sajnu z tohto clanku ani z prispevkov :-(

30. 11. 2007 10:50

ufak (neregistrovaný)
ano, jedna se o pojmenovani stare veci, aby se to mohlo psat do marketingovych kecu: "nase firma / produkt podporuje / vuziva nejnovejsi technologie jako BFLM , PSVZ, "
Lupa.cz: Levný tarif pro Brno nebude, je to kartel

Levný tarif pro Brno nebude, je to kartel

Root.cz: Nová třída SD karet A1 s vysokým výkonem

Nová třída SD karet A1 s vysokým výkonem

Měšec.cz: Exekuční poradna: ptejte se online

Exekuční poradna: ptejte se online

DigiZone.cz: SES zajistí HD pro M7 Group

SES zajistí HD pro M7 Group

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

DigiZone.cz: Sat novinky: slovenská TV8 HD i ruský NTV Mir

Sat novinky: slovenská TV8 HD i ruský NTV Mir

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

DigiZone.cz: Ohrozí Freedom TV přechodové sítě?

Ohrozí Freedom TV přechodové sítě?

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Vitalia.cz: Test na HIV je zdarma i za pět set

Test na HIV je zdarma i za pět set

Vitalia.cz: Jak vybrat ořechy do cukroví a kde mají levné

Jak vybrat ořechy do cukroví a kde mají levné

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

DigiZone.cz: V Plzni odstartovalo Radio 1

V Plzni odstartovalo Radio 1