ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
1
S¨¦mantick? model
Pri spracovan¨ª DSL je v?hodn¨¦ pou?i? model dom¨¦ny, ktor? popisuje cie?ov¨²
dom¨¦nu DSL. Ten pri spracovan¨ª programu predstavuje reprezent¨¢ciu dom¨¦ny
v pam?ti po?¨ªta?a. V pr¨ªpade objektovo-orientovan¨¦ho pr¨ªstupu je tento model
vyjadren? prostredn¨ªctvom tried a ich vz?ahov. Tento model sa naz?va Fowler
s¨¦mantick? model.
S¨¦mantick? model je pri spracovan¨ª DSL programu naplnen? konkr¨¦tnymi
triedami predstavuj¨²cimi konkr¨¦tne pou?it¨¦ koncepty rie?enia probl¨¦mu. Na
z¨¢klade ¨²rovne abstrakcie s¨² rozli?ovan¨¦ jednotliv¨¦ ¨²rovne modelov (Obr. 0.1).
M0: In?tancie
M2: Metamodel
M3: Meta-metamodel
M1: Model
Typ: Class
Meno: Class
in?tancia ?pecifik¨¢cia
in?tancia ?pecifik¨¢cia
?pecifik¨¢ciain?tancia
in?tancia ?pecifik¨¢cia
Typ: Class
Meno: Entita
Typ: Entita
Meno: Student
Typ: Student
Meno: Peter
Obr. 0.1: ?rovne modelov
Pou?itie s¨¦mantick¨¦ho modelu m¨¢ viacero v?hod:
? Oddelenie spracovania programu od s¨¦mantiky programu.
? Poskytuje exibilitu pri sp?sobe spracovania programu a jeho vykona-
nia. Pre spracovanie programu je mo?n¨¦ pou?¨ªva? viacero jazykov?ch
procesorov. V pr¨ªpade vykonania programu je mo?n¨¦ vykon¨¢va? priamo
s¨¦mantick? model alebo generova? cie?ov? k¨®d (Obr. 0.2).
? S¨¦mantick? model je mo?n¨¦ jednoducho otestova? ?i je spr¨¢vne naplnen?.
V pr¨ªpade pou?itia viacer?ch jazykov?ch procesorov je mo?n¨¦ porovna?
?i naplnen¨¦ modely s¨² s¨¦manticky ekvivalentn¨¦.
? Poskytuje podporu pre viacer¨¦ DSL, kde spracovanie programov viac-
er?ch DSL vedie k naplneniu spolo?n¨¦ho s¨¦mantick¨¦ho modelu.
? Poskytuje podporu pre evol¨²ciu DSL.
2
Nev?hodou tohto pr¨ªstupu je jeho naviazanos? na objektov¨² paradigmu.
Pou?itie s¨¦mantick¨¦ho modelu napr¨ªklad vo funkcion¨¢lnych jazykoch by bolo
obtia?ne. Celkov? proces spracovania programu DSL je roz?¨ªren? o vytvorenie
a naplnenie s¨¦mantick¨¦ho modelu (Obr. 0.2).
s¨¦mantick? model
generovan? k¨®dprogram DSL
generovaniespracovanie
Obr. 0.2: S¨¦mantick? model v procese spracovania programu DSL
Generovanie k¨®du
V ?pecick?ch pr¨ªpadoch je obtia?ne vytvori? pre DSL interpreter, ktor? by
DSL program priamo vykon¨¢val. Pou?itie s¨¦mantick¨¦ho modelu takisto nie je
z¨¢rukou jeho priameho vykonania. V pr¨ªpade, ?e autor DSL nem¨¢ sk¨²senosti
s cie?ov?m prostred¨ªm resp. jazykom, je jednoduch?ie implementova? DSL
prostredn¨ªctvom zn¨¢meho jazyka a prostredn¨ªctvom gener¨¢tora vygenerova?
k¨®d pre cie?ov¨¦ prostredie. Princ¨ªpom generovania je mapovanie dom¨¦novo-
?pecick?ch abstrakci¨ª na abstrakcie cie?ov¨¦ho prostredia [2].
V pr¨ªpade, ?e existuje explicitne vyjadren? s¨¦mantick? model, je mo?n¨¦
generova? k¨®d na z¨¢klade tohto modelu. V generovanom k¨®de je zahrnut¨¢ ?as?
inform¨¢ci¨ª obsiahnut?ch v s¨¦mantickom modeli. T?m doch¨¢dza ku ?pecializ¨¢cii
generovan¨¦ho k¨®du. Av?ak generovanie k¨®du mo?no pou?i? aj bez s¨¦mantick¨¦ho
modelu. S¨¦mantika je vtedy vyjadren¨¢ procesom generovania k¨®du.
Pod?a samotn¨¦ho sp?sobu generovania sa rozli?uje generovanie prostred-
n¨ªctvom ?abl¨®ny alebo transforma?n¨¦ generovanie [4].
Generovanie bez pou?itia modelu
Pokia? generovan? k¨®d obsahuje logiku skriptu zak¨®dovan¨² priamo v riadiacich
?trukt¨²rach, ide o generovanie bez pou?itia modelu. Takto generovan? k¨®d
neobsahuje explicitne s¨¦mantick? model.
V generovanom k¨®de sa m??u vyskytova? duplik¨¢cie, ktor¨¦ s¨² ne?iaduce v
norm¨¢lnom k¨®de. Ke¡è?e tento k¨®d nie je upravovan? ru?ne, nesp?sobia du-
plicity probl¨¦my pri ¨²dr?be. V¡èaka tomu m??e ma? generovan? k¨®d pomerne
3
jednoduch¨² ?trukt¨²ru a nemus¨ª pou?¨ªva? zlo?it¨¦ abstrakcie a komplexn¨¦ d¨¢tov¨¦
?trukt¨²ry.
Tento pr¨ªstup pri generovan¨ª k¨®du m??e by? potrebn? kv?li obmedzeniam
cie?ovej platformy, ktor¨¢ nemus¨ª podporova? zlo?itej?iu ?trukt¨²ru k¨®du. K
tomu doch¨¢dza napr¨ªklad aj vtedy, ak generovan? k¨®d je tie? v dom¨¦novo-
?pecickom jazyku. Takto generovan? k¨®d m??e ma? tie? men?ie n¨¢roky na
hardv¨¦r v priebehu vykon¨¢vania.
Generovanie s pou?it¨ªm modelu
Generovan? k¨®d m??e vyu?¨ªva? explicitne implementovan? s¨¦mantick? model.
V danom pr¨ªpade je posta?uj¨²ce vygenerova? iba kongur¨¢ciu s¨¦mantick¨¦ho
modelu. Pri tomto pr¨ªstupe bude v generovanom k¨®de zachovan¨¦ rozdelenie
medzi v?eobecn?m a ?pecick?m k¨®dom. Implement¨¢cia modelu pri tom ne-
mus¨ª by? rovnak¨¢ ako t¨¢, ktor¨¢ sa pou?¨ªva pri spracovan¨ª dom¨¦novo-?pecick¨¦ho
jazyka.
V?hodou tohto pr¨ªstupu je fakt, ?e v¡èaka pou?itiu s¨¦mantick¨¦ho modelu
bude generovan? k¨®d krat?¨ª a bude jednoduch?ie ho generova?. Tak isto bude
mo?n¨¦ testova? spr¨¢vnu funk?nos? s¨¦mantick¨¦ho modelu nez¨¢visle od gener¨¢-
tora k¨®du. Prek¨¢?kou m??u by? obmedzenia cie?ovej platformy, ktor¨¦ znemo?-
nia implementova? v nej s¨¦mantick? model alebo tak¨¢to implement¨¢cia bude
neefekt¨ªvna.
Transforma?n¨¦ generovanie
Prv?m sp?sobom generovania k¨®du je vytvori? program, ktor? bude na z¨¢klade
s¨¦mantick¨¦ho modelu generova? v?stupn? k¨®d. Pritom je pre r?zne ?asti k¨®du
mo?n¨¦ pou?i? jeden z dvoch pr¨ªstupov:
? Generovanie riaden¨¦ vstupom
Pri tomto pr¨ªstupe program prech¨¢dza vstupn¨¦ d¨¢tov¨¦ ?trukt¨²ry a na
z¨¢klade nich sa generuje v?stup.
? Generovanie riaden¨¦ v?stupom
Pri tomto pr¨ªstupe sa vych¨¢dza z po?adovan¨¦ho v?stupn¨¦ho k¨®du a z
modelu sa z¨ªskavaj¨² ¨²daje potrebn¨¦ na generovanie tohto k¨®du.
Tieto pr¨ªstupy s¨² v???inou kombinovan¨¦ tak, ?e ?asti k¨®du, ktor?ch ?truk-
t¨²ra je nez¨¢visl¨¢ od konkr¨¦tnej kongur¨¢cie, s¨² generovan¨¦ pomocou proced¨²r
riaden?ch v?stupom. ?asto ide napr¨ªklad o celkov¨² ?trukt¨²ru v?stupn¨¦ho
k¨®du. Zatia? ?o pre ?asti, ktor¨¦ sa v?razne menia v z¨¢vislosti od s¨¦mantick¨¦ho
modelu, je pou?¨ªvan¨¦ generovanie riaden¨¦ vstupom.
Nasleduj¨²ci jednoduch? pr¨ªklad zn¨¢zor?uje transforma?n¨¦ generovanie den¨ª-
cie datab¨¢zovej sch¨¦my.
4
String renderScheme(Writer output, Model model) {
for (Entity entity: model.getEntities()) {
renderTable(output, entity);
}
}
String renderTable(Writer output, Entity entity) {
output.writeln(CREATE TABLE  + entity.name() +  ();
for (Property prop: entity.getProperties)
output.writeln(prop.getName() +  
+ sqlType(prop.getType()) + ,);
output.writeln());
}
V pr¨ªpadoch, ke¡è transform¨¢cie potrebn¨¦ pre generovanie v?stupn¨¦ho k¨®du
s¨² zlo?itej?ie, proces transform¨¢cie m??e by? rozdelen? na nieko?ko f¨¢z. Pritom
jednotliv¨¦ f¨¢zy generuj¨² pracovn¨¦ medzimodely, ktor¨¦ sl¨²?ia ako vstup pre
¡èal?iu f¨¢zu. Tento pr¨ªstup je be?n? napr¨ªklad aj u preklada?ov jazykov v?eobec-
n¨¦ho pou?itia [6].
Existuj¨² ?pecializovan¨¦ n¨¢stroje ur?en¨¦ na transformovanie programov, ktor¨¦
poskytuj¨² dom¨¦novo-?pecick¨¦ jazyky pre denovanie transform¨¢ci¨ª [7, 1].
Transforma?n¨¦ generovanie je vhodn¨¦ v pr¨ªpadoch, ke¡è sa v???ia ?as? k¨®du
men¨ª v z¨¢vislosti od vstupn?ch d¨¢t, a v pr¨ªpadoch, ke¡è pre vygenerovanie v?s-
tupn¨¦ho k¨®du s¨² potrebn¨¦ zlo?it¨¦ transform¨¢cie. Transforma?n¨¦ generovanie
je teda v?hodn¨¦ pou?i?, ak je jednoduch¨¢ rel¨¢cia medzi vstupn?m modelom a
v?stupom. V pr¨ªpade zlo?itej?ej rel¨¢cie je mo?n¨¦ generova? k¨®d vo viacer?ch
krokoch. S¨¦mantick? model sa transformuje na v?stupn? model a ten n¨¢sledne
na v?stupn? zdrojov? k¨®d.
¡¯abl¨®nov¨¦ generovanie
Pri generovan¨ª je mo?n¨¦ pou?i? ?abl¨®nu  v?stupn? k¨®d, v ktorom s¨² premen-
liv¨¦ ?asti nahraden¨¦ ?peci¨¢lnymi zna?kami. Po?as spracovania sa tieto zna?ky
nahradia potrebn?m textom, a tak sa vytvor¨ª skuto?n? v?stupn? k¨®d.
Generovanie prostredn¨ªctvom ?abl¨®ny sa be?ne pou?¨ªva napr¨ªklad pri v?voji
webov?ch aplik¨¢ci¨ª na generovanie HTML k¨®du. ¡¯abl¨®ny sa pou?¨ªvaj¨² nielen na
generovanie cel?ch v?stupn?ch dokumentov, ale aj na ?asti v?stupu. Pr¨ªkladom
je pou?itie jednoduch?ch ?abl¨®n v r¨¢mci funkcie printf jazyka C.
Pri generovan¨ª prostredn¨ªctvom ?abl¨®n sa pou?¨ªvaj¨² tri hlavn¨¦ komponenty:
?abl¨®nov? syst¨¦m, ?abl¨®na a kontext.
¡¯abl¨®na je v?stupn?m textom, v ktorom s¨² dynamick¨¦ ?asti nahraden¨¦ zna?kami,
ktor¨¦ sa odvol¨¢vaj¨² na ¨²daje z kontextu.
5
Kontext je zdrojom, z ktor¨¦ho sa ber¨² d¨¢ta pre vyplnenie ?abl¨®ny. M??e is? o
jednoduch¨² d¨¢tov¨² ?trukt¨²ru alebo aj o zlo?itej?iu ?trukt¨²ru obsahuj¨²cu
aj akt¨ªvne prvky.
¡¯abl¨®nov? syst¨¦m zabezpe?uje spracovanie ?abl¨®ny  vyp¡§?a ?abl¨®nu na
z¨¢klade modelu.
Existuje viacero ?abl¨®nov?ch syst¨¦mov, ktor¨¦ pou?¨ªvaj¨² r?zne sp?soby z¨¢pisu
?abl¨®n. Zna?ky v ?abl¨®ne m??u by? v podobe fragmentov hos?ovsk¨¦ho pro-
gramovacieho jazyka. Tento pr¨ªstup sa pou?¨ªva napr¨ªklad v JSP [3]. Rizikom
tak¨¦ho pr¨ªstupu je fakt, ?e ?abl¨®na m??e obsahova? pr¨ªli? ve?a hos?ovsk¨¦ho
k¨®du, ?o skomplikuje jej ?trukt¨²ru.
Mnoh¨¦ ?abl¨®nov¨¦ syst¨¦my (napr¨ªklad Velocity [5]) preto poskytuj¨² ?peci¨¢lny
?abl¨®novac¨ª jazyk. Ten umo??uje jednoducho pristupova? k d¨¢tam z kontextu.
Navy?e v???inou obsahuje ?peci¨¢lne kon?trukcie aj pre zlo?itej?ie oper¨¢cie,
ktor¨¦ s¨² ?asto potrebn¨¦ pri spracov¨¢van¨ª ?abl¨®ny, napr¨ªklad cykly a vetvenia.
Nasleduj¨²ci pr¨ªklad demon?truje ?abl¨®nu ur?en¨² pre generovanie tried v
jazyku Java. Pou?¨ªva sa tu ?abl¨®novac¨ª syst¨¦m Velocity.
package $package;
import base.Entity;
public class $name extends Entity {
#foreach ($property in $properties)
#set( $pname = $property.name )
private ${propery.type} ${pname};
public void set${capitalize($pname)}() {
this.${pname} = ${pname};
}
public ${propery.type} get${capitalize($pname)}() {
return ${pname};
}
#end
}
Generovanie prostredn¨ªctvom ?abl¨®ny je v?hodn¨¦ pou?¨ªva? v pr¨ªpadoch,
ke¡è ve?k¨¢ ?as? v?stupn¨¦ho k¨®du je statick¨¢  teda nemen¨ª sa v z¨¢vislosti od
vstupu. Naopak, ak je v???ia ?as? k¨®du dynamick¨¢ alebo je vz?ah vstupn?ch
d¨¢t a generovan¨¦ho k¨®du zlo?itej?¨ª, m??e by? vhodnej?ie pou?i? transforma?n¨¦
generovanie. V pr¨ªpade ?ast¨¦ho pou?itia podmienok, cyklov ?i in?ch funkci¨ª sa
st¨¢va ?abl¨®na nepreh?adnou a je komplikovaniej?ie pochopi?, ako bude vyzera?
v?sledn? k¨®d.
Spom¨ªnan¨¦ pr¨ªstupy m??u by? aj kombinovan¨¦. Napr¨ªklad pri transfor-
ma?nom generovan¨ª m??u by? na generovanie jednotliv?ch ?asti k¨®du pou?it¨¦
?abl¨®ny.
6
Oddelenie generovan¨¦ho k¨®du
Generovan? k¨®d je ?asto potrebn¨¦ manu¨¢lne prisp?sobi?. Generovan? k¨®d
z¨¢rove? nie je mo?n¨¦ priamo upravova?, preto?e pri op?tovnom vygenerovan¨ª
bud¨² ¨²pravy prep¨ªsan¨¦. V objektovo-orientovan?ch jazykoch je mo?n¨¦ oddeli?
generovan? a manu¨¢lne p¨ªsan? k¨®d prostredn¨ªctvom dedi?nosti. T¨¢to technika
sa ozna?uje term¨ªnom generation gap [4].
Pri tomto sp?sobe je generovan¨¢ nadtrieda a manu¨¢lne ¨²pravy s¨² vykon¨¢-
van¨¦ v triede, ktor¨¢ od nej ded¨ª. V¡èaka dedi?nosti je mo?n¨¦ v podtriede
jednoducho doplni? potrebn¨² funkcionalitu, ale aj nahradi? generovan¨¦ met¨®dy
vlastn?mi. Pritom podtrieda m¨¢ pr¨ªstup ku funkcionalite generovanej triedy. V
k¨®de aplik¨¢cie sa potom odkazuje v?dy len na manu¨¢lne vytvoren¨² podtriedu.
Niekedy sa pou?¨ªva e?te ¡èal?ia trieda, od ktorej ded¨ª generovan¨¢ trieda. V
nej je mo?n¨¦ umiestni? t¨² ?as? k¨®du, ktor¨¢ sa nemen¨ª v z¨¢vislosti od vstupn?ch
d¨¢t gener¨¢tora. V?sledn¨¢ hierarchia tried je zobrazen¨¢ na obr. 0.3.
Manu¨¢lne
vytvoren¨¢
nadtrieda
Generovan¨¢ trieda
Manu¨¢lne
vytvoren¨¢
podtrieda
Obr. 0.3: Hierarchia tried pri oddelen¨ª generovan¨¦ho k¨®du dedi?nos?ou
Niektor¨¦ jazyky poskytuj¨² in¨¦ prostriedky, ktor¨¦ sa daj¨² pou?i? na odde-
lenie generovan¨¦ho k¨®du a jeho prisp?sobenie. Napr¨ªklad jazyk C# umo??uje
rozdeli? den¨ªciu triedy do viacer?ch s¨²borov (tzv. ?iasto?n¨¦ triedy, angl. par-
tial classes). Niektor¨¦ jazyky ako napr. Ruby umo??uj¨² jednoducho dynamicky
doplni? den¨ªciu triedy.
Literat¨²ra
[1] Cordy, J. R. Txl - a language for programming language tools and appli-
cations. Electron. Notes Theor. Comput. Sci. 110 (December 2004), 331.
[2] Czarnecki, K. Overview of generative software development. In Un-
conventional Programming Paradigms, J.-P. Ban?tre, P. Fradet, J.-L. Gi-
avitto, and O. Michel, Eds., vol. 3566 of Lecture Notes in Computer Science.
Springer Berlin / Heidelberg, 2005, pp. 326341.
[3] Fields, D. K., Kolb, M. A., and Bayern, S. Web Development with
Java Server Pages, 2nd ed. Manning Publications Co., Greenwich, CT,
USA, 2001.
[4] Fowler, M. Domain Specic Languages. Addison-Wesley Professional,
2010.
[5] Gradecki, J., and Cole, J. Mastering Apache Velocity. Wiley, 2003.
[6] Koll¨¢r, J. Preklada?e. elfa, s.r.o., Ko?ice, 2009.
[7] Visser, E. Stratego: A language for program transformation based on
rewriting strategies system. description of stratego 0.5. In Rewriting Tech-
niques and Applications, A. Middeldorp, Ed., vol. 2051 of Lecture Notes in
Computer Science. Springer Berlin / Heidelberg, 2001, pp. 357361.
7

More Related Content

Magsa-generovanie

  • 1. 1 S¨¦mantick? model Pri spracovan¨ª DSL je v?hodn¨¦ pou?i? model dom¨¦ny, ktor? popisuje cie?ov¨² dom¨¦nu DSL. Ten pri spracovan¨ª programu predstavuje reprezent¨¢ciu dom¨¦ny v pam?ti po?¨ªta?a. V pr¨ªpade objektovo-orientovan¨¦ho pr¨ªstupu je tento model vyjadren? prostredn¨ªctvom tried a ich vz?ahov. Tento model sa naz?va Fowler s¨¦mantick? model. S¨¦mantick? model je pri spracovan¨ª DSL programu naplnen? konkr¨¦tnymi triedami predstavuj¨²cimi konkr¨¦tne pou?it¨¦ koncepty rie?enia probl¨¦mu. Na z¨¢klade ¨²rovne abstrakcie s¨² rozli?ovan¨¦ jednotliv¨¦ ¨²rovne modelov (Obr. 0.1). M0: In?tancie M2: Metamodel M3: Meta-metamodel M1: Model Typ: Class Meno: Class in?tancia ?pecifik¨¢cia in?tancia ?pecifik¨¢cia ?pecifik¨¢ciain?tancia in?tancia ?pecifik¨¢cia Typ: Class Meno: Entita Typ: Entita Meno: Student Typ: Student Meno: Peter Obr. 0.1: ?rovne modelov Pou?itie s¨¦mantick¨¦ho modelu m¨¢ viacero v?hod: ? Oddelenie spracovania programu od s¨¦mantiky programu. ? Poskytuje exibilitu pri sp?sobe spracovania programu a jeho vykona- nia. Pre spracovanie programu je mo?n¨¦ pou?¨ªva? viacero jazykov?ch procesorov. V pr¨ªpade vykonania programu je mo?n¨¦ vykon¨¢va? priamo s¨¦mantick? model alebo generova? cie?ov? k¨®d (Obr. 0.2). ? S¨¦mantick? model je mo?n¨¦ jednoducho otestova? ?i je spr¨¢vne naplnen?. V pr¨ªpade pou?itia viacer?ch jazykov?ch procesorov je mo?n¨¦ porovna? ?i naplnen¨¦ modely s¨² s¨¦manticky ekvivalentn¨¦. ? Poskytuje podporu pre viacer¨¦ DSL, kde spracovanie programov viac- er?ch DSL vedie k naplneniu spolo?n¨¦ho s¨¦mantick¨¦ho modelu. ? Poskytuje podporu pre evol¨²ciu DSL.
  • 2. 2 Nev?hodou tohto pr¨ªstupu je jeho naviazanos? na objektov¨² paradigmu. Pou?itie s¨¦mantick¨¦ho modelu napr¨ªklad vo funkcion¨¢lnych jazykoch by bolo obtia?ne. Celkov? proces spracovania programu DSL je roz?¨ªren? o vytvorenie a naplnenie s¨¦mantick¨¦ho modelu (Obr. 0.2). s¨¦mantick? model generovan? k¨®dprogram DSL generovaniespracovanie Obr. 0.2: S¨¦mantick? model v procese spracovania programu DSL Generovanie k¨®du V ?pecick?ch pr¨ªpadoch je obtia?ne vytvori? pre DSL interpreter, ktor? by DSL program priamo vykon¨¢val. Pou?itie s¨¦mantick¨¦ho modelu takisto nie je z¨¢rukou jeho priameho vykonania. V pr¨ªpade, ?e autor DSL nem¨¢ sk¨²senosti s cie?ov?m prostred¨ªm resp. jazykom, je jednoduch?ie implementova? DSL prostredn¨ªctvom zn¨¢meho jazyka a prostredn¨ªctvom gener¨¢tora vygenerova? k¨®d pre cie?ov¨¦ prostredie. Princ¨ªpom generovania je mapovanie dom¨¦novo- ?pecick?ch abstrakci¨ª na abstrakcie cie?ov¨¦ho prostredia [2]. V pr¨ªpade, ?e existuje explicitne vyjadren? s¨¦mantick? model, je mo?n¨¦ generova? k¨®d na z¨¢klade tohto modelu. V generovanom k¨®de je zahrnut¨¢ ?as? inform¨¢ci¨ª obsiahnut?ch v s¨¦mantickom modeli. T?m doch¨¢dza ku ?pecializ¨¢cii generovan¨¦ho k¨®du. Av?ak generovanie k¨®du mo?no pou?i? aj bez s¨¦mantick¨¦ho modelu. S¨¦mantika je vtedy vyjadren¨¢ procesom generovania k¨®du. Pod?a samotn¨¦ho sp?sobu generovania sa rozli?uje generovanie prostred- n¨ªctvom ?abl¨®ny alebo transforma?n¨¦ generovanie [4]. Generovanie bez pou?itia modelu Pokia? generovan? k¨®d obsahuje logiku skriptu zak¨®dovan¨² priamo v riadiacich ?trukt¨²rach, ide o generovanie bez pou?itia modelu. Takto generovan? k¨®d neobsahuje explicitne s¨¦mantick? model. V generovanom k¨®de sa m??u vyskytova? duplik¨¢cie, ktor¨¦ s¨² ne?iaduce v norm¨¢lnom k¨®de. Ke¡è?e tento k¨®d nie je upravovan? ru?ne, nesp?sobia du- plicity probl¨¦my pri ¨²dr?be. V¡èaka tomu m??e ma? generovan? k¨®d pomerne
  • 3. 3 jednoduch¨² ?trukt¨²ru a nemus¨ª pou?¨ªva? zlo?it¨¦ abstrakcie a komplexn¨¦ d¨¢tov¨¦ ?trukt¨²ry. Tento pr¨ªstup pri generovan¨ª k¨®du m??e by? potrebn? kv?li obmedzeniam cie?ovej platformy, ktor¨¢ nemus¨ª podporova? zlo?itej?iu ?trukt¨²ru k¨®du. K tomu doch¨¢dza napr¨ªklad aj vtedy, ak generovan? k¨®d je tie? v dom¨¦novo- ?pecickom jazyku. Takto generovan? k¨®d m??e ma? tie? men?ie n¨¢roky na hardv¨¦r v priebehu vykon¨¢vania. Generovanie s pou?it¨ªm modelu Generovan? k¨®d m??e vyu?¨ªva? explicitne implementovan? s¨¦mantick? model. V danom pr¨ªpade je posta?uj¨²ce vygenerova? iba kongur¨¢ciu s¨¦mantick¨¦ho modelu. Pri tomto pr¨ªstupe bude v generovanom k¨®de zachovan¨¦ rozdelenie medzi v?eobecn?m a ?pecick?m k¨®dom. Implement¨¢cia modelu pri tom ne- mus¨ª by? rovnak¨¢ ako t¨¢, ktor¨¢ sa pou?¨ªva pri spracovan¨ª dom¨¦novo-?pecick¨¦ho jazyka. V?hodou tohto pr¨ªstupu je fakt, ?e v¡èaka pou?itiu s¨¦mantick¨¦ho modelu bude generovan? k¨®d krat?¨ª a bude jednoduch?ie ho generova?. Tak isto bude mo?n¨¦ testova? spr¨¢vnu funk?nos? s¨¦mantick¨¦ho modelu nez¨¢visle od gener¨¢- tora k¨®du. Prek¨¢?kou m??u by? obmedzenia cie?ovej platformy, ktor¨¦ znemo?- nia implementova? v nej s¨¦mantick? model alebo tak¨¢to implement¨¢cia bude neefekt¨ªvna. Transforma?n¨¦ generovanie Prv?m sp?sobom generovania k¨®du je vytvori? program, ktor? bude na z¨¢klade s¨¦mantick¨¦ho modelu generova? v?stupn? k¨®d. Pritom je pre r?zne ?asti k¨®du mo?n¨¦ pou?i? jeden z dvoch pr¨ªstupov: ? Generovanie riaden¨¦ vstupom Pri tomto pr¨ªstupe program prech¨¢dza vstupn¨¦ d¨¢tov¨¦ ?trukt¨²ry a na z¨¢klade nich sa generuje v?stup. ? Generovanie riaden¨¦ v?stupom Pri tomto pr¨ªstupe sa vych¨¢dza z po?adovan¨¦ho v?stupn¨¦ho k¨®du a z modelu sa z¨ªskavaj¨² ¨²daje potrebn¨¦ na generovanie tohto k¨®du. Tieto pr¨ªstupy s¨² v???inou kombinovan¨¦ tak, ?e ?asti k¨®du, ktor?ch ?truk- t¨²ra je nez¨¢visl¨¢ od konkr¨¦tnej kongur¨¢cie, s¨² generovan¨¦ pomocou proced¨²r riaden?ch v?stupom. ?asto ide napr¨ªklad o celkov¨² ?trukt¨²ru v?stupn¨¦ho k¨®du. Zatia? ?o pre ?asti, ktor¨¦ sa v?razne menia v z¨¢vislosti od s¨¦mantick¨¦ho modelu, je pou?¨ªvan¨¦ generovanie riaden¨¦ vstupom. Nasleduj¨²ci jednoduch? pr¨ªklad zn¨¢zor?uje transforma?n¨¦ generovanie den¨ª- cie datab¨¢zovej sch¨¦my.
  • 4. 4 String renderScheme(Writer output, Model model) { for (Entity entity: model.getEntities()) { renderTable(output, entity); } } String renderTable(Writer output, Entity entity) { output.writeln(CREATE TABLE + entity.name() + (); for (Property prop: entity.getProperties) output.writeln(prop.getName() + + sqlType(prop.getType()) + ,); output.writeln()); } V pr¨ªpadoch, ke¡è transform¨¢cie potrebn¨¦ pre generovanie v?stupn¨¦ho k¨®du s¨² zlo?itej?ie, proces transform¨¢cie m??e by? rozdelen? na nieko?ko f¨¢z. Pritom jednotliv¨¦ f¨¢zy generuj¨² pracovn¨¦ medzimodely, ktor¨¦ sl¨²?ia ako vstup pre ¡èal?iu f¨¢zu. Tento pr¨ªstup je be?n? napr¨ªklad aj u preklada?ov jazykov v?eobec- n¨¦ho pou?itia [6]. Existuj¨² ?pecializovan¨¦ n¨¢stroje ur?en¨¦ na transformovanie programov, ktor¨¦ poskytuj¨² dom¨¦novo-?pecick¨¦ jazyky pre denovanie transform¨¢ci¨ª [7, 1]. Transforma?n¨¦ generovanie je vhodn¨¦ v pr¨ªpadoch, ke¡è sa v???ia ?as? k¨®du men¨ª v z¨¢vislosti od vstupn?ch d¨¢t, a v pr¨ªpadoch, ke¡è pre vygenerovanie v?s- tupn¨¦ho k¨®du s¨² potrebn¨¦ zlo?it¨¦ transform¨¢cie. Transforma?n¨¦ generovanie je teda v?hodn¨¦ pou?i?, ak je jednoduch¨¢ rel¨¢cia medzi vstupn?m modelom a v?stupom. V pr¨ªpade zlo?itej?ej rel¨¢cie je mo?n¨¦ generova? k¨®d vo viacer?ch krokoch. S¨¦mantick? model sa transformuje na v?stupn? model a ten n¨¢sledne na v?stupn? zdrojov? k¨®d. ¡¯abl¨®nov¨¦ generovanie Pri generovan¨ª je mo?n¨¦ pou?i? ?abl¨®nu v?stupn? k¨®d, v ktorom s¨² premen- liv¨¦ ?asti nahraden¨¦ ?peci¨¢lnymi zna?kami. Po?as spracovania sa tieto zna?ky nahradia potrebn?m textom, a tak sa vytvor¨ª skuto?n? v?stupn? k¨®d. Generovanie prostredn¨ªctvom ?abl¨®ny sa be?ne pou?¨ªva napr¨ªklad pri v?voji webov?ch aplik¨¢ci¨ª na generovanie HTML k¨®du. ¡¯abl¨®ny sa pou?¨ªvaj¨² nielen na generovanie cel?ch v?stupn?ch dokumentov, ale aj na ?asti v?stupu. Pr¨ªkladom je pou?itie jednoduch?ch ?abl¨®n v r¨¢mci funkcie printf jazyka C. Pri generovan¨ª prostredn¨ªctvom ?abl¨®n sa pou?¨ªvaj¨² tri hlavn¨¦ komponenty: ?abl¨®nov? syst¨¦m, ?abl¨®na a kontext. ¡¯abl¨®na je v?stupn?m textom, v ktorom s¨² dynamick¨¦ ?asti nahraden¨¦ zna?kami, ktor¨¦ sa odvol¨¢vaj¨² na ¨²daje z kontextu.
  • 5. 5 Kontext je zdrojom, z ktor¨¦ho sa ber¨² d¨¢ta pre vyplnenie ?abl¨®ny. M??e is? o jednoduch¨² d¨¢tov¨² ?trukt¨²ru alebo aj o zlo?itej?iu ?trukt¨²ru obsahuj¨²cu aj akt¨ªvne prvky. ¡¯abl¨®nov? syst¨¦m zabezpe?uje spracovanie ?abl¨®ny vyp¡§?a ?abl¨®nu na z¨¢klade modelu. Existuje viacero ?abl¨®nov?ch syst¨¦mov, ktor¨¦ pou?¨ªvaj¨² r?zne sp?soby z¨¢pisu ?abl¨®n. Zna?ky v ?abl¨®ne m??u by? v podobe fragmentov hos?ovsk¨¦ho pro- gramovacieho jazyka. Tento pr¨ªstup sa pou?¨ªva napr¨ªklad v JSP [3]. Rizikom tak¨¦ho pr¨ªstupu je fakt, ?e ?abl¨®na m??e obsahova? pr¨ªli? ve?a hos?ovsk¨¦ho k¨®du, ?o skomplikuje jej ?trukt¨²ru. Mnoh¨¦ ?abl¨®nov¨¦ syst¨¦my (napr¨ªklad Velocity [5]) preto poskytuj¨² ?peci¨¢lny ?abl¨®novac¨ª jazyk. Ten umo??uje jednoducho pristupova? k d¨¢tam z kontextu. Navy?e v???inou obsahuje ?peci¨¢lne kon?trukcie aj pre zlo?itej?ie oper¨¢cie, ktor¨¦ s¨² ?asto potrebn¨¦ pri spracov¨¢van¨ª ?abl¨®ny, napr¨ªklad cykly a vetvenia. Nasleduj¨²ci pr¨ªklad demon?truje ?abl¨®nu ur?en¨² pre generovanie tried v jazyku Java. Pou?¨ªva sa tu ?abl¨®novac¨ª syst¨¦m Velocity. package $package; import base.Entity; public class $name extends Entity { #foreach ($property in $properties) #set( $pname = $property.name ) private ${propery.type} ${pname}; public void set${capitalize($pname)}() { this.${pname} = ${pname}; } public ${propery.type} get${capitalize($pname)}() { return ${pname}; } #end } Generovanie prostredn¨ªctvom ?abl¨®ny je v?hodn¨¦ pou?¨ªva? v pr¨ªpadoch, ke¡è ve?k¨¢ ?as? v?stupn¨¦ho k¨®du je statick¨¢ teda nemen¨ª sa v z¨¢vislosti od vstupu. Naopak, ak je v???ia ?as? k¨®du dynamick¨¢ alebo je vz?ah vstupn?ch d¨¢t a generovan¨¦ho k¨®du zlo?itej?¨ª, m??e by? vhodnej?ie pou?i? transforma?n¨¦ generovanie. V pr¨ªpade ?ast¨¦ho pou?itia podmienok, cyklov ?i in?ch funkci¨ª sa st¨¢va ?abl¨®na nepreh?adnou a je komplikovaniej?ie pochopi?, ako bude vyzera? v?sledn? k¨®d. Spom¨ªnan¨¦ pr¨ªstupy m??u by? aj kombinovan¨¦. Napr¨ªklad pri transfor- ma?nom generovan¨ª m??u by? na generovanie jednotliv?ch ?asti k¨®du pou?it¨¦ ?abl¨®ny.
  • 6. 6 Oddelenie generovan¨¦ho k¨®du Generovan? k¨®d je ?asto potrebn¨¦ manu¨¢lne prisp?sobi?. Generovan? k¨®d z¨¢rove? nie je mo?n¨¦ priamo upravova?, preto?e pri op?tovnom vygenerovan¨ª bud¨² ¨²pravy prep¨ªsan¨¦. V objektovo-orientovan?ch jazykoch je mo?n¨¦ oddeli? generovan? a manu¨¢lne p¨ªsan? k¨®d prostredn¨ªctvom dedi?nosti. T¨¢to technika sa ozna?uje term¨ªnom generation gap [4]. Pri tomto sp?sobe je generovan¨¢ nadtrieda a manu¨¢lne ¨²pravy s¨² vykon¨¢- van¨¦ v triede, ktor¨¢ od nej ded¨ª. V¡èaka dedi?nosti je mo?n¨¦ v podtriede jednoducho doplni? potrebn¨² funkcionalitu, ale aj nahradi? generovan¨¦ met¨®dy vlastn?mi. Pritom podtrieda m¨¢ pr¨ªstup ku funkcionalite generovanej triedy. V k¨®de aplik¨¢cie sa potom odkazuje v?dy len na manu¨¢lne vytvoren¨² podtriedu. Niekedy sa pou?¨ªva e?te ¡èal?ia trieda, od ktorej ded¨ª generovan¨¢ trieda. V nej je mo?n¨¦ umiestni? t¨² ?as? k¨®du, ktor¨¢ sa nemen¨ª v z¨¢vislosti od vstupn?ch d¨¢t gener¨¢tora. V?sledn¨¢ hierarchia tried je zobrazen¨¢ na obr. 0.3. Manu¨¢lne vytvoren¨¢ nadtrieda Generovan¨¢ trieda Manu¨¢lne vytvoren¨¢ podtrieda Obr. 0.3: Hierarchia tried pri oddelen¨ª generovan¨¦ho k¨®du dedi?nos?ou Niektor¨¦ jazyky poskytuj¨² in¨¦ prostriedky, ktor¨¦ sa daj¨² pou?i? na odde- lenie generovan¨¦ho k¨®du a jeho prisp?sobenie. Napr¨ªklad jazyk C# umo??uje rozdeli? den¨ªciu triedy do viacer?ch s¨²borov (tzv. ?iasto?n¨¦ triedy, angl. par- tial classes). Niektor¨¦ jazyky ako napr. Ruby umo??uj¨² jednoducho dynamicky doplni? den¨ªciu triedy.
  • 7. Literat¨²ra [1] Cordy, J. R. Txl - a language for programming language tools and appli- cations. Electron. Notes Theor. Comput. Sci. 110 (December 2004), 331. [2] Czarnecki, K. Overview of generative software development. In Un- conventional Programming Paradigms, J.-P. Ban?tre, P. Fradet, J.-L. Gi- avitto, and O. Michel, Eds., vol. 3566 of Lecture Notes in Computer Science. Springer Berlin / Heidelberg, 2005, pp. 326341. [3] Fields, D. K., Kolb, M. A., and Bayern, S. Web Development with Java Server Pages, 2nd ed. Manning Publications Co., Greenwich, CT, USA, 2001. [4] Fowler, M. Domain Specic Languages. Addison-Wesley Professional, 2010. [5] Gradecki, J., and Cole, J. Mastering Apache Velocity. Wiley, 2003. [6] Koll¨¢r, J. Preklada?e. elfa, s.r.o., Ko?ice, 2009. [7] Visser, E. Stratego: A language for program transformation based on rewriting strategies system. description of stratego 0.5. In Rewriting Tech- niques and Applications, A. Middeldorp, Ed., vol. 2051 of Lecture Notes in Computer Science. Springer Berlin / Heidelberg, 2001, pp. 357361. 7