SlideShare a Scribd company logo
1 of 7
Download to read offline
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

Viewers also liked

Música Coral Barroca
Música Coral BarrocaMúsica Coral Barroca
Música Coral BarrocaJoel Reyes
 
CV_Deepak_Jan15_Updated
CV_Deepak_Jan15_UpdatedCV_Deepak_Jan15_Updated
CV_Deepak_Jan15_UpdatedDEEPAK MANDAL
 
MBA: Management Accounting - Pricing and Product Related Decisions
MBA: Management Accounting - Pricing  and Product Related DecisionsMBA: Management Accounting - Pricing  and Product Related Decisions
MBA: Management Accounting - Pricing and Product Related DecisionsKishan Kumar
 
Introduction to Android development - Presentation Report
Introduction to Android development - Presentation ReportIntroduction to Android development - Presentation Report
Introduction to Android development - Presentation ReportAtul Panjwani
 
MBA: Managerial Economics - Supply and Demand Curve Relationship
MBA: Managerial Economics - Supply and Demand Curve RelationshipMBA: Managerial Economics - Supply and Demand Curve Relationship
MBA: Managerial Economics - Supply and Demand Curve RelationshipKishan Kumar
 
Tony Fernandes - Leadership in Organization
Tony Fernandes - Leadership in OrganizationTony Fernandes - Leadership in Organization
Tony Fernandes - Leadership in OrganizationKishan Kumar
 
Introduction to Android development - Presentation
Introduction to Android development - PresentationIntroduction to Android development - Presentation
Introduction to Android development - PresentationAtul Panjwani
 

Viewers also liked (8)

Aurores Boreales
Aurores BorealesAurores Boreales
Aurores Boreales
 
Música Coral Barroca
Música Coral BarrocaMúsica Coral Barroca
Música Coral Barroca
 
CV_Deepak_Jan15_Updated
CV_Deepak_Jan15_UpdatedCV_Deepak_Jan15_Updated
CV_Deepak_Jan15_Updated
 
MBA: Management Accounting - Pricing and Product Related Decisions
MBA: Management Accounting - Pricing  and Product Related DecisionsMBA: Management Accounting - Pricing  and Product Related Decisions
MBA: Management Accounting - Pricing and Product Related Decisions
 
Introduction to Android development - Presentation Report
Introduction to Android development - Presentation ReportIntroduction to Android development - Presentation Report
Introduction to Android development - Presentation Report
 
MBA: Managerial Economics - Supply and Demand Curve Relationship
MBA: Managerial Economics - Supply and Demand Curve RelationshipMBA: Managerial Economics - Supply and Demand Curve Relationship
MBA: Managerial Economics - Supply and Demand Curve Relationship
 
Tony Fernandes - Leadership in Organization
Tony Fernandes - Leadership in OrganizationTony Fernandes - Leadership in Organization
Tony Fernandes - Leadership in Organization
 
Introduction to Android development - Presentation
Introduction to Android development - PresentationIntroduction to Android development - Presentation
Introduction to Android development - Presentation
 

Similar to Magsa-generovanie

ukol KPI
ukol KPIukol KPI
ukol KPISlavoM
 
Úvod do vývoja pre Windows Phone 7 II
Úvod do vývoja pre Windows Phone 7 IIÚvod do vývoja pre Windows Phone 7 II
Úvod do vývoja pre Windows Phone 7 IIIgor Kulman
 
Záverečná úloha KPI
Záverečná úloha KPIZáverečná úloha KPI
Záverečná úloha KPIhull666666
 
Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...
Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...
Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...Catana0605
 
SecureCam Program Guide
SecureCam Program GuideSecureCam Program Guide
SecureCam Program Guideguest146c167
 
BarCamp - Zváračský kurz na Web
BarCamp - Zváračský kurz na WebBarCamp - Zváračský kurz na Web
BarCamp - Zváračský kurz na WebJuraj Michálek
 
