ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
Intern? dom¨¦novo-?pecick? jazyk
Intern? dom¨¦novo-?pecick? jazyk (DSL) je z¨¢visl? od zvolen¨¦ho hostite?-
sk¨¦ho programovacieho jazyka vyu?¨ªvaj¨²c jeho syntax. Tvorba intern¨¦ho DSL
je jednoduch?ia oproti extern¨¦mu DSL, preto?e sa vyu?¨ªva funkcionalita a
syntax hostite?sk¨¦ho programovacieho jazyka (zvy?ajne GPL). Autor inter-
n¨¦ho DSL nepotrebuje ma? znalosti o bezkontextov?ch gramatik¨¢ch, spra-
covan¨ª jazyka a ani nemus¨ª ma? ?peci¨¢lne n¨¢stroje ako v pr¨ªpade jazyko-
v?ch prostred¨ª. V¡èaka vyu?itiu hostite?sk¨¦ho jazyka, pri pr¨¢ci s vytvoren?m
DSL m??eme pou?¨ªva? v?etky n¨¢stroje IDE ur?en¨¦ho pre zvolen? hostite?sk?
jazyk. T?m sa zna?ne zjednodu?uje pr¨¢ca s DSL pomocou u? existuj¨²cich
n¨¢strojov, ktor¨¦ s¨² program¨¢torovi dobre zn¨¢me, a t?m sa zni?uj¨² n¨¢klady
potrebn¨¦ k vytvoreniu nov¨¦ho DSL.
Naviazanos? na hostite?sk? jazyk m¨¢ aj svoje nev?hody. Ve?kou nev?-
hodou je, ?e vytvoren? intern? DSL je obmedzen? syntaxou hostite?sk¨¦ho
jazyka. Program v DSL mus¨ª zodpoveda? ur?enej ?trukt¨²re programu, pra-
vidl¨¢m a obmedzeniam. T?m kles¨¢ exibilita intern¨¦ho DSL a redukuj¨² sa
v?hody pou?itia DSL.
Na intern? DSL m??eme pozera? ako na ak¨²si nadstavbu nad hostite?-
sk?m jazykom (Obr. 1). Ke¡è?e hranica medzi intern?m DSL a ?tandardn?m
API kni?nice, ?i programov?m r¨¢mcom je tenk¨¢, pri n¨¢vrhu a implement¨¢cii
intern¨¦ho DSL jazyka je mo?n¨¦ vyu?i? viacero vzorov. Pomocou t?chto vzorov
je mo?n¨¦ dosiahnu?, aby sp?sob tvorby a z¨¢pisu programu viac pripom¨ªnal
prirodzen? jazyk odstr¨¢nen¨ªm nadbyto?nej syntaxe nes¨²visiacej s dom¨¦nou
a tak zlep?oval celkov¨² ?itate?nos? zdrojov¨¦ho textu.
hostite?sk? jazyk
API
DSL
Obr. 1: Architekt¨²ra intern¨¦ho DSL
Expression Builder
Spom¨ªnan¨¦ vzory ovplyv?uj¨² rozhranie intern¨¦ho DSL, pomocou ktor¨¦ho je
mo?n¨¦ tvori? program (vety) v tomto jazyku. Toto rozhranie sa naz?va kon-
?truktor v?razov (angl. Expression Builder). Ke¡è?e ka?d? vzor m¨¢ svoje
1
?pecik¨¢, na z¨¢klade zvolen¨¦ho vzoru sa l¨ª?i aj rozhranie kon?truktora v?ra-
zov. Rozdiel medzi jednotliv?mi vzormi je uk¨¢zan? na pr¨ªkladoch, kde ako
jazyk v?eobecn¨¦ho pou?itia bola pou?it¨¢ Java.
Pre porovnanie je najprv uveden? pr¨ªklad, na ktorom je ilustrovan? z¨¢pis
pou?it¨ªm norm¨¢lneho API (Zdroj. text 1). Pr¨ªklad predstavuje intern? DSL
pre den¨ªciu ?tudenta a jeho vlastnosti.
Address a = new Address ( Letn¨¢ 9 ,  Ko?ice  ) ;
Subject s1 = new Subject ( Language?oriented programming , 2 , 6 ) ;
Subject s2 = new Subject ( Domain?s p e c i f i c languages  , 3 , 0 ) ;
return new Student ( J¨¢n ,  Zelen?  , a , s1 ) ;
Listing 1: Pou?itie norm¨¢lneho API
Method Chaining
V pr¨ªpade pou?itia vzoru zre?azenia met¨®d (angl. Method Chaining) je sp?-
sob z¨¢pisu odli?n? (Zdroj. text 2). Met¨®dy rozhrania intern¨¦ho DSL, ktor?ch
funkciou je nastavova? jednotliv¨¦ vlastnosti tried, pou?¨ªvaj¨² ako n¨¢vratov¨²
hodnotu samotn? objekt. To umo??uje nastavi? viacero vlastnost¨ª pou?it¨ªm
met¨®d rozhrania v r¨¢mci jedn¨¦ho v?razu. Probl¨¦m pri pou?it¨ª zre?azenia me-
t¨®d je ch?baj¨²ca inform¨¢cia, kedy sa m¨¢ vytv¨¢ran? objekt Subject prirada?
objektu Student. Mo?n?m rie?en¨ªm je pridanie met¨®dy save() do rozhrania
kon?truktora v?razov, ktorej ¨²lohou bude realizova? toto priradenie. Av?ak
pridan¨ªm tejto met¨®dy sa naru?¨ª n¨¢vrh rozhrania nadbyto?nou syntaxou,
ktor¨¢ nes¨²vis¨ª s dom¨¦nou.
student ()
. firstname ( J¨¢n )
. surname (  Zelen?  )
. address ()
. s t r e e t ( Letn¨¢ 9 )
. c i t y (  Ko?ice  )
. subject ()
. name( Language?oriented programming )
. grade (2)
. subject ()
. name( Domain?s p e c i f i c languages  )
. grade (3)
. end ( ) ;
Listing 2: Pou?itie vzoru zre?azenia met¨®d
2
Function Sequence
?al?¨ªm vzorom je postupnos? funkci¨ª (angl. Function Sequence). Na rozdiel
od zre?azenia met¨®d, kde s¨² met¨®dy navrhnut¨¦ tak, aby bolo mo?n¨¦ pou?i?
?pecick? z¨¢pis programu, je postupnos? funkci¨ª tradi?n?m volan¨ªm jednot-
liv?ch met¨®d zaradom nez¨¢visle na sebe (Zdroj. text 3). Ako je vidno na
pr¨ªklade, pomocou odsadenia textu je mo?n¨¦ dosiahnu? podobn¨² ?itate?nos?
ako pri zre?azen¨ª met¨®d. Hlavnou nev?hodou tohto vzoru je, ?e pri vola-
niach met¨®d nie je jasn? kontext volania. V pr¨ªpade volania met¨®dy grade()
nie je implicitne jasn¨¦, vlastnos? ktor¨¦ho objektu Subject sa m¨¢ nastavi?.
Kontext m??e by? vyjadren? pou?it¨ªm ?lenskej premennej currentSubject.
Kv?li nutnosti pou?itia kontextov?ch premenn?ch je pou?it¨ªm tohto vzoru
zdrojov? text menej preh?adn?.
student ( ) ;
firstname ( J¨¢n ) ;
surname (  Zelen?  ) ;
address ( ) ;
s t r e e t ( Letn¨¢ 9 ) ;
c i t y (  Ko?ice  ) ;
subject ( ) ;
name( Language?oriented programming ) ;
grade ( 2 ) ;
c r e d i t s ( 6 ) ;
subject ( ) ;
name( Domain?s p e c i f i c languages  ) ;
grade ( 3 ) ;
Listing 3: Pou?itie vzoru postupnos? funkci¨ª
Nested Function
?al?¨ªm vzorom je vnorenie funkci¨ª (angl. Nested Function), pri ktorom s¨²
volania met¨®d vnoren¨¦ ako parametre volania ¡èal?ej met¨®dy (Zdroj. text
4). Z¨¢sadn?m rozdielom oproti predch¨¢dzaj¨²cim vzorom je poradie vyhod-
nocovania jednotliv?ch met¨®d. Pri zre?azen¨ª met¨®d a postupnosti funkci¨ª sa
met¨®dy vyhodnocuj¨² z?ava doprava , zatia??o pri vnoren?ch volaniach fun-
kci¨ª sa najprv vyhodnotia parametre a a? n¨¢sledne samotn¨¢ volan¨¢ met¨®da.
D?sledkom poradia vyhodnocovania jednotliv?ch met¨®d je to, ?e s¨² pr¨ªstupn¨¦
v?etky hodnoty pri vyhodnocovan¨ª poslednej met¨®dy. T?m je vyrie?en? prob-
l¨¦m zre?azenia met¨®d a ch?baj¨²cej inform¨¢cie o ukon?en¨ª vytv¨¢rania objektu.
Vnorenie funkci¨ª z¨¢rove? zabezpe?uje aj kontext volania met¨®d.
3
Uveden¨¦ vzory maj¨² jeden spolo?n? nedostatok. Aby bolo mo?n¨¦ pri p¨ª-
san¨ª programu v internom DSL pou?i? z¨¢pis uveden? v 2,3,4, je potrebn¨¦ aby
met¨®dy rozhrania kon?truktora v?razov boli glob¨¢lne (resp. statick¨¦). Z h?a-
diska n¨¢vrhu softv¨¦rov?ch syst¨¦mov je pou?itie glob¨¢lnych funkci¨ª ?astokr¨¢t
ne?iad¨²ce. Rie?en¨ªm je pou?itie obmedzenia vidite?nosti objektu (angl. Object
Scoping) v kombin¨¢cii s in?m vzorom. Rie?enie spo?¨ªva vo vlo?en¨ª DSL prog-
ramu do podtriedy, ktor¨¢ ded¨ª od triedy predstavuj¨²cej kon?truktor v?razov.
Ke¡è?e kon?truktor v?razov obsahuje met¨®dy pou?¨ªvan¨¦ pri tvorbe DSL prog-
ramu, pri p¨ªsan¨ª DSL programu v podtriede bude mo?n¨¦ pou?i? uveden? z¨¢pis
programu. Navy?e v pr¨ªpade potreby je mo?n¨¦ prida? ¡èal?ie met¨®dy, pr¨ªpadne
prekry? existuj¨²ce met¨®dy. Nev?hodou je, ?e tak¨¦to rie?enie vy?aduje princ¨ªp
dedenia vo zvolenom hostite?skom GPL. Pr¨ªklad pou?itia je uveden? spolu
so vzorom vnorenia funkci¨ª (Zdroj. text 5).
student (
firstname ( J¨¢n ) ,
surname (  Zelen?  ) ,
address (
s t r e e t ( Letn¨¢ 9 ) ,
c i t y (  Ko?ice  )
) ,
subject (
name( Language?oriented programming ) ,
grade (2) ,
c r e d i t s (6)
) ,
subject (
name( Domain?s p e c i f i c languages  ) ,
grade (3)
)
) ;
Listing 4: Pou?itie vzoru vnorenia funkci¨ª
4
class MyStudent : StudentBuilder {
protected override void build () {
student (
firstname ( J¨¢n ) ,
surname (  Zelen?  ) ,
address (
s t r e e t ( Letn¨¢ 9 ) ,
c i t y (  Ko?ice  )
) ,
subject (
name( Language?oriented programming ) ,
grade (2) ,
c r e d i t s (6)
) ,
subject (
name( Domain?s p e c i f i c languages  ) ,
grade (3)
)
) ;
};
}
Listing 5: Pou?itie vzoru vnorenia funkci¨ª s obmedzen¨ªm vidite?nosti
5

More Related Content

Interne dsl

  • 1. Intern? dom¨¦novo-?pecick? jazyk Intern? dom¨¦novo-?pecick? jazyk (DSL) je z¨¢visl? od zvolen¨¦ho hostite?- sk¨¦ho programovacieho jazyka vyu?¨ªvaj¨²c jeho syntax. Tvorba intern¨¦ho DSL je jednoduch?ia oproti extern¨¦mu DSL, preto?e sa vyu?¨ªva funkcionalita a syntax hostite?sk¨¦ho programovacieho jazyka (zvy?ajne GPL). Autor inter- n¨¦ho DSL nepotrebuje ma? znalosti o bezkontextov?ch gramatik¨¢ch, spra- covan¨ª jazyka a ani nemus¨ª ma? ?peci¨¢lne n¨¢stroje ako v pr¨ªpade jazyko- v?ch prostred¨ª. V¡èaka vyu?itiu hostite?sk¨¦ho jazyka, pri pr¨¢ci s vytvoren?m DSL m??eme pou?¨ªva? v?etky n¨¢stroje IDE ur?en¨¦ho pre zvolen? hostite?sk? jazyk. T?m sa zna?ne zjednodu?uje pr¨¢ca s DSL pomocou u? existuj¨²cich n¨¢strojov, ktor¨¦ s¨² program¨¢torovi dobre zn¨¢me, a t?m sa zni?uj¨² n¨¢klady potrebn¨¦ k vytvoreniu nov¨¦ho DSL. Naviazanos? na hostite?sk? jazyk m¨¢ aj svoje nev?hody. Ve?kou nev?- hodou je, ?e vytvoren? intern? DSL je obmedzen? syntaxou hostite?sk¨¦ho jazyka. Program v DSL mus¨ª zodpoveda? ur?enej ?trukt¨²re programu, pra- vidl¨¢m a obmedzeniam. T?m kles¨¢ exibilita intern¨¦ho DSL a redukuj¨² sa v?hody pou?itia DSL. Na intern? DSL m??eme pozera? ako na ak¨²si nadstavbu nad hostite?- sk?m jazykom (Obr. 1). Ke¡è?e hranica medzi intern?m DSL a ?tandardn?m API kni?nice, ?i programov?m r¨¢mcom je tenk¨¢, pri n¨¢vrhu a implement¨¢cii intern¨¦ho DSL jazyka je mo?n¨¦ vyu?i? viacero vzorov. Pomocou t?chto vzorov je mo?n¨¦ dosiahnu?, aby sp?sob tvorby a z¨¢pisu programu viac pripom¨ªnal prirodzen? jazyk odstr¨¢nen¨ªm nadbyto?nej syntaxe nes¨²visiacej s dom¨¦nou a tak zlep?oval celkov¨² ?itate?nos? zdrojov¨¦ho textu. hostite?sk? jazyk API DSL Obr. 1: Architekt¨²ra intern¨¦ho DSL Expression Builder Spom¨ªnan¨¦ vzory ovplyv?uj¨² rozhranie intern¨¦ho DSL, pomocou ktor¨¦ho je mo?n¨¦ tvori? program (vety) v tomto jazyku. Toto rozhranie sa naz?va kon- ?truktor v?razov (angl. Expression Builder). Ke¡è?e ka?d? vzor m¨¢ svoje 1
  • 2. ?pecik¨¢, na z¨¢klade zvolen¨¦ho vzoru sa l¨ª?i aj rozhranie kon?truktora v?ra- zov. Rozdiel medzi jednotliv?mi vzormi je uk¨¢zan? na pr¨ªkladoch, kde ako jazyk v?eobecn¨¦ho pou?itia bola pou?it¨¢ Java. Pre porovnanie je najprv uveden? pr¨ªklad, na ktorom je ilustrovan? z¨¢pis pou?it¨ªm norm¨¢lneho API (Zdroj. text 1). Pr¨ªklad predstavuje intern? DSL pre den¨ªciu ?tudenta a jeho vlastnosti. Address a = new Address ( Letn¨¢ 9 , Ko?ice ) ; Subject s1 = new Subject ( Language?oriented programming , 2 , 6 ) ; Subject s2 = new Subject ( Domain?s p e c i f i c languages , 3 , 0 ) ; return new Student ( J¨¢n , Zelen? , a , s1 ) ; Listing 1: Pou?itie norm¨¢lneho API Method Chaining V pr¨ªpade pou?itia vzoru zre?azenia met¨®d (angl. Method Chaining) je sp?- sob z¨¢pisu odli?n? (Zdroj. text 2). Met¨®dy rozhrania intern¨¦ho DSL, ktor?ch funkciou je nastavova? jednotliv¨¦ vlastnosti tried, pou?¨ªvaj¨² ako n¨¢vratov¨² hodnotu samotn? objekt. To umo??uje nastavi? viacero vlastnost¨ª pou?it¨ªm met¨®d rozhrania v r¨¢mci jedn¨¦ho v?razu. Probl¨¦m pri pou?it¨ª zre?azenia me- t¨®d je ch?baj¨²ca inform¨¢cia, kedy sa m¨¢ vytv¨¢ran? objekt Subject prirada? objektu Student. Mo?n?m rie?en¨ªm je pridanie met¨®dy save() do rozhrania kon?truktora v?razov, ktorej ¨²lohou bude realizova? toto priradenie. Av?ak pridan¨ªm tejto met¨®dy sa naru?¨ª n¨¢vrh rozhrania nadbyto?nou syntaxou, ktor¨¢ nes¨²vis¨ª s dom¨¦nou. student () . firstname ( J¨¢n ) . surname ( Zelen? ) . address () . s t r e e t ( Letn¨¢ 9 ) . c i t y ( Ko?ice ) . subject () . name( Language?oriented programming ) . grade (2) . subject () . name( Domain?s p e c i f i c languages ) . grade (3) . end ( ) ; Listing 2: Pou?itie vzoru zre?azenia met¨®d 2
  • 3. Function Sequence ?al?¨ªm vzorom je postupnos? funkci¨ª (angl. Function Sequence). Na rozdiel od zre?azenia met¨®d, kde s¨² met¨®dy navrhnut¨¦ tak, aby bolo mo?n¨¦ pou?i? ?pecick? z¨¢pis programu, je postupnos? funkci¨ª tradi?n?m volan¨ªm jednot- liv?ch met¨®d zaradom nez¨¢visle na sebe (Zdroj. text 3). Ako je vidno na pr¨ªklade, pomocou odsadenia textu je mo?n¨¦ dosiahnu? podobn¨² ?itate?nos? ako pri zre?azen¨ª met¨®d. Hlavnou nev?hodou tohto vzoru je, ?e pri vola- niach met¨®d nie je jasn? kontext volania. V pr¨ªpade volania met¨®dy grade() nie je implicitne jasn¨¦, vlastnos? ktor¨¦ho objektu Subject sa m¨¢ nastavi?. Kontext m??e by? vyjadren? pou?it¨ªm ?lenskej premennej currentSubject. Kv?li nutnosti pou?itia kontextov?ch premenn?ch je pou?it¨ªm tohto vzoru zdrojov? text menej preh?adn?. student ( ) ; firstname ( J¨¢n ) ; surname ( Zelen? ) ; address ( ) ; s t r e e t ( Letn¨¢ 9 ) ; c i t y ( Ko?ice ) ; subject ( ) ; name( Language?oriented programming ) ; grade ( 2 ) ; c r e d i t s ( 6 ) ; subject ( ) ; name( Domain?s p e c i f i c languages ) ; grade ( 3 ) ; Listing 3: Pou?itie vzoru postupnos? funkci¨ª Nested Function ?al?¨ªm vzorom je vnorenie funkci¨ª (angl. Nested Function), pri ktorom s¨² volania met¨®d vnoren¨¦ ako parametre volania ¡èal?ej met¨®dy (Zdroj. text 4). Z¨¢sadn?m rozdielom oproti predch¨¢dzaj¨²cim vzorom je poradie vyhod- nocovania jednotliv?ch met¨®d. Pri zre?azen¨ª met¨®d a postupnosti funkci¨ª sa met¨®dy vyhodnocuj¨² z?ava doprava , zatia??o pri vnoren?ch volaniach fun- kci¨ª sa najprv vyhodnotia parametre a a? n¨¢sledne samotn¨¢ volan¨¢ met¨®da. D?sledkom poradia vyhodnocovania jednotliv?ch met¨®d je to, ?e s¨² pr¨ªstupn¨¦ v?etky hodnoty pri vyhodnocovan¨ª poslednej met¨®dy. T?m je vyrie?en? prob- l¨¦m zre?azenia met¨®d a ch?baj¨²cej inform¨¢cie o ukon?en¨ª vytv¨¢rania objektu. Vnorenie funkci¨ª z¨¢rove? zabezpe?uje aj kontext volania met¨®d. 3
  • 4. Uveden¨¦ vzory maj¨² jeden spolo?n? nedostatok. Aby bolo mo?n¨¦ pri p¨ª- san¨ª programu v internom DSL pou?i? z¨¢pis uveden? v 2,3,4, je potrebn¨¦ aby met¨®dy rozhrania kon?truktora v?razov boli glob¨¢lne (resp. statick¨¦). Z h?a- diska n¨¢vrhu softv¨¦rov?ch syst¨¦mov je pou?itie glob¨¢lnych funkci¨ª ?astokr¨¢t ne?iad¨²ce. Rie?en¨ªm je pou?itie obmedzenia vidite?nosti objektu (angl. Object Scoping) v kombin¨¢cii s in?m vzorom. Rie?enie spo?¨ªva vo vlo?en¨ª DSL prog- ramu do podtriedy, ktor¨¢ ded¨ª od triedy predstavuj¨²cej kon?truktor v?razov. Ke¡è?e kon?truktor v?razov obsahuje met¨®dy pou?¨ªvan¨¦ pri tvorbe DSL prog- ramu, pri p¨ªsan¨ª DSL programu v podtriede bude mo?n¨¦ pou?i? uveden? z¨¢pis programu. Navy?e v pr¨ªpade potreby je mo?n¨¦ prida? ¡èal?ie met¨®dy, pr¨ªpadne prekry? existuj¨²ce met¨®dy. Nev?hodou je, ?e tak¨¦to rie?enie vy?aduje princ¨ªp dedenia vo zvolenom hostite?skom GPL. Pr¨ªklad pou?itia je uveden? spolu so vzorom vnorenia funkci¨ª (Zdroj. text 5). student ( firstname ( J¨¢n ) , surname ( Zelen? ) , address ( s t r e e t ( Letn¨¢ 9 ) , c i t y ( Ko?ice ) ) , subject ( name( Language?oriented programming ) , grade (2) , c r e d i t s (6) ) , subject ( name( Domain?s p e c i f i c languages ) , grade (3) ) ) ; Listing 4: Pou?itie vzoru vnorenia funkci¨ª 4
  • 5. class MyStudent : StudentBuilder { protected override void build () { student ( firstname ( J¨¢n ) , surname ( Zelen? ) , address ( s t r e e t ( Letn¨¢ 9 ) , c i t y ( Ko?ice ) ) , subject ( name( Language?oriented programming ) , grade (2) , c r e d i t s (6) ) , subject ( name( Domain?s p e c i f i c languages ) , grade (3) ) ) ; }; } Listing 5: Pou?itie vzoru vnorenia funkci¨ª s obmedzen¨ªm vidite?nosti 5