Internet Info, s.r.o. Lupa Root Měšec Podnikatel DigiZone Slunečnice Vitalianew Bomba Navrcholu Weblogy Jagg Woko Dobrý web Computer.cz SK: MojeLinky

Hlavní navigace

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

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?

       

Jakub Šťastný

Jakub Šťastný

Jakub Šťastný byl v letech 2007 až 2008 redaktorem serveru Root.cz. Mezi jeho zájmy patří Linux, programování a typografický systém TeX.

Školení: Základy programovacího jazyka Java

Akademie Root
  • formát zápisu algoritmů zapsaných v programovacím jazyku Java
  • překlad a spuštění aplikací
  • základy objektově orientovaného programování
  • třídy a objekty v Javě

Detailní informace o kurzu...

Ohodnoťte jako ve škole:
Průměrná známka 3,41

Přehled názorů

No teda...
Michaelson 27. 11. 2007 05:22
└ 
1
pet 27. 11. 2007 08:37
 
├ 
Re: +1
anonymní uživatel 27. 11. 2007 09:23
 
├ 
Re: +1
pexxi 27. 11. 2007 09:27
 
└ 
Re: +1
Stanislav Brozek 27. 11. 2007 12:09
Uch, nejak jsem to nepobral
anonymní uživatel 27. 11. 2007 08:33
└ 
Re: Uch, nejak jsem to nepobral
Michaelson 27. 11. 2007 09:05
 
└ 
Re: Uch, nejak jsem to nepobral
anonymní uživatel 27. 11. 2007 09:57
 
 
├ 
Re: Uch, nejak jsem to nepobral
Michaelson 27. 11. 2007 10:21
 
 
│
└ 
Re: Uch, nejak jsem to nepobral
petr_p 27. 11. 2007 13:17
 
 
│
 
├ 
Re: Uch, nejak jsem to nepobral
Michaelson 27. 11. 2007 16:49
 
 
│
 
│
└ 
To je mi novinka...
hlavac 27. 11. 2007 18:35
 
 
│
 
└ 
Re: Uch, nejak jsem to nepobral
delphym 28. 11. 2007 11:58
 
 
│
 
 
└ 
Re: Uch, nejak jsem to nepobral
Peter Ambrož 4. 12. 2007 19:49
 
 
├ 
Re: Uch, nejak jsem to nepobral
BzmUZvXRCtpo 3. 7. 2009 02:34
 
 
├ 
Re: Uch, nejak jsem to nepobral
BzmUZvXRCtpo 3. 7. 2009 02:35
 
 
├ 
Re: Uch, nejak jsem to nepobral
BzmUZvXRCtpo 3. 7. 2009 02:35
 
 
└ 
Re: Uch, nejak jsem to nepobral
BzmUZvXRCtpo 3. 7. 2009 02:35
Husty
anonymní uživatel 27. 11. 2007 09:35
DSL a modelovani
sarimak 27. 11. 2007 09:36
├ 
tak todle sem nepobral
YF 27. 11. 2007 11:40
│
├ 
Re: tak todle sem nepobral
Stanislav Brozek 27. 11. 2007 12:14
│
└ 
Re: tak todle sem nepobral
sarimak 28. 11. 2007 15:08
└ 
Re: DSL a modelovani
Daniel Kvasnička ml. 27. 11. 2007 23:20
Autor nepřekvapil, zase reklama na Ruby
Tor 27. 11. 2007 09:49
└ 
Re: Autor nepřekvapil, zase reklama na Ruby
Michaelson 27. 11. 2007 16:54
 
└ 
Re: Autor nepřekvapil, zase reklama na Ruby
Tor 27. 11. 2007 23:45
Otazka par hodin?
Jan Vraný 27. 11. 2007 10:53
└ 
Re: Otazka par hodin?
Rejpal 27. 11. 2007 15:49
buzzword?
broukoid 27. 11. 2007 13:28
├ 
Re: buzzword?
Tor 27. 11. 2007 14:01
│
└ 
Re: buzzword?
Rejpal 27. 11. 2007 15:50
│
 
└ 
Re: buzzword?
Tor 27. 11. 2007 21:31
├ 
Re: buzzword?
Michaelson 27. 11. 2007 16:43
│
└ 
Re: buzzword?
Kvakor 27. 11. 2007 19:36
└ 
Re: buzzword?
ufak 30. 11. 2007 10:50
Co takovy JSON
Pavel Tisnovsky 27. 11. 2007 16:33
Parchanti rozmlsaný!
kretén 27. 11. 2007 22:39
└ 
Re: Parchanti rozmlsaný!
anonymní uživatel 28. 11. 2007 13:46
Chromatic a DSL
anonymní uživatel 27. 11. 2007 23:19
Parrot VM a DSL
anonymní uživatel 27. 11. 2007 23:27
       
Zasílat nově přidané příspěvky e-mailem

Zasílání upozornění na nové příspěvky je dostupné jen registrovaným uživatelům. Proto budete před aktivací zasílání názorů přesměrováni na přihlašovací stránku, ze které se můžete případně také zaregistrovat.