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