Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg 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?

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

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í: IP v 6 na Linuxu

Tento krátký kurz je určený speciálně pro zkušené správce sítí IPv4, kteří se chtějí seznámit s nastupujícím internetovým protokolem IPv6.

Platforma: Linux

  • Adresace
  • Link-local adresy
  • Dynamické přidělování adres
  • a další

Podrobnější informace a přihláška

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

Přehled názorů

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

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem