DSL, hudba budoucnosti?

Musím se přiznat, že nejsem moc velký fanda všelijakých těch skriptovacích a jiných podivných jazyků. Nicméně, před časem jsem viděl prezentaci pánů Martina Fowlera a Neala Forda s titulem “Language Oriented programming” (video, prezentace). Tato přednáška můj odpor poněkud nahlodala. Pokud nechápete co všichni mají na Ruby, Groovy a spol, tak si ji určitě pusťte. Pokud nemáte čas na její shlédnutí, prolétněte si alespoň PDF s prezentací. Já se pokusím napsat co jsem si z ní odnesl (a zapamatoval) já.

Prezentace začíná tím, že dnes při programování popisujeme svět pomocí stromových hierarchií. Zatímco na některé problémy je tento popis jak dělaný, na jiné problém už tak vhodný není. Prezentátoři proto navrhují pokusit se použít na některé problémy jazyk místo stromového popisu. Od toho se také odvíjí pojmenování DSL – Domain Specific Language (oborově specifický jazyk). Jaké to má výhody? Za prvé, lidský mozek je zvyklý pracovat s jazykem. Ba co víc, každý obor lidské působnosti má svůj specifický jazyk. Proč ho tedy nepoužít pro popis programu, který se v tomto oboru pohybuje?

Dnes pro řešení specifických problémů využíváme specifická API jako například toto:

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);

Kdybychom používali DSL, mohl vypadal by kód vypadat takto:

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

Co API v našem případě chybí, je znalost kontextu. Protože API používáme v obecném, univerzálním jazyce, musíme stále dokola opakovat že řešíme to naše kafe a ne třeba lokomotivy. Kdežto v DSL je tato informace součástí kontextu, proto vypadá přehledněji.

Interní DSL

Pod pojmem interní DSL se myslí jazyk, který používá syntaxi základního jazyka (v našem případě Javy). Pěkný příklad je tento z jMocku:


warehouseMock.expects(once())
.method("hasInventory")
.with(eq(TALISKER),eq(50))
.will(returnValue(true));

Ano, je to čistá Java, ale dá se číst jako anglická věta.

Výhodou skriptovacích jazyků je to, že jsou méně striktní. Tím je v nich lépe umožněna tvorba interního DSL. Podíváme-li se na věc v perspektivě DSL, tak jsou Rails jenom interní DSL, který má jako základní jazyk Ruby a jeho oborem jsou webové aplikace.

Externí DSL

Externí DSL jsou jazyky, které používají syntaxi rozdílnou od základního jazyka. Klasickým denně používaným externím DSL je XML. Na externí DSL už potřebujete vlastní parser, interpreter a kdoví co ještě. Takže jsou obtížněji vytvořitelné, na druhou stranu nám ale poskytují více volnosti.

A tím se dostáváme k otázkám které asi napadnou každého:

Nepovede to ke kakofonii jazyků? Kdo se bude sakra pořád učit nové jazyky? Odpovědí je, že my už to přeci dávno děláme. Každá knihovna má svoje API, které se musíme neučit, denně používáme různé typy XML, které mají každé jinou gramatiku. U DSL jenom nikdo nezastírá, že jde o nový jazyk.

Co nám DSL mají přinést?

  • Kód, který dokáže přečíst (ne napsat) i analytik. To může být skvělý nastroj pro ověření, jestli jsme zadání pochopili správně.
  • Programátoři se naučí mluvit podobným jazykem jako uživatelé.
  • Kód je abstrahován až na úroveň business problému.

Tak nevím, skoro mě zviklali, co si o tom myslíte vy?

12 thoughts on “DSL, hudba budoucnosti?

  1. Vasek

    Pěkně shrnuto, díky.
    Mě také zmiňovaná přednáška přiměla přemýšlet více o konceptech okolo DSL.
    Např. v Grails se mi docela zamlouvá možnost psát Hibernate dotazy stylem
    findByNameNotEqualAndAgeGreaterThan(‘Vasek’, 20) nebo
    findByDateCreatedBetween(today-10, today)
    aniž byste museli tyto metody definovat.
    Nevím, jestli je to vhodný příklad interního DSL, ale fascinuje mě ta jednoduchost, jak byl jazyk Groovy obohacen o práci s persistentními objekty.

  2. Lukáš Křečan Post author

    To Honza: Přiznávám se bez muční, lenost je ten největší důvod. Další důvod je ten, že se mi nedaří vymyslet, jak to v praxi použít. Chyba je asi v tom, že už mám Javu tak zadrátovanou v hlavě, že už asi neumím myslet jinak. Vidím-li problém, napadne mě jak ho řešit v Javě a ne jakým jazykem by šel krásně popsat.

  3. Honza

    Lukas: On ten prechod neni zas az tak slozity. Staci obratit postup API -> Aplikace -> Testy naopak. Napsat testy “prirozenym jazykem” aneb DSL. Tzn. popsat jak se aplikace bude chovat a co se bude ocekavat. Tim se v podstate definuje i API a pak doplnit implementaci. V dynamickem jazyce to jde fakt jednoduse.

  4. Ladislav Thon

    > Musím se přiznat, že nejsem moc velký fanda všelijakých těch skriptovacích a jiných podivných jazyků.

    Přijde mi trochu (trochu dost) nefér srovnávat Ruby, Groovy a spol. s jazyky typu Brainfuck. Nebo přinejmenším jako tohle srovnání mi ta věta vyznívá. Skriptovací jazyky jsou extrémně užitečné — tak nějak z definice — minimálně pro psaní jednoúčelových skriptů.

    A že spousta jazyků označovaných za skriptovací má mnohem širší pole působnosti, to je holt věc, na kterou si “skalní” budou muset zvyknout 🙂

  5. Lukáš Křečan Post author

    TO Ladislav Thon: Omlouvám se za nepřesné vyjádření. Rozhodně jsem nechtěl Groovy přirovnávat k Brainfucku. Tím podivné jsem měl spíš na mysli něco ve smyslu externích DSL, tzn. jazyk používaný jedině a pouze pro jeden specifický účel.

  6. Bot

    No nevim jak vam, ale mne to silne pripomina SmallTalk a jeho syntaxi a zpusob uvazovani. Tedy bych v tom rozhodne nehledal neco noveho. Tohle uz tu bylo a je hodne dlouho (od 80tych let).

Comments are closed.