Drupal ako nízkonákladová platforma pre business web aplikácie
Drupal ako nízkonákladová platforma pre business web aplikácieDrupal ako nízkonákladová platforma pre business web aplikácie
Drupal ako nízkonákladová platforma pre business web aplikácieJozef Toth
 
Prezentácia: Diplomový seminár
Prezentácia: Diplomový seminárPrezentácia: Diplomový seminár
Prezentácia: Diplomový seminárguest3604661
 
Zváračský kurz na BlazeDS a Google App Engine
Zváračský kurz na BlazeDS a Google App EngineZváračský kurz na BlazeDS a Google App Engine
Zváračský kurz na BlazeDS a Google App EngineJuraj Michálek
 
Čo sú to webové aplikácie ?
Čo sú to webové aplikácie ?Čo sú to webové aplikácie ?
Čo sú to webové aplikácie ?Drahoslav Madar
 
Design mobilnych aplikacii
Design mobilnych aplikaciiDesign mobilnych aplikacii
Design mobilnych aplikaciiSCR®
 
Ať se z kódu nepráší!
Ať se z kódu nepráší!Ať se z kódu nepráší!
Ať se z kódu nepráší!Juraj Michálek
 
Počítačová podpora procesného modelovania s pomocou BPMN
Počítačová podpora procesného modelovania s pomocou BPMNPočítačová podpora procesného modelovania s pomocou BPMN
Počítačová podpora procesného modelovania s pomocou BPMNMiroslav Reiter
 

Similar to Magsa-generovanie (20)

ukol KPI
ukol KPIukol KPI
ukol KPI
 
Úvod do vývoja pre Windows Phone 7 II
Úvod do vývoja pre Windows Phone 7 IIÚvod do vývoja pre Windows Phone 7 II
Úvod do vývoja pre Windows Phone 7 II
 
Záverečná úloha KPI
Záverečná úloha KPIZáverečná úloha KPI
Záverečná úloha KPI
 
C#
C#C#
C#
 
C#
C#C#
C#
 
C#
C#C#
C#
 
Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...
Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...
Návrh a realizácia web stránky skriptovacím jazykom PHP vrátane administračné...
 
SecureCam Program Guide
SecureCam Program GuideSecureCam Program Guide
SecureCam Program Guide
 
Programovanie v C++
Programovanie v C++Programovanie v C++
Programovanie v C++
 
Zajacek_Michal_KPI
Zajacek_Michal_KPIZajacek_Michal_KPI
Zajacek_Michal_KPI
 
BarCamp - Zváračský kurz na Web
BarCamp - Zváračský kurz na WebBarCamp - Zváračský kurz na Web
BarCamp - Zváračský kurz na Web
 
Drupal ako nízkonákladová platforma pre business web aplikácie
Drupal ako nízkonákladová platforma pre business web aplikácieDrupal ako nízkonákladová platforma pre business web aplikácie
Drupal ako nízkonákladová platforma pre business web aplikácie
 
rrr
rrrrrr
rrr
 
Prezentácia: Diplomový seminár
Prezentácia: Diplomový seminárPrezentácia: Diplomový seminár
Prezentácia: Diplomový seminár
 
Zváračský kurz na BlazeDS a Google App Engine
Zváračský kurz na BlazeDS a Google App EngineZváračský kurz na BlazeDS a Google App Engine
Zváračský kurz na BlazeDS a Google App Engine
 
Čo sú to webové aplikácie ?
Čo sú to webové aplikácie ?Čo sú to webové aplikácie ?
Čo sú to webové aplikácie ?
 
Design mobilnych aplikacii
Design mobilnych aplikaciiDesign mobilnych aplikacii
Design mobilnych aplikacii
 
Ať se z kódu nepráší!
Ať se z kódu nepráší!Ať se z kódu nepráší!
Ať se z kódu nepráší!
 
Počítačová podpora procesného modelovania s pomocou BPMN
Počítačová podpora procesného modelovania s pomocou BPMNPočítačová podpora procesného modelovania s pomocou BPMN
Počítačová podpora procesného modelovania s pomocou BPMN
 
Php sec
Php secPhp sec
Php sec
 

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