Metaprogrammierung und Metalinguistische Abstraktion in

Transcription

Metaprogrammierung und Metalinguistische Abstraktion in
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Metaprogrammierung und Metalinguistische
Abstraktion in modernen
Programmiersprachen
Fabian Bieker
23.10.2008 - Version 0.9.6
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
• Wenn ihr Verständnisfragen habt, bitte sofort melden
• Diskusion später
• Folien sind im SE Wiki verlinked
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Abstract
• Metaprogammierung == Code der Code schreibt /
generiert
• Metalinguistische Abstraktion == Abstraktion auf
(linguistischem) Sprachniveau
• Metaprogramierung ist ein Werkzeug für Metalinguistische
Abstraktion
• In Ruby weil sehr lesbar (oder will jemand Lisp lernen?)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Abstract
• Metaprogammierung == Code der Code schreibt /
generiert
• Metalinguistische Abstraktion == Abstraktion auf
(linguistischem) Sprachniveau
• Metaprogramierung ist ein Werkzeug für Metalinguistische
Abstraktion
• In Ruby weil sehr lesbar (oder will jemand Lisp lernen?)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Gliederung
Einleitung
Abstraktion
Ruby
Metaprog.
Beispiele
Metal. Abs.
Domain Specific Language (DSL)
Java
Probleme
Optional
Unternehmen
MDA / MDSD und Meta*
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Inhalt
Einleitung
Abstraktion
Ruby
Metaprog.
Beispiele
Metal. Abs.
Domain Specific Language (DSL)
Java
Probleme
Optional
Unternehmen
MDA / MDSD und Meta*
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
• Warum Abstraktion?
Metal. Abs.
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
• “Tip 53: Abstractions Live Longer than Details”
• “Tip 38: Put Abstraction in Code, Details in Metadata”
• Quelle: The Pragrammtic Programmer (PragProg)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Abstraktion in Programmiersprachen 1
• Abstraktion durch Assembler (statt Maschinencode /
Lochkarten)
• Abstraktion durch Funktionen / Prozeduren
• Abstraktion durch Module
• Abstraktion durch APIs
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Abstraktion in Programmiersprachen 2
• Abstraktion durch OOP
• Abstraktion durch Komponenten Frameworks
• Abstraktion durch Sprache (Metalinguistische Abstraktion)
• Bsp.: “Das Ding mit einer Lampe, einem Stromanschluß,
einem Lüfter usw., das diese Präsentation projiziert” →
“Beamer”
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Abstraktion in Programmiersprachen 2
• Abstraktion durch OOP
• Abstraktion durch Komponenten Frameworks
• Abstraktion durch Sprache (Metalinguistische Abstraktion)
• Bsp.: “Das Ding mit einer Lampe, einem Stromanschluß,
einem Lüfter usw., das diese Präsentation projiziert” →
“Beamer”
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Anmerkung
• Compiler == Interpreter == Runtime Env.
• Unterscheidung zwischen Compile- und Runtime ist
unwichtig in Ruby (und erst recht in Lisp)
• nur für Laufzeitbetrachtungen relevant
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Anmerkung
• Compiler == Interpreter == Runtime Env.
• Unterscheidung zwischen Compile- und Runtime ist
unwichtig in Ruby (und erst recht in Lisp)
• nur für Laufzeitbetrachtungen relevant
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Inhalt
Einleitung
Abstraktion
Ruby
Metaprog.
Beispiele
Metal. Abs.
Domain Specific Language (DSL)
Java
Probleme
Optional
Unternehmen
MDA / MDSD und Meta*
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Ruby Grundlagen 1
• Syntax: Wie Java oder Perl . . .
• Konzepte: Smalltalk, Lisp und Perl
• Design-Ziel: “Programmers Happiness”
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Ruby Grundlagen 2
• Dynamic Typing / Duck Typing
• Alles ist ein Object ! (ausser Blocks . . . )
• Open Base Classes
• Mix-Ins
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Ruby und Java
• JRuby (Beide Hauptentwickler von Sun eingestellt)
• Groovy
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Kommentare, Arrays und Strings
# This is a one-line comment
[1,2,3,5,8] # Array
"Ruby rocks!" # String
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Methoden
def foo(a,b,c)
a + b + c # no return needed
end
> foo(1,2,3)
=> 6
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Klassen
class A
attr_reader :name # def method name()
def initialize(n) # constructor hook
@name = n
end
def foo { "foo" } # def method foo()
# def class method bar()
def self.bar { "bar" }
end
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Klassen - Methodenaufrufe
# A.new("MyName").foo()
> A.new("MyName").foo # no ’()’ needed
=> "foo"
> A.bar
=> "bar"
> A.new("MyName").name
=> "MyName"
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Einige Metaprogammierungs-Funktionen in Ruby
• attr_reader, attr_accessor, . . .
• instance_eval, class_eval, . . .
• send
• define_method
Einleitung
Ruby
Metaprog.
Metal. Abs.
Inhalt
Einleitung
Abstraktion
Ruby
Metaprog.
Beispiele
Metal. Abs.
Domain Specific Language (DSL)
Java
Probleme
Optional
Unternehmen
MDA / MDSD und Meta*
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Metaprogrammierung?
• Code der Code schreibt
• Ursprung: Lisp makros - 1958 am MIT entwickelt
• In Ruby Metaprog. u.a. über Interpreter Hooks
• z.B. method_missing, Class.inherited
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Metaprogrammierung?
• Code der Code schreibt
• Ursprung: Lisp makros - 1958 am MIT entwickelt
• In Ruby Metaprog. u.a. über Interpreter Hooks
• z.B. method_missing, Class.inherited
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
map_send - 1
• Haskell like map (+1) xs (u.a.)
• Abstraktion durch neue Sprachkonstrukte
• Ja . . . nur mittel sinnvoll, aber einfaches Bsp.
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
map_send - 1
• Haskell like map (+1) xs (u.a.)
• Abstraktion durch neue Sprachkonstrukte
• Ja . . . nur mittel sinnvoll, aber einfaches Bsp.
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
map_send - 1
• Haskell like map (+1) xs (u.a.)
• Abstraktion durch neue Sprachkonstrukte
• Ja . . . nur mittel sinnvoll, aber einfaches Bsp.
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
map_send - 2
# reopen the Enumerable module
module Enumerable
# define a public method
# usage: [1,2,3].map_send1 :+, 1
def map_send1(method, *args) # ruby varargs
map { |x| x.send method, *args }
end
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
map_send - 3
# define a public method (using define_method)
# usage: [1,2,3].map_send2 :+, 1
define_method(’map_send2’) do | method, *args |
map { |x| x.send method, *args}
end
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
map_send - 4
# define a bunch of methods - called map_send,
# each_send ...
# usage: [1,2,3].map_send :+, 1
%w[select map each collect inject].each do |method|
self.send(:define_method,
"#{method}_send") do |m, *args|
send(method) { |x| x.send(m, *args) }
end
end
end # module Enumerable
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Bsp. map_send - 5
> [1,2,3].map_send :+, 1
=> [2,3,4]
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional: Java synchronized in Ruby
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Warum? Wieso? Weshalb?
• Kritik: “Das spart doch nur Zeichen!”
• Nein - Abstraktion durch Einführung neuer
Sprachkonstrukte
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Warum? Wieso? Weshalb?
• Kritik: “Das spart doch nur Zeichen!”
• Nein - Abstraktion durch Einführung neuer
Sprachkonstrukte
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Inhalt
Einleitung
Abstraktion
Ruby
Metaprog.
Beispiele
Metal. Abs.
Domain Specific Language (DSL)
Java
Probleme
Optional
Unternehmen
MDA / MDSD und Meta*
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
SICP
• Quelle: Structure and Interpretation of Computer Programs
- 2nd Edition (SICP)
• s.
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-25.html
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
SICP über Metalingustische Abstraktion
“Metalinguistic abstraction – establishing new languages –
plays an important role in all branches of engineering design. It
is particularly important to computer programming, because in
programming not only can we formulate new languages but we
can also implement these languages by constructing
evaluators.
An evaluator (or interpreter) for a programming language is a
procedure that, when applied to an expression of the language,
performs the actions required to evaluate that expression.”
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
SICP über Metalingustische Abstraktion
“It is no exaggeration to regard this as the most fundamental
idea in programming:
The evaluator, which determines the meaning of
expressions in a programming language, is just another
program.
In fact, we can regard almost any program as the evaluator
for some language.”
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
(Sehr optimistisches) Ziel von Metalinguistischer
Abstraktion
• eval(SPEC)
• deploy(eval(SPEC))
• (if (testAndVerify(eval(SPEC)), SPEC)
(deploy(eval(SPEC)))) → everyone is happy
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
(Sehr optimistisches) Ziel von Metalinguistischer
Abstraktion
• eval(SPEC)
• deploy(eval(SPEC))
• (if (testAndVerify(eval(SPEC)), SPEC)
(deploy(eval(SPEC)))) → everyone is happy
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
(Sehr optimistisches) Ziel von Metalinguistischer
Abstraktion
• eval(SPEC)
• deploy(eval(SPEC))
• (if (testAndVerify(eval(SPEC)), SPEC)
(deploy(eval(SPEC)))) → everyone is happy
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Ziel von Metalinguistischer Abstraktion
• So was geht nicht?
• Was ist mit eval(RFC) → Protokol En-/Decoder ?
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Ziel von Metalinguistischer Abstraktion
• So was geht nicht?
• Was ist mit eval(RFC) → Protokol En-/Decoder ?
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Sprache vs. Framework
• Framework:
new CoffeeShop(”Foo”, ...).getCoffee(
new Customer(”Fabian”, ...));
• Spache:
Fabian getsCoffee @ CoffeeShop named Foo
• Vorteil: Abstraktionsgewinn
• z.B.: “Fabian ist ein Customer Objekt” ist nicht relevant
• Nachteil: Evtl. höherer Aufwand
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Sprache vs. Framework
• Framework:
new CoffeeShop(”Foo”, ...).getCoffee(
new Customer(”Fabian”, ...));
• Spache:
Fabian getsCoffee @ CoffeeShop named Foo
• Vorteil: Abstraktionsgewinn
• z.B.: “Fabian ist ein Customer Objekt” ist nicht relevant
• Nachteil: Evtl. höherer Aufwand
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Was ist eine DSL?
• DSL == Sprache um domänen-spezifische Probleme zu
lösen
• z.B.: Make oder ANT
• Zwei Arten von DSLs: eingebettet und nicht-eingebettet
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Was ist eine DSL?
• DSL == Sprache um domänen-spezifische Probleme zu
lösen
• z.B.: Make oder ANT
• Zwei Arten von DSLs: eingebettet und nicht-eingebettet
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
nicht eingebettete DSLs
• wird mit externem Parser-Generatoren (Yacc, . . . ) erzeugt
• potentziell flexibler
• mehr Aufwand bei der Impl.
• Problem: “Wir brauchen ein if - Ach, und eine
for-Schleife wäre auch gut . . . ”
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
nicht eingebettete DSLs
• wird mit externem Parser-Generatoren (Yacc, . . . ) erzeugt
• potentziell flexibler
• mehr Aufwand bei der Impl.
• Problem: “Wir brauchen ein if - Ach, und eine
for-Schleife wäre auch gut . . . ”
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
eingebettete DSLs (eDSL)
• wenig Aufwand bei der Impl.
• Rückgriff auf bereits vorhandene Sprachfeatures
• Abhängigkeit von Sprachsyntax der umgebenden Sprache
• verbreited in Ruby, Lisp, Smalltalk, Python, . . .
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Beispiele für DSLs
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Rake - Ruby Makefile DSL - 1
# [...] by Sandor Szuecs - FU Berlin
# c compiler flags CFLAGS
CFLAGS = "-Wall -pedantic [...]"
if (‘uname‘).strip.chomp=="Darwin"
ARCH = "-DMACOSX"
# linking OpenGL
GL_LIBS = "-framework OpenGL [...]"
# [...]
else
puts("unknown system, maybe windows?")
exit!
end
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Rake - Ruby Makefile DSL - 2
## rake tasks
task :default => []
task ’build:mathgl’ => [’math_opengl.o’]
desc "build all"
task "build:all" => [’build:mathgl’, [...]]
# [...]
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Ruby OCL eDSL - Quelle
• Quelle: “Building Domain-Specific Languages for
Model-Driven Development” (MDADSL)
•
http://www.computer.org/portal/web/csdl/doi/10.1109/MS.2007.13
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
OCL
context UML::Class
inv: self.attributes->forAll(attr |
attr.name == ’id’ implies
attr.type.oclKindOf(UML::Integer))
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Ruby DSL
context UML::Class do
inv(’integer-id’) do
self.attributes.forAll { |attr|
(attr.name == ’id’).implies(
attr.type.oclKindOf(UML::Integer))
}
end
end
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Inhalt
Einleitung
Abstraktion
Ruby
Metaprog.
Beispiele
Metal. Abs.
Domain Specific Language (DSL)
Java
Probleme
Optional
Unternehmen
MDA / MDSD und Meta*
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
One-Time Code Generators
• z.B.: Eclipse - Source - Generate Getters / Setters
• suboptimal
• redundanter Code
• Metainformationen gehen verloren
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
One-Time Code Generators
• z.B.: Eclipse - Source - Generate Getters / Setters
• suboptimal
• redundanter Code
• Metainformationen gehen verloren
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Java Features für Metaprogammierung
• Anotations
• Java Instrumentierung und Reflection
• Beans (?)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Optional: Metaprogammierung / Metalinguistische
Abstraktion und MDA / MDSD
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Werkzeuge für Java
• ANTLR (ANother Tool for Language Recognition)
• OAW (OpenArchitectureWare)
• MDA / MDSD Toolkit
• Sexy!
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Werkzeuge für Java - Google Code
• http://code.google.com/p/java-macros/
• “An enhancement to the JDK7 compiler (the GPL’d version)
that adds support for compile-time macros.”
• Sprich: Lisp-artige Makros für Java
• Sehr sexy!
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Optional: Metaprogammierung und Metalinguistische
Abstraktion in Unternehmen
Einleitung
Ruby
Metaprog.
Metal. Abs.
Inhalt
Einleitung
Abstraktion
Ruby
Metaprog.
Beispiele
Metal. Abs.
Domain Specific Language (DSL)
Java
Probleme
Optional
Unternehmen
MDA / MDSD und Meta*
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme und Lösungen
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Komplexität
“While I admire the cleverness and skill that hides behind C++
libraries (...), the fact remains that writing advanced template
code is devilishly hard, (...)” (RatMeta)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Komplexität - Lösungsansätze
• Verwendung bekannter Metaprog. Paradigmen / Patterns
• Lisp hat etliche zu bieten!
• In der Funktionalen Programmierung gibt es viele Patterns
(z.B. aus ALP1: higher-order functions und currying)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Abgeschlossenheit
• Metaprog. soll den selben Code erzeugen können, den
man von Hand schreiben kann (und umgekehrt)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Debuging
• Komplexe DSLs erzeugen teilweise schwer Debug-baren
Code
• Komplexe Frameworks erzeugen teilweise schwer
Debug-baren Code
• Hat jemand eine Idee für eine Lösung?
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Debuging
• Komplexe DSLs erzeugen teilweise schwer Debug-baren
Code
• Komplexe Frameworks erzeugen teilweise schwer
Debug-baren Code
• Hat jemand eine Idee für eine Lösung?
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Code als ASCII-String etc.
• Compiler kann Code nicht prüfen
• besser: Programmiersprachen-Konstrukte für Metaprog.
verwenden
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Sprachkonsistens
• Programmiersprachen-Design ist schwierig
• Das Erlernen neuer Sprachen ist aufwändig
• Der Support für Sprachen ist resourcen-intenssiv
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Sprachkonsistens - Lösungsansatz
• Also sollten die verwendeten Sprachen möglichst
konsistent sein und sich optimal in vorhandene
Sprachumgebung einpassen
• Eingebettete DSLs helfen hierbei
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
• Danke für Ihre Aufmerksamkeit!
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Diskussion
• Anregungen? Kritik?
• Was haltet Ihr von Meta* ? Benutzt Ihr das? Wofür?
• Benutzt Ihr MDA / MDSD? Wofür?
• Kennt Ihr gute Papers, Bücher oder Links?
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Quellenverzeichnis
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Quellenverzeichnis - Bücher
(SICP) “Structure and Interpretation of Computer Programs” 2nd Edition,
MIT Electrical Engineering and Computer Science,
ISBN-13: 978-0262011532
(PragProc) “The Pragrammtic Programmer”,
Addison-Wesley Longman, Amsterdam (24. November 1999),
ISBN-13: 978-0201616224
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Quellenverzeichnis - Bücher
(MatzRuby) “The Ruby Programming Language”,
David Flanagan and Yukihiro ’Matz’ Matsumoto,
O’Reilly Media, Inc. (January 25, 2008),
ISBN-13: 978-0596516178
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Quellenverzeichnis - IEEE Papers
(RatMeta) “Rational Metaprogramming”, Diomidis Spinellis,
2008, IEEE Software,
http://www.computer.org/portal/web/csdl/doi/10.1109/MS.2008.15
(MDADSL) “Building Domain-Specific Languages for
Model-Driven Development”, Jesús Sánchez Cuadrado and
Jesús García Molina, University of Murcia, September/October
2007 IEEE SOFTWARE,
http://www.computer.org/portal/web/csdl/doi/10.1109/MS.2007.135
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Quellenverzeichnis - IBM Papers
(IBM-eMetaProg) “The Art of Enterprise Metaprogramming”,
MDA, MDSD und Metaprogramming
http://www.ibm.com/developerworks/linux/library/l-metaprog3/
(IBM-MetaProg) “The Art of Metaprogramming”
http://www.ibm.com/developerworks/linux/library/lmetaprog1.html
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
• Slides:
https://page.mi.fu-berlin.de/bieker/metaprog.pdf
• Source: page.mi.fu-berlin.de -slash- bieker/metaprog
(punkd) tex
• License: CC - by-nc-sa
http://creativecommons.org/licenses/by-nc-sa/3.0
• Contact: Fabian Bieker - bieker -at- zedat . . .
Einleitung
Ruby
Metaprog.
Metal. Abs.
Inhalt
Einleitung
Abstraktion
Ruby
Metaprog.
Beispiele
Metal. Abs.
Domain Specific Language (DSL)
Java
Probleme
Optional
Unternehmen
MDA / MDSD und Meta*
Java
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Ruby - Alles ist ein Objekt
> 5.class
=> Fixnum
> 5.methods
=> ["%", "inspect", "<<", ... ]
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Ruby - Klassen, Methoden etc. sind Objekte
> 5.class
=> Fixnum
> Fixnum.class
=> Class
> Fixnum.methods
=> ["inspect", "private_class_method",
"const_missing", ... ]
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Ruby - Open Base Classes 1
class Object # reopen class Object
def foo
"foo"
end
end
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Ruby - Open Base Classes 2
> Object.new.foo
=> "foo"
> Object.foo
=> "foo"
> 5.foo
=> "foo"
> Fixnum.foo
=> "foo"
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Bsp. synchronized - 1
require ’thread’ # ruby 1.8 (Mutex in this lib)
def synchronized(o)
o.mutex.synchronize
end
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Bsp. synchronized - 2
class Object # opening class Object
def mutex
return @__mutex if @__mutex
# get mutex on class obj.
synchronized(self.class) {
@__mutex = Mutex.new # ret-val is @__mutex
}
end
end
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Bsp. synchronized - 3
# Prevent endless recursion
# Class is an object after all :)
Class.instance_eval { @__mutex = Mutex.new }
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
synchronized - 4
• Quelle: “The Ruby Programming Language” S. 282 - Matz
• (Und? Habt Ihr die (kleine) Racecondition gesehen?)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Historie 1
• ???? Selbstmodifizerender (Assembler) Code
• 1958 Lisp (Designed von John McCarthy, Impl. von Steve
Russel - MIT)
• Basiert auf lambda-calulus
• CLOS (OO-System implemeniert durch Makros)
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Historie 2
• 1969 Smalltalk (Alan Key, Xerox Park)
• Metaprogrammierung für OOP
• seit 1980 MIT Lisp Courses baseierend auf dem SICP
• 1982 Begriff DSL (definiert von James Martin in seinem
Buch “Applications Development Without Programmers”)
• Martin, James. Application Development Without
Programmers. Prentice-Hall, 1981. ISBN 0-13-038943-9.
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Historie 3
• 1990 ANTLR 1.00B released
• 1995 Ruby (Yukihiro ’Matz’ Matsumoto)
• Juli 2004 - Ruby on Rails released
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Metaprogammierung und Metalinguistische
Abstraktion in Unternehmen
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
IBM
• “The Art of Enterprise Metaprogramming”
• MDA und Metaprogramming
• http://www-128.ibm.com/developerworks/linux/library/l-
metaprog3/
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Sun
• JavaOne 2007 - Zwei Vorträge die sich u.a. mit DSLs
beschäftigen
• s. http://java.sun.com/javaone/sf/2007/javauniversity.jsp
• JRuby, Scalar ...
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Paul Graham - Viaweb
• “In 1995 he developed with Robert Morris the first
web-based application, Viaweb, which was acquired by
Yahoo in 1998.”
• http://www.paulgraham.com/bio.html
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Netzwert -> Apertio -> Nokia Siemens Networks
(NSN)
• Mobile IP AAA Server
• 3G / 3.5G / 4G / IMS Infastruktur
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
NSN - AAA Server
• Hochverfügbar und Geo-Redundant
• Massiv Parallel
• Multi-Tier
• DSL u.a. zum Konfigurieren der Buisness Logic
• Disclaimer: Ich habe zwei Jahre da gearbeited
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
BeagleSoft
• Viel Meta* / MDA / MDSD Know-How
• Kundenprojekte u.a. im BPM Bereich
• Disclaimer: Ich arbeite für BeagleSoft
Probleme
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Naughty Dog (one Lisp game project failed!)
• “Crash Bandicoot” teilweise in Lisp
• GOAL (Game Object Assembly Lisp) für Naughty Dog’s
Jax and Daxter
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Naughty Dog - Naughty Dog’s Jax and Daxter
“GOAL rocks! (...)
GOAL sucks! While it’s true that GOAL gave us many
advantages, GOAL caused us a lot of grief. A single
programmer (who could easily be one of the top ten Lisp
programmers in the world) wrote GOAL. ...”
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Naughty Dog - Naughty Dog’s Jax and Daxter
“... While he called his Lisp techniques and programming
practices ’revolutionary’, others referred to them as ’code
encryption’, since only he could understand them. Because of
this, all of the support, bug fixes, feature enhancements, and
optimizations had to come from one person, creating quite a
bottleneck. Also, it took over a year to develop the compiler,
during which time the other programmers had to make do with
missing features, odd quirks, and numerous bugs.”
Optional
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Naughty Dog - Naughty Dog’s Jax and Daxter
• Quelle: http://ynniv.com/blog/2005/12/lisp-in-games-
naughty-dogs-jax-and.html
•
http://www.gamasutra.com/features/20020710/white_02.htm
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Metaprog. / Metaling. Abstraktion und MDA / MDSD - 1
• Ähnliche Problemstellung - Ähnliche Lösungsansätze
• Graphische Rep. (UML etc.) und Textuelle Rep. (DSL)
• Graphische Rep. muss formale Sprache sein, weil
compilierbar
• Gleiche Komplexität (s. nächste Folie)
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
Probleme
Optional
Metaprog. / Metaling. Abstraktion und MDA / MDSD - 2
• Komplexität bzw. Abstraktionsniveau abhängig von der
Sprache
• Graphische Rep. kann man aber besser mit zusätzlichen
Informationen anreichern
• und diese z.B. je nach View ein- und ausblenden
Einleitung
Ruby
Metaprog.
Metal. Abs.
Java
DSLs für Domänenexperten
• Domänenexperten werden DSLs lieben
• Aber Vorsicht mit den “Edge Cases”
• Dafür braucht man “richtige” Programmier
• Quelle: (IMB-eMetaProg)
Probleme
Optional