Documente Academic
Documente Profesional
Documente Cultură
gș e‐content
pentru învățământul superior tehnic
Instrumente pentru Dezvoltarea Programelor
p g
Sumar
Generatoare
Siguranţa generatoarelor
g ţ g
Java Emitter Templates (JET)
Exemple JET
Exemple JET
Optimizare: Evaluare Parţială
Şabloane
Şabloane de Proiectare: Şablonul Factory
de Proiectare: Şablonul Factory
Algoritmi: Automate cu Stări Finite
IDP – Instrumente pentru Dezvoltarea Programelor 2
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Generatoare
“The simplest scheme of
evolution is one that depends
p on
two processes; a generator and
a test. The task of the
generator is to produce variety,
new fforms that
h have
h not
existed previously, whereas the
task of the test is to cull out
the newly generated forms so
that only those that are well
fitted to the environment will
survive ”
survive.
(Herbert Simon)
IDP – Instrumente pentru Dezvoltarea Programelor 3
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
G
Generatoare
t
Generatoarele sunt programe ce pot genera diverse artefacte
Ele automatizează crearea artefactelor ce au o structură bine înţeleasă şi
regulată
Artefactele generate variază cel mai adesea în funcţie de intrarea generatorului
Exemple:
Compilatorul: generează cod binar pornind de la codul sursă
JavaDoc: generează pagini HTML pe baza comentariilor din codul sursă
g p g p
Green: generează cod sursă pornind de la diagrame de clase
Servlets: generează pagini HTML
Java Server Pages (JSP): generează Servlets
Input
Generator Output
(P
(Parameter)
)
IDP – Instrumente pentru Dezvoltarea Programelor 4
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
P
Programarea Generativă
G i ă
Există “task‐uri de rutină” de programare ce sunt întotdeauna similare
p g
Doar mici variaţii în funcţie de anumiţi parametrii
Programarea generativă încearcă automatizarea acestor task‐uri
folosind generatoare de program parametrizate pentru diverse părţi
folosind generatoare de program parametrizate pentru diverse părţi
ale programului
Generatoarele de program sunt meta‐programe: programe ce lucrează
cu alte programe
Meta‐programarea poate fi sofisticată şi potenţial nesigură
Diverse abordări ale programării generative
Instrumente externe: programe de sine stătătoare ce efectuează un task
Instrumente externe: programe de sine stătătoare ce efectuează un task
particular de generare de program (e.g. compilator, generator de compilator)
Elemente generative de limbaj: construcţii pentru generarea integrată într‐un
limbaj de programare
Adesea transformare a unor noi construcţii de nivel înalt în construcţii de nivel
Adesea transformare a unor noi construcţii de nivel înalt în construcţii de nivel
scăzut (adesea numite ‘macrouri’)
IDP – Instrumente pentru Dezvoltarea Programelor 5
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Ti
Tipare & Aplicaţii Comune
& A li ii C
Class extensions
Input: clasa ce trebuie extinsă & informaţii suplimentare
Input: clasa ce trebuie extinsă & informaţii suplimentare
Output: subclasa conţinând funcţionalităţi suplimentare
E.g. clone, hashcode, equals, print, serialize, copy
Proxies
Input: tipul şi metodele/câmpurile ce trebuie protejate
Output: subclasa conţinând semantici modificate
E.g. monitorizare, acces la distanţă, managementul resurselor, controlul accesului
Wrappers
Input: tipuri, metode, câmpuri ce trebuie învelite
Output: clasa wrapper cu interfaţa corespunzătoare
E.g. Integrarea de componente legacy
Interfaces
Input: descrierea interfeţei
Output: diverse tipuri de interfeţe
E g DB interface GUI web interface API
E.g. DB interface, GUI, web interface, API
IDP – Instrumente pentru Dezvoltarea Programelor 6
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
T
Templeturi
l i
Codul ce generează cod poate fi complex
Exemplu: construirea unui Abstract Syntax Tree (AST) pentru codul
generatt
JavaClass c = new JavaClass("GeneratedClass");
c.extends = x;
c.fields.add(new Field(TYPE_INTEGER, "myVar"));
Greu de surprins exact ce se crează
Abordare mai bună: templeturi
class GeneratedClass extends @x@ {
I t
Integer myVar;
V
}
Ieşirea
Ieşirea este redată în forma ei naturală
este redată în forma ei naturală
În locurile în care ieşirile variază putem insera cod generator
(e.g. @x@)
IDP – Instrumente pentru Dezvoltarea Programelor 7
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
E
Exemplu:
l Generator Getter&Setter
G t G tt &S tt
Convenţia Java: clasele furnizează metode getter şi setter pentru accesarea
variabilelor membre
Poate fi util, e.g. pentru pattern‐ul observer
Metodele simple getter şi setter reprezintă cel mai adesea muncă de rutină
Putem automatiza procesul folosind un generator:
Exemplu: Remote Method Calls
Remote Method Calls
Apelarea de metode ale unor obiecte aflate pe alte calculatoare ca
şi cum ele ar fi locale
Necesită o nouă clasă: stubul clientului
Pentru obiectul reprezentând local obiectul de la distanţă
Are
Are aceeaşi semnătură ca şi obiectul aflat la distanţă (i.e. aceaşi
aceeaşi semnătură ca şi obiectul aflat la distanţă (i e aceaşi interfaţă)
Dar implementare diferită a metodelor:
1.Trimiterea apelului cu încapsularea parametrilor la server
2 Aşteaptă şi primeşte valoarea întoarsă de metodă
2.Aşteaptă şi primeşte valoarea întoarsă de metodă
În Java: stubul client şi alte clase sunt generate de către
instrumentul de generare extern RMIC (Remote Method Invocation
Compiler)
Other classes
Class RMIC required
q for
f
remoting
IDP – Instrumente pentru Dezvoltarea Programelor 9
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Generator de Stub
Generator de Stub
Exemplu: înmulţire de matrici la distanţă
Pseudo-cod:
IDP – Instrumente pentru Dezvoltarea Programelor 10
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
S
Scopurile Generării de Cod
il G ă ii d C d
1. Dezvoltare mai eficientă
Adaptabilitate şi refolosire
Ad bili i f l i
Controlul complexităţii
• Structură mai clară (e.g. templeturi)
• O mai bună gestiune a variantelor multiple
(e.g. parametrizare)
2. Evitarea erorilor de dezvoltare prin reducerea implicării
Evitarea erorilor de dezvoltare prin reducerea implicării
umane atunci când acest lucru nu este necesar
3. Folosire mai eficientă prin adaptabilitate (e.g. reflecţie
di
dinamică)
i ă)
4. Câştig de performanţă la runtime prin folosirea de
componente adaptate (e.g. Generarea de cod optimizat)
componente adaptate (e.g. Generarea de cod optimizat)
IDP – Instrumente pentru Dezvoltarea Programelor 11
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Siguranţa Generatoarelor
IDP – Instrumente pentru Dezvoltarea Programelor 12
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Si
Siguranţa Generatoarelor
G l
int m(String s) {
Sistemele tip pot detecta potenţiale int y = s + 1;
erori de execuţie în mod static
erori de execuţie în mod static
m(y,3);
return s;
Generatoarele sunt meta‐programe }
ce introduc noi surse de erori de
ce introduc noi surse de erori de
execuţie: erori de generare
părţi ale programului generat ce pot genera potenţial cod greşit
ce la rândul său poate cauza erori de execuţie
l â d l ă id i
Necesare noi sisteme de verificare de tip pentru detectarea părţilor
în generatoare ce pot genera potenţial cod greşit (sisteme de
verificare de tipuri pentru generatoare)
Siguranţa generatorului: proprietatea unui generator de a nu putea
genera cod greşit
genera cod greşit
Din păcate siguranţa generatoarelor de obicei nu este garantată…
IDP – Instrumente pentru Dezvoltarea Programelor 13
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
E id G
Erori de Generare
Prin verificările de tip ale ieşirii generatorului putem detecta
posibile erori de generare
Dar unele erori de generare produc cod greşit doar în cazul unor
anumiţi parametri
iţi ti
class C(String ID) {
int x; Funcţionează
ţ corect pentru
p majoritatea
j
int @ID@; ID-urilor, dar nu şi pentru “x”
} (coliziune lexicală)
Astfel de probleme îngreunează găsirea erorilor de generare
IDP – Instrumente pentru Dezvoltarea Programelor 14
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Erori de generare
Erori de generare
class C(String ID) {
void m() {
int @ID@ = 1; 1. Ieşirea e corectă doar
x++; dacă ID este egal cu
} } “x”
class C(Class T) {
@T@ x = new Button(); 2. Ieşirea este corectă
}
doar dacă T este un
doar dacă T este un
class C(String X) { supertip al lui Button
@if(X.Equals("hello")) {
String y = "world";
} 3. Ieşirea este corectă
void m() {
doar dacă X este egal
Console WriteLine(y);
Console.WriteLine(y);
} }
cu “hello”
IDP – Instrumente pentru Dezvoltarea Programelor 15
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Erori de generare
Erori de generare
class C(Type T) { 1. Corect doar dacă 1
@T@ x = 1;
}
este un element de
este un element de
tipul T
class C(Type S, Type T) {
@f
@foreach(F
h( iin S.GetFields())
i ld ()) {
@F.FieldType@ @F.FieldName@;
2. Corect doar dacă
}
void m() { p
numele de câmpuri
@foreach(F in T.GetFields()) ale lui T sunt subset
{ al numelor de
Console.WriteLine( câmpuri al lui S
câmpuri al lui S
this.@F.FieldName@);
}
} E.g. dacă T==S
}
IDP – Instrumente pentru Dezvoltarea Programelor 16
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Java Emitter Templates (JET)
IDP – Instrumente pentru Dezvoltarea Programelor 17
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
J
Java Emitter Templates (JET)
E i T l (JET)
Tehnologie de generare bazată pe templeturi
Parte a Eclipse Modeling Framework (EMF)
Parte a Eclipse Modeling Framework (EMF)
Sintaxa similară JSP‐ului (de fapt, un subset al JSP)
Idea:
1 D
1. Dezvoltatorul crează
lt t l ă templeturi
t l t i parametrizate
ti t
(fişiere text având sufixul jet)
2. Fiecare templet este tranformat într‐o clasă Java
(clasă de implementare a templetului)
3. Clasele pot fi folosite pentru a genera ceva,
e.g. cod sursă
Pot fi folosite pentru generarea oricărui tip de fişier text (nu doar cod sursă
Java))
Arguments
3. Pentru configurarea JET:
• Click dreapta pe numele proiectului în explorer‐ul de pachete;
selectare Properties
• Selectare “JET Settings”
• Al
Alegerea folderelor
f ld l pentru t
templeturi şi cod sursă Java
IDP – Instrumente pentru Dezvoltarea Programelor 19
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Generator “Hello World”
Creare Fişier Templet JET
1. Din meniu se alege File ‐> New ‐> File
2. Selectare director de templeturi ca folder părinte;
ş
numim fişierul helloworld.txtjet j
3. După OK apare mesajul de eroare: “The jet directive is missing…“; un mesaj
normal, închideţi‐l
4. Editare helloworld.txtjet
<%@ jet package="hello" class="HelloWorldTemplate" %>
Hello, world!
IDP – Instrumente pentru Dezvoltarea Programelor 20
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
F l i
Folosirea Generatorului “Hello World”
G l i “H ll W ld”
Extras din HelloWorldTemplate:
protected final String TEXT
TEXT_1
1 = NL + "Hello,
Hello, world!
world!";
;
IDP – Instrumente pentru Dezvoltarea Programelor 21
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Sumar
Generatoarele sunt programe ce pot genera anumite artefacte
Programarea generativă încearcă generarea anumitor părţi de
program, e.g. extensii de clase, proxies, interfeţe, wrappers
Cu ajutorul templeturilor ieşirea generatoarelor poate căpăta o
f
formă naturală
ă t lă
Erorile de generare sunt părţi ale programului generat ce pot fi
potenţial greşite
potenţial greşite
Java Emitter Templates (JET) este o tehnologie populară de
ggenerare pentru Eclipse
p p
IDP – Instrumente pentru Dezvoltarea Programelor 22
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
G
Generatorul “Hello World”
l “H ll W ld”
helloworld.txtjet:
<%@ jet package="hello" class="HelloWorldTemplate" %>
Hello, world!
Generare HelloWorldTemplate:
protected final String TEXT_1 = NL + " Hello, world!";
Folosire:
HelloWorldTemplate
p t = new HelloWorldTemplate();
p ();
String result = t.generate(null);
IDP – Instrumente pentru Dezvoltarea Programelor 23
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
G
Generatoare Parametrizate
P i
<%@ jet package="hello" class="HelloTemplate" %>
Hello <%=argument%>!
Hello,
Generare HelloTemplate:
protected final String TEXT_1 = "Hello, ";
protected final String TEXT_2 = "!";
public String generate(Object argument) {
final StringBuffer stringBuffer = new StringBuffer();
stringBuffer append(TEXT 1);
stringBuffer.append(TEXT_1);
stringBuffer.append(argument);
stringBuffer.append(TEXT_2);
return stringBuffer.toString();
}
Folosire:
HelloTemplate t = new HelloTemplate();
String result = t.generate("Christof");
IDP – Instrumente pentru Dezvoltarea Programelor 24
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Si
Sintaxa JET
JET
Directiva JET
<%@ jet package="hello"
package= hello class=
class="HelloTemplate"
HelloTemplate
%>
Mai multe atribute pentru…
Importarea pachetelor imports="java.io.* java.util.*"
Modificarea etichetelor JET startTag="<@" endTag="@>"
Expresii <%= argument+"xyz" %>
Scriptlets
S i tl t
<% int x=0; x++; %>
<% if (dayTime.isMorning()) {%> Good Morning
<% } else { %> Good Afternoon <% } %>
Variabile predefinite:
StringBuffer stringBuffer: ieşirea generatorului
<% stringBuffer.append("Hello again!"); %>
Object argument: parametru al metodei generate
IDP – Instrumente pentru Dezvoltarea Programelor 25
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
E
Exemple JET
l JET
IDP – Instrumente pentru Dezvoltarea Programelor 26
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
int[] sortedRandomArray(int n) {
int [] a = new int[n];
java.util.Random rnd = new java.util.Random();
f (i t i
for(int i=0;
0 i<
i<n; i++) a[i]
[i] = rnd.nextInt();
d tI t()
java.util.Arrays.sort(a);
return a;
}
}
IDP – Instrumente pentru Dezvoltarea Programelor 27
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Partial Evaluation (PE)
Folosirea unui template pentru evaluarea parţială:
<%@ jet class="ComputationTemplate" %>
public class Computation {
double x = <%=Math.sqrt(21)%>;
<% int[] a = sortedRandomArray(10000); %>
int[] a = { <%=a[0]%>
<% for(int i=1; i<a.length; i++) { %>
, <%=a[i]%>
<%}%> };
}
Ieşirea Generatorului:
public class Computation {
double x = 4.58257569495584;
int[] a = { -7, -3, 1, 4, ... };
}
IDP – Instrumente pentru Dezvoltarea Programelor 28
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
IDP – Instrumente pentru Dezvoltarea Programelor 29
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
G
Generator Factory
t F t
Dorim să generăm clase factory precum:
class CoolTheme implements Theme { Părţile
ţ albastre sunt
public JButton newJButton() { diferite de la factory
return new CoolButton(); la factory.
}
public
bli JTextField
i ld newJTextField()
i ld() { Ele reprezintă
return new CoolTextField(); parametrii noştri.
}
...
}
IDP – Instrumente pentru Dezvoltarea Programelor 30
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Generator Factory
Generator Factory
<%@ jet class="FactoryTemplate"
imports="java.lang.reflect.*" %>
<% Factory f = (Factory) argument; %>
class <%=f.className%>
implements <%=f.interf.getSimpleName()%> {
<% for(Method m : f.interf.getMethods()) { %>
<% String tname = m.getReturnType().getSimpleName();%>
public <%=tname%> new<%=tname%>() {
return new <%=f.classes.get(tname)%>();
}
<%}%>
}
public String generate(Object argument) { …
Factory f = (Factory) argument; …
for(Method m : f.interf.getMethods()) {
String tname = m.getReturnType().getSimpleName();
… stringBuffer.append(tname); …
}… }
IDP – Instrumente pentru Dezvoltarea Programelor 31
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
F l i
Folosirea Generatorului Factory
G t l iF t
import java.util.*;
import java.io.*;
...
try {
Factory f = new Factory();
f.className = "CoolTheme";
;
f.interf = Class.forName("Theme");
f.classes = new Hashtable<String, String>();
f.classes.put("JButton", "CoolButton");
f l
f.classes.put("JTextField",
t("JT tFi ld" "C"CoolTextField");
lT tFi ld")
IDP – Instrumente pentru Dezvoltarea Programelor 32
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
G
Generator Getter/Setter
G /S
Şablon comun: generarea extensiilor pentru clase existente (extensii de class)
Generarea subclasei unei clase pe care dorim să o extindem,
b l i i l d i ă i d
i.e. Generatorul primeşte superclasa ca argument
Subclasa generată poate fi folosită în locul superclasei, dar încorporează
ţ p
funcţionalitate suplimentară
Exemplul nostru:
Generarea clasei ce defineşte metodele getters/setters ale unor câmpuri ale unei superclase
Dacă câmpurile trebuie să rămână read‐only se generează doar metodele getter
Metodele getter & setter sunt una dintre principalele caracteristici ale Java Beans
IDP – Instrumente pentru Dezvoltarea Programelor 33
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Generator Getter/Setter
Generator Getter/Setter
<%@ jet class="BeanTemplate"
imports="java.lang.reflect.*" %>
<% Class c = (Class) argument; %>
class <%=c.getSimpleName()%>Bean extends <%=c.getName()%>{
<% for(Field f : c.getFields()) { %>
public <%=f.getType().getName()%>
g
get<%=f.getName().substring(0,1).toUpperCase()
g () g( , ) pp ()
+ f.getName().substring(1)%>() {
return <%=f.getName()%>;
}
<% if(!M
if(!Modifier.isFinal(f.getModifiers()))
difi i Fi l(f tM difi ())) { %>
public void
set<%=f.getName().substring(0,1).toUpperCase()
+ f.getName().substring(1)%>
g g
(<%=f.getType().getName()%> value) {
<%=f.getName()%> = value;
}
<%}%>
<%}%> }
IDP – Instrumente pentru Dezvoltarea Programelor 34
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
G
Generator de Automat cu Stări Finite
d A S ă i Fi i
Generarea de cod algoritmic customizat pentru anumite date (tailored code)
Exemplu: scanere, parsere, calcule numerice
p p
Exemplul nostru: generarea de cod pentru un Automat cu Stări Finite
pornind de la o descriere a stărilor şi tranziţiilor
Automate cu Stări Finite:
Automate cu Stări Finite:
O stare de start
Săgeţi de ieşire reprezentând posibile alternative
Alegerea unei tranziţii şi trecerea la următoarea stare
g ţ ş
Execuţia se opreşte într‐una din stările terminale
Go to Go
swimming pool Watch others dive home
0 1 3 5
Climb up Climb
diving down Ouch!!!
platform again
Jump
2 4
IDP – Instrumente pentru Dezvoltarea Programelor 35
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
G
Generator Automat cu Stări Finite
t A t t Stă i Fi it
<%@ jet class="FSMTemplate" imports="java.util.*" %>
<% FSM fsm = (FSM) argument;
i t stateNum
int t t N = 0;
0
Hashtable<State, Integer> numForState
= new Hashtable<State, Integer>();
%>
import java.io.*;
class <%=fsm.name%> {
<% for(State s : fsm.states) { %>
public void
<% if(!numForState.containsKey(s)) { %>
<%="state"+stateNum%>
<% numForState.put(s, stateNum); stateNum++; %>
<% } else { %>
<%="state"+numForState.get(s)%>
<%}%> () { /* …corpul metodei pe următorul slide… */ }
<%}%>
}
IDP – Instrumente pentru Dezvoltarea Programelor 37
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
IDP – Instrumente pentru Dezvoltarea Programelor 38
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
IDP – Instrumente pentru Dezvoltarea Programelor 39
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Folosirea ASF
Pornirea ASF-ului generat:
IDP – Instrumente pentru Dezvoltarea Programelor 40
Platformă de e‐learning și curriculă e‐content pentru
învățământul superior tehnic
Sumar
Sintaxa JET
Expresii
Scriptlets
Variabile predefinite (argument, stringBuffer)
Generatoarele pot rezolva diverse probleme
p p
Evaluarea parţială a codului programului
Suport pentru şabloane de proiectare
Generarea de extensii
Generarea de cod algoritmic customizat
Altele (e.g. generarea de interfeţe)
IDP – Instrumente pentru Dezvoltarea Programelor 41