210 likes | 309 Views
Generatív programozás. Porkoláb Zoltán ELTE Általános Számítástudományi Tanszék gsd@inf.elte.hu. ECOOP 2001. Generative Programming (Czarnecky, Eisenecker) Aspect-Oriented Programming (Gregor Kitzales) Feature Interaction in Composed Systems (Jim Coplien)
E N D
Generatív programozás Porkoláb Zoltán ELTE Általános Számítástudományi Tanszék gsd@inf.elte.hu
ECOOP 2001 Generative Programming (Czarnecky, Eisenecker) Aspect-Oriented Programming (Gregor Kitzales) Feature Interaction in Composed Systems (Jim Coplien) Advance Separation of Concerns (...) Multiparadigm Programming in OO Languages (Smaragdakis)
Generic Programming • Fordítás idejű típusellenőrzés • Automatikus példányosítás • Hatékony ( vs. Reflection ) • Egyszerű (?) • negatív variancia: template specializáció • (Paraméteres) Polymorfizmus
GP - Standard Template Library • A. Stepanov, D. Musser • ADA, C++, JAVA (Pizza, GJ, Collection) • C++ Standard Template Library • tárolók (containers) • algoritmusok • bejárók (iterators) • Az ISO C++ standard része (1997)
Standard Template Library Find Iterator Vector Merge Iterator Iterator List
GP - OO együttműködés • C++ Standard Library (!= STL) • Interfész-méret csökkentése • Template specializáció template <class CharType, class Attr=char_traits<CharType>, class Allocator=allocator<T>> class basic_string { … }; typedef basic_string<char> string;
Aspect-Oriented Programming • Probléma - gyenge modularitás: • erőforrásmegosztás • hibakezelés • hatékonyság, optimalizáció • Megoldás - a határok átlépése: • az elszórt szempontok összegyűjtése (aspect) • szövőgép (weaver) a végső kód elkészítéséhez
AOP - OO Példa Rendszerállapot vizsgálata A rendszer: public class Variable { private int v; public Variable() { v = 0; } public int getV() { return v; } public void setV(int v) { this.v = v; } }
AOP - Monitoring Cél: Minden változást írjunk ki • ne módosítsuk (kézzel) az eredeti kódot • kerüljük a futási idejű költségeket Megoldás: • producer-observer patternintrospection - metódhívások eltérítése
AOP - Aspect aspect Trace { advise * Variable.*(..) { static before { System.out.println("Entering " + thisJoinPoint.methodName + " v=" + thisObject.v); } static after { System.out.println("Exiting " + thisJoinPoint.methodName + " v=" + thisObject.v); } } }
AOP - A szövőgép public class Variable { private int v; public Variable() { v = 0; } public int getV() { int thisResult; System.out.println("Entering "+"getV"+" v="+this.v); thisResult = v; System.out.println("Exiting "+"getV"+" v="+this.v); return thisResult; } public void setV(int v) { System.out.println("Entering "+"setV"+" v="+this.v); this.v = v; System.out.println("Exiting "+"setV"+" v="+this.v); } }
AOP - OO együttműködés • Kódismétlés csökkentése • Természetes OO tervezés alkalmazható valós, nagy rendszerekre • Aspect -eket tetszőleges nyelven írhatunk • korlát: a szövőgép
Domain-specifikus nyelvek • Külső: TeX, SQL • Beágyazott: C++ template • Összeépíthető komponens: Intentional prog. Célorientált, specializált nyelv, valamely feladat megoldására
A template technika korlátai template <class T> class Container { // ... void insert( T x) { ... } void sort() { if (x < y )... } // ... }; Csak a hivatkozott template-ek példányosulnak!
Concept checking template <class T> void sort() { SortHelper< StaticIsA<T,LessThanComparable<T> >::valid>::doIt(); // ... }; Szabadon definiálható hibaüzenetek
Mixin template <class Super> class Mixin : public Super { // ... }; Bázisoszály: fordítási paraméter OO + GP együttműködése
template <class Super> class Mixin : public Super // ... }; class Base_virt { virtual void f(); }; class Base_novirt { void f(); }; Mixin<Base_virt> x; Mixin<Base_novirt> y;
template <class Graph> class Counting : public Graph { int nodes_visited, edges_visited; public: Counting():nodes_visited(0),Graph(){} node succ_node(node v) { ++nodes_visited(node v); return Graph::succ_node(v); }; edge succ_edge(edge e) { ++edges_visited(edge e); return Graph::succ_edge(e); }; };
Expression template template <int i> struct Fib { enum {RET=Fib<n-1>::RET + Fib<n-2>::RET}; }; template <> struct Fib<0> { enum {RET=0}; }; template <> struct Fib<1> { enum {RET=1}; };
Template metaprogramming • 2 szintű nyelvtan • Statikus - template • Turing-teljes nyelvet képez • Dinamikus • Lefordítja • Futtatja www.oonumerics.org Blitz++
Összegzés Régi és új paradigmák együttélése multi-paradigm programming Előnyök: • OO: kiforrott elvek, általános használhatóság, nagy-léptékű rendszerek, jó modularitás • GP: testreszabott, domain-specifikus, magasan automatizált kódgyártás