SlideShare une entreprise Scribd logo
1  sur  61
Télécharger pour lire hors ligne
Extension and Evolution
                IN4308
  Model-Driven Software Development
              Lecture 12


             Eelco Visser

    Software Engineering Research Group
        Delft University of Technology
                 Netherlands

               May 25, 2010
Conventional Software Development



   'model'
     'model'             GPL
                          GPL                'machine'
                                              'machine'
               code
                code              compile
                                   compile
  'design'
    'design'           program
                        program                code
                                                code
Conventional Software Maintenance



               understand
                understand
   'model'
     'model'                   GPL
                                GPL                      'machine'
                                                          'machine'
                                          compile
                                           compile
  'design'
    'design'                 program
                              program                      code
                                                            code
               modify
                modify




                 abstractions encoded in program
               maintenance at low level of abstraction
Model-Driven Software Development



    DSL
     DSL                         GPL
                                  GPL                       'machine'
                                                             'machine'
  program
   program     generate
                generate                     compile
                                              compile
                               program
                                program                       code
                                                               code
  (model)
   (model)




    raise the level of abstraction to a technical or application domain
        automatically generate implementation code from model
Model-Driven Software Evolution

                           modify
                            modify




      maintenance on models instead of implementation
   implementation regenerated after modification of models
What makes a good DSL?
Expressivity




expressive dsl requires (much) less code than gpl implementation
         fewer lines of code = less implementation effort
Coverage




dsl covers a subset of programs in the target language
              generator is not surjective
Completeness




incomplete code generation produces programs with holes
               to be filled in by developer
Portability


                                             C#
                                              C#
                    dsl-to-csharp
                     dsl-to-csharp




                     dsl-to-java
                      dsl-to-java
                                            Java
                                             Java




           abstract over the target domain
generate code for multiple platforms from same model
Code Quality




   does generator produce robust and correct code?
  are errors detected early in the translation pipeline?
model verification is preferable over debugging target code
DSL Engineering Dimensions

        ●   expressivity

        ●   coverage

        ●   completeness

        ●   portability

        ●   code quality

        ●   evolution
Coverage




dsl covers a subset of programs in the target language
               generator is not surjective
         not all target programs are reachable
Coverage of 'Interesting' Programs




      targeting representatives of equivalence classes
           can we reach all equivalence classes?
Program Equivalence
Many programs are the same if we
abstract over 'implementation
details'.




                    when are two programs the same?
Program Equivalence
Two programs are the same if they have the same

- behaviour
- userinterface
- effects on the database
- performance

What is the meaning of 'same'?

Abstract over non-important differences

Implementation details
(e.g. order of statements does not always matter)

Look and feel
Reasons for Lack of Coverage
Completeness
only part of the domain is covered

Example: domain model vs business logic

80/20 rule : generate 80%, write 20%


Tuning
the generated code is not exactly what is desired
Customization of Generated Code




                   modify




     not all customizations can be realized in models
         generated code may need to be adapted
Scaffolding (aka Fill in the Blanks)




   incomplete code generation produces programs with holes
                  to be filled in by developer
Scaffolding (aka Fill in the Blanks)
        Publication
         Publication

title :: String
 title    String
authors →→ List<Author>
 authors    List<Author>
journal →→ Journal
 journal    Journal               public class Publication {{
                                   public class Publication
                                    Private String _title;
                                     Private String _title;
                                    Public String getTitle() {{
                                     Public String getTitle()
citation() :: String                   Return _title;
                                        Return _title;
 citation()    String               }}
                                    Public void setTitle(x :: String) {{
                                     Public void setTitle(x    String)
                                       _title := x;
                                        _title := x;
                                    }}
                                    …… getters, setters for authors,
                                        getters, setters for authors,
                                       journal ……
                                        journal
                                    Public String citation() {{
                                     Public String citation()
                                       // fill in code
                                        // fill in code
                                    }}
'boilerplate code' is generated
'business methods' should be      }}
      filled in by developer
Scaffolding Breaks Evolution

                          modify
                           modify




             modify
              modify                      ??          ?
                                                      ?

if model and code are modified, how do we merge the results?
Protected Regions

                        modify
                         modify




             modify                   copy
              modify                   copy

             modify                   copy
              modify                   copy




          generator preserves 'protected regions'
           does not support unanticipated tuning
breaks generator encapsulation by exposing implementation
Protected Regions
public void openUserScreenShowPersons() {
    ShowPersonsScreenComposite showPersonsScreen =
        new ShowPersonsScreenComposite(mainController.getShowPerso
                                                     .getScreenPar
            this);
    /*PROTECTED REGION ID(ShowPersons_game_behavior_usecases_perso
    showPersonsScreen.personList.add("Marcy");
    showPersonsScreen.personList.add("Freddy");
    showPersonsScreen.personList.add("Mary-Anne");
    /*PROTECTED REGION END*/
    mainController.getShowPersonsScreenContainer()
                   .showScreen(showPersonsScreen);
    // next step called by gui to transition...() method
}
public void systemCallEnd() {
     /*PROTECTED REGION ID(systemCall_game_behavior_usecases_perso
     // TODO: perform activity
     mainController.getShowPersonsScreenContainer().getShell().clo
     /*PROTECTED REGION END*/
  }

Source: http://public.tfh-berlin.de/~petrasch/uploads/media/TU_MDAPetrasch_110907.pdf
Roundtrip Engineering




     modify
      modify




      extract model from modified code
 can changes to code be reflected in model?
          implies lack of abstraction
Roundtrip Engineering

                               modify
                                modify




     modify
      modify
                               preserve?
                                preserve?




      Make changes to model and code
 can changes to code be reflected in model?
        implies model/code bijection
Tuning Generated Code

"entity" Id ":" Id "{" Property* Function* "}"
                                 -> Entity {cons("Entity")}




Entity -- KW["entity"] _1 KW[":"] _2 KW["{"] _3 _4 KW["}"]




Entity -- V[V is=2[H[KW["entity"] _1 KW[":"] _2 KW["{"]]
                   _3 _4]
            KW["}"]]

   default pretty-print rules can be generated; tuning needed to get it right
      general: skeleton for user interface from data model need tuning
Customization 'From the Outside'




customization should never require direct modification of generated code
     customization code must modify/interact with generated code
       what is the interface? avoid exposing generation scheme
Customization with Partial Classes




                                                inputs




 partial class extends generated class without modifying generated files
Customization with Partial Classes
                         public partial class Publication { {
                          public partial class Publication
entity Publication { {      ////generated code; don't change
                                 generated code; don't change
 entity Publication
   Author → Author          private Author _author;
                              private Author _author;
    Author → Author
   …                        public Author getAuthor () { {
                              public Author getAuthor ()
    …
}}                             return _author;
                                return _author;
                            }}
                         }}



                         public partial class Publication { {
                          public partial class Publication
                            public String citation() { {...
                             public String citation() ...
                               if(this.getAuthor() != null) { {
                                 if(this.getAuthor() != null)
                                  cc:= cc++getAuthor().getName()
                                     :=     getAuthor().getName()
                               }}
                               ...
                                 ...
                            }}
                         }}
Evolution with Partial Classes
                    modify
                     modify




                       ??              ??


        examples: pp tables, styling
Customization with Inheritance
                               class GenPublication { {
                                class GenPublication
entity Publication { {            ////generated code; don't change
                                       generated code; don't change
 entity Publication
   Author → Author                private Author _author;
                                    private Author _author;
    Author → Author
   …                              public Author getAuthor () { {
                                    public Author getAuthor ()
    …
}}                                   return _author;
                                      return _author;
                                  }}
                               }}



                         class Publication extends GenPublication { {
                          class Publication extends GenPublication
                            public String citation() { {...
                             public String citation() ...
                               if(this.getAuthor() != null) { {
                                 if(this.getAuthor() != null)
       gen default                cc:= cc++getAuthor().getName()
                                     :=     getAuthor().getName()
                               }}
                               ...
                                 ...
                            }}
                         }}
Generate Subsystem




generated code is called from regular code
Calling Stratego from C
                                              #include <strinclude.h>
module foobar
module foobar
                                              ATerm foo_0_0(StrSL sl, Aterm t) {
strategies
 strategies                                     t = innermost_1_0(...);
                                                return t;
foo ==innermost(Foo <+ Bar)
 foo innermost(Foo <+ Bar)                    }


                                              #include “foobar.h”

                                              void main() {
                                                ATerm t = parse(file);
                                                t = foo_0_0(NUL, t);
                                                ...
                                              }


              calling convention should be fixed, implementation is hidden
Model/Code Interaction




customization code should be considered as part of the generator input
  should interact with (interface of) models, not with generated code
Built-in Types

                                     aa::::AA
                                     f(x.a)
                                      f(x.a)


            class Aimpl { {
             class Aimpl
             f() {…}
               f() {…}
            }}


                                    Aimpl a;
                                     Aimpl a;
                                    x.a.f()
                                     x.a.f()




make external code available through type abstraction to model
      built-in types capture domain-specific functionality
Built-in Types: Patch
entity PageDiff {
  page     -> Page
  next     -> PageDiff
  title    :: String
  patch    :: Patch
  created :: Date        extend entity Page {
  previous -> PageDiff   function makeChange(.., newText : WikiText,...)
  date     :: Date                : Page {
  author   -> User         PageDiff {
  version :: Int             ...
}                            patch := newText.makePatch(this.content)
                             ...
                           }
                         }
                         }
                         extend entity PageDiff {
                           function computeContent() : WikiText {
                             if (next = null) {
                               return patch.applyPatch(page.content);
                             } else {
                               return patch.applyPatch(next.content);
                             }
                           }
Foreign Function Interface

               def f f
                def                prim(f)
                                    prim(f)




                                    call f f
                                     call




 declare functions/types available in 'native' libraries
Foreign Function Interface



       epoch2local-time ==
        epoch2local-time
         ?EpochTime(t)
          ?EpochTime(t)
         ;; prim("SSL_epoch2localtime", t)
             prim("SSL_epoch2localtime", t)
         ;; prim-tuple-to-ComponentTime
             prim-tuple-to-ComponentTime




Primitives in Stratego allow calling (wrapped) native functions.
Multi Models
Multiple Models / Multiple DSLs




         split model into several models
       combine DSLs to increase coverage
Multiple Models / Multiple DSLs
               LEX
                LEX       YACC
                           YACC




                CC          CC




      LEX: lexical analysis with regular grammars
  YACC: context-free analysis with context-free grammars
Multiple Models / Multiple DSLs
        DM
         DM           UI
                       UI           AC
                                     AC




        JPA
         JPA       Servlets
                    Servlets   Checks
                                Checks




               DM: data model
               UI: user interface
              AC: access control
Model/Model Interaction




           consider models as components / modules
what is interface of a model? what is the scope of model elements
            model encapsulation; separate compilation
LEX & YACC

"PRINT" {{ return PRINT; }}
 "PRINT"      return PRINT;
[0-9]+
 [0-9]+ {{ yylval == atoi(yytext); return NUMBER; }}
              yylval    atoi(yytext); return NUMBER;
[a-z]
 [a-z]    {{ yylval == yytext[0] -- 'a'; return NAME; }}
              yylval    yytext[0]    'a'; return NAME;
        {{ ;; }}
n
 n       {{ nextline(); }}
              nextline();
t
 t       {{ ;; }}
"//".*n {{ nextline(); }}
 "//".*n     nextline();
..        {{ yyerror("illegal token"); }}
              yyerror("illegal token");



  statement:
   statement:
       designator ASSIGN expression
        designator ASSIGN expression
    || PRINT expression
        PRINT expression
    || IF expression THEN stmtseq ELSE stmtseq FI
        IF expression THEN stmtseq ELSE stmtseq FI
    || IF expression THEN stmtseq FI
        IF expression THEN stmtseq FI
    || WHILE expression DO stmtseq OD
        WHILE expression DO stmtseq OD
    ;;
Language Integration and Separation of Concerns

lexical syntax
 lexical syntax
  [a-zA-Z][a-zA-Z0-9_]* -> Id
   [a-zA-Z][a-zA-Z0-9_]* -> Id
  [a-zA-Z0-9-_]+
   [a-zA-Z0-9-_]+      -> FileName
                          -> FileName
  {FileName "/"}+
   {FileName "/"}+       -> ModuleName
                          -> ModuleName
  ~[nr]*
   ~[nr]*              -> SectionName
                          -> SectionName
context-free syntax
 context-free syntax
  "{" Statement* "}"
   "{" Statement* "}"   -> Block {cons("Block")}
                         -> Block {cons("Block")}
  Block
   Block                -> Statement
                         -> Statement
  "var" Id ":" Sort ";" -> Statement {cons("VarDecl")}
   "var" Id ":" Sort ";" -> Statement {cons("VarDecl")}
  Exp ";"
   Exp ";"              -> Statement {cons("Stat")}
                         -> Statement {cons("Stat")}
  "return" Exp ";"
   "return" Exp ";"     -> Statement {cons("Return")}
                         -> Statement {cons("Return")}
context-free syntax
 context-free syntax
  "module" ModuleName Section* -> Module {cons("Module")}
   "module" ModuleName Section* -> Module {cons("Module")}
  "imports" ModuleName
   "imports" ModuleName        -> Definition {cons("Imports")}
                                -> Definition {cons("Imports")}


              SDF integrates lexical and contex-free syntax
Language Integration and Separation of Concerns
                                                 WebDSL provides
define page topic (topic :: Topic) {{
 define page topic (topic     Topic)             separate languages for
   …… navigate(editTopic(topic)){…} ……
       navigate(editTopic(topic)){…}             different concerns.
}}                                               Language integration
define page editTopic(topic :: Topic) {{         enables verified cross-
 define page editTopic(topic     Topic)          language references.
   ……
}}

userinterface             predicate mayViewWeb(w :: Web) {{
                           predicate mayViewWeb(w     Web)
                             ((w.acl.view.length == 0)
                              ((w.acl.view.length    0)
                             || memberOf(w.acl.view))
                              || memberOf(w.acl.view))
                          }}
extend entity Topic {{    predicate mayEditWeb(w :: Web) {{
                           predicate mayEditWeb(w     Web)
 extend entity Topic         memberOf(w.acl.edit)
   acl -> ACL
    acl -> ACL                memberOf(w.acl.edit)
}}                        }}
                          rules page topic(topic :: Topic) {{
                           rules page topic(topic     Topic)
                             mayViewTopic(topic)
                              mayViewTopic(topic)
data model
                          }}
                          rules page editTopic(topic :: Topic) {{
                           rules page editTopic(topic      Topic)
                             mayEditTopic(topic)
                              mayEditTopic(topic)
                          }}
                         access control
Embedded Domain-Specific Languages




  DSL      assimilate        GPL
                              GPL       compile        'machine'
                                                        'machine'
            assimilate                   compile
  prog                     program
                            program                      code
                                                          code




                      MetaBorg (OOPSLA'04)
           DSLs for abstraction over libraries/frameworks
              fine-grained interaction with 'host' code
         language conglomerates mix DSL and GPL code
Swing Userinterface Language
    import javax.swing.*;
    import java.awt.*;

    public class Test3 {
      public static void main(String[] ps) {
        JFrame frame = frame {
           title = "Welcome!"
           content = panel of border layout {
             center = label { text = "Hello World" }
             south = panel of grid layout {
               row = {
                 button { text = "cancel" }
                 button { text = "ok"}
               }
             }
           }
        };
        frame.pack();
        frame.setVisible(true);
      }
    }
DSL with embedded GPL Code




     assimilate                 compile       'machine'
                                               'machine'
      assimilate                 compile
                                                code
                                                 code




provide GPL expressivity/coverage to complement DSL
DSL with embedded GPL Code
vexp : dexp {       $$.hi = $$.lo = $1; }
     | '(' dexp ',' dexp ')'
       { $$.lo = $2;
         $$.hi = $4;
         if( $$.lo > $$.hi ){
           printf( "interval out of ordern"                       );
           YYERROR;
         }
       }
     | dexp '*' vexp
       { $$ = vmul($1, $1, $3); }
     | vexp '/' vexp
       { if(dcheck($3)) YYERROR;
         $$ = vdiv($1.lo, $1.hi, $3); }




       Source: http://dinosaur.compilertools.net/yacc/index.html
Mixing DSLs: HQL in WebDSL


function sortedBlogEntries(b : Blog) : List<BlogEntry> {
  var entries : List<BlogEntry> :=
    select distinct e from BlogEntry as e, Blog as b
    where (b = ~b) and (e member of b._entries)
    order by e._created descending;
  return entries;
}
Evolution
evolution scenarios

       DSL
        DSL
       DSL
     program
      program
       prog
     (model)
      (model)
regular evolution

                         DSL
                          DSL                        DSL
                                                      DSL
                         DSL                         DSL
                       program
                        program      modify        program
                                                    program
                         prog         modify         prog
                       (model)
                        (model)                    (model)
                                                    (model)




     regular evolution: adapt software to new requirements
implementation simply regenerated after modification of models
language evolution

                  DSL
                   DSL
                  DSL
                program
                 program
                  prog
                (model)
                 (model)



                              evolve
                               evolve




language (syntax and/or transformations) evolve
model migration

                 DSL
                  DSL                        DSL
                                              DSL
                 DSL                         DSL
               program
                program      migrate       program
                                            program
                 prog         migrate        prog
               (model)
                (model)                    (model)
                                            (model)



                             evolve
                              evolve




language evolution requires migration of models
platform evolution

                       DSL
                        DSL                         DSL
                                                     DSL
                       DSL                          DSL
                     program
                      program                     program
                                                   program
                       prog                         prog
                     (model)
                      (model)                     (model)
                                                   (model)



                                    evolve
                                     evolve




                     evolve
                      evolve


changes in the platform requires evolution of transformations
model extraction

  DSL
   DSL                       DSL
                              DSL
  DSL                        DSL
program
 program       abstract    program
                            program
  prog          abstract     prog
(model)
 (model)                   (model)
                            (model)




           derive DSL programs from (legacy) GPL programs
abstraction evolution
                      DSL
                       DSL
                      DSL
                    program
                     program
                      prog
                    (model)
                     (model)

abstract



                      DSL
                       DSL
                      DSL
                    program
                     program
                      prog
                    (model)
                     (model)




           develop higher-level abstractions
Coupled Evolution

Data
 Data               Data
                     Data
         evolve
          evolve
model
 model              Model'
                     Model'




Data     migrate     Data'
                      Data'
 Data     migrate
Schedule
● Lab: implement your DSL

● Design 1: demonstrations Thursday and Friday

● Cases: grades coming up

● Lecture 13: Betsy Pepels from CapGemini

● Lecture 14: Johan den Haan & Michel Westrate from Mendix

Contenu connexe

Tendances

Close Encounters in MDD: when models meet code
Close Encounters in MDD: when models meet codeClose Encounters in MDD: when models meet code
Close Encounters in MDD: when models meet codelbergmans
 
PIL - A Platform Independent Language
PIL - A Platform Independent LanguagePIL - A Platform Independent Language
PIL - A Platform Independent Languagezefhemel
 
Java vs .net
Java vs .netJava vs .net
Java vs .netTech_MX
 
2010 06-24 karlsruher entwicklertag
2010 06-24 karlsruher entwicklertag2010 06-24 karlsruher entwicklertag
2010 06-24 karlsruher entwicklertagMarcel Bruch
 
Introduction to c_sharp
Introduction to c_sharpIntroduction to c_sharp
Introduction to c_sharpJayanta Basak
 
Silicon Valley Code Camp - Do you C what I C
Silicon Valley Code Camp - Do you C what I CSilicon Valley Code Camp - Do you C what I C
Silicon Valley Code Camp - Do you C what I CEmbarcadero Technologies
 
Eclipse Democamp Zurich
Eclipse Democamp ZurichEclipse Democamp Zurich
Eclipse Democamp ZurichMarcel Bruch
 
Using Model Driven Development to Easily Manage Variations in Software Define...
Using Model Driven Development to Easily Manage Variations in Software Define...Using Model Driven Development to Easily Manage Variations in Software Define...
Using Model Driven Development to Easily Manage Variations in Software Define...ADLINK Technology IoT
 
Java session08
Java session08Java session08
Java session08Niit Care
 
Comparing IDL to C++ with IDL to C++11
Comparing IDL to C++ with IDL to C++11Comparing IDL to C++ with IDL to C++11
Comparing IDL to C++ with IDL to C++11Remedy IT
 
Framework Engineering_Final
Framework Engineering_FinalFramework Engineering_Final
Framework Engineering_FinalYoungSu Son
 
Consistent Modeling Technique for Accurate Transaction Level Models
Consistent Modeling Technique for Accurate Transaction Level ModelsConsistent Modeling Technique for Accurate Transaction Level Models
Consistent Modeling Technique for Accurate Transaction Level Modelshuichenphd
 
Eclipse Code Recommenders @ MAJUG 2011
Eclipse Code Recommenders @ MAJUG 2011Eclipse Code Recommenders @ MAJUG 2011
Eclipse Code Recommenders @ MAJUG 2011Marcel Bruch
 
CORBA Programming with TAOX11/C++11 tutorial
CORBA Programming with TAOX11/C++11 tutorialCORBA Programming with TAOX11/C++11 tutorial
CORBA Programming with TAOX11/C++11 tutorialRemedy IT
 
Annotations in PHP: They Exist
Annotations in PHP: They ExistAnnotations in PHP: They Exist
Annotations in PHP: They ExistRafael Dohms
 
DWX 2013 Nuremberg
DWX 2013 NurembergDWX 2013 Nuremberg
DWX 2013 NurembergMarcel Bruch
 
Boogie 2011 Hi-Lite
Boogie 2011 Hi-LiteBoogie 2011 Hi-Lite
Boogie 2011 Hi-LiteAdaCore
 

Tendances (20)

Close Encounters in MDD: when models meet code
Close Encounters in MDD: when models meet codeClose Encounters in MDD: when models meet code
Close Encounters in MDD: when models meet code
 
PIL - A Platform Independent Language
PIL - A Platform Independent LanguagePIL - A Platform Independent Language
PIL - A Platform Independent Language
 
Unit 5
Unit 5Unit 5
Unit 5
 
Java vs .net
Java vs .netJava vs .net
Java vs .net
 
2010 06-24 karlsruher entwicklertag
2010 06-24 karlsruher entwicklertag2010 06-24 karlsruher entwicklertag
2010 06-24 karlsruher entwicklertag
 
Introduction to c_sharp
Introduction to c_sharpIntroduction to c_sharp
Introduction to c_sharp
 
Silicon Valley Code Camp - Do you C what I C
Silicon Valley Code Camp - Do you C what I CSilicon Valley Code Camp - Do you C what I C
Silicon Valley Code Camp - Do you C what I C
 
ASE01.ppt
ASE01.pptASE01.ppt
ASE01.ppt
 
Eclipse Democamp Zurich
Eclipse Democamp ZurichEclipse Democamp Zurich
Eclipse Democamp Zurich
 
Using Model Driven Development to Easily Manage Variations in Software Define...
Using Model Driven Development to Easily Manage Variations in Software Define...Using Model Driven Development to Easily Manage Variations in Software Define...
Using Model Driven Development to Easily Manage Variations in Software Define...
 
Java session08
Java session08Java session08
Java session08
 
Comparing IDL to C++ with IDL to C++11
Comparing IDL to C++ with IDL to C++11Comparing IDL to C++ with IDL to C++11
Comparing IDL to C++ with IDL to C++11
 
Framework Engineering_Final
Framework Engineering_FinalFramework Engineering_Final
Framework Engineering_Final
 
Consistent Modeling Technique for Accurate Transaction Level Models
Consistent Modeling Technique for Accurate Transaction Level ModelsConsistent Modeling Technique for Accurate Transaction Level Models
Consistent Modeling Technique for Accurate Transaction Level Models
 
Eclipse Code Recommenders @ MAJUG 2011
Eclipse Code Recommenders @ MAJUG 2011Eclipse Code Recommenders @ MAJUG 2011
Eclipse Code Recommenders @ MAJUG 2011
 
Java vs .net (beginners)
Java vs .net (beginners)Java vs .net (beginners)
Java vs .net (beginners)
 
CORBA Programming with TAOX11/C++11 tutorial
CORBA Programming with TAOX11/C++11 tutorialCORBA Programming with TAOX11/C++11 tutorial
CORBA Programming with TAOX11/C++11 tutorial
 
Annotations in PHP: They Exist
Annotations in PHP: They ExistAnnotations in PHP: They Exist
Annotations in PHP: They Exist
 
DWX 2013 Nuremberg
DWX 2013 NurembergDWX 2013 Nuremberg
DWX 2013 Nuremberg
 
Boogie 2011 Hi-Lite
Boogie 2011 Hi-LiteBoogie 2011 Hi-Lite
Boogie 2011 Hi-Lite
 

Similaire à Extension and Evolution

01 Introduction to programming
01 Introduction to programming01 Introduction to programming
01 Introduction to programmingmaznabili
 
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...Maarten Balliauw
 
Intro to Eclipse Che, by Tyler Jewell
Intro to Eclipse Che, by Tyler JewellIntro to Eclipse Che, by Tyler Jewell
Intro to Eclipse Che, by Tyler Jewelljwi11iams
 
Porting VisualWorks code to Pharo
Porting VisualWorks code to PharoPorting VisualWorks code to Pharo
Porting VisualWorks code to PharoESUG
 
(Costless) Software Abstractions for Parallel Architectures
(Costless) Software Abstractions for Parallel Architectures(Costless) Software Abstractions for Parallel Architectures
(Costless) Software Abstractions for Parallel ArchitecturesJoel Falcou
 
Android on IA devices and Intel Tools
Android on IA devices and Intel ToolsAndroid on IA devices and Intel Tools
Android on IA devices and Intel ToolsXavier Hallade
 
Android 101.pdf
Android 101.pdfAndroid 101.pdf
Android 101.pdfAbiramiB5
 
Reversing and Patching Machine Code
Reversing and Patching Machine CodeReversing and Patching Machine Code
Reversing and Patching Machine CodeTeodoro Cipresso
 
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)lennartkats
 
Introduction to c_sharp
Introduction to c_sharpIntroduction to c_sharp
Introduction to c_sharpHEM Sothon
 
Eclipse Che - A Revolutionary IDE for Distributed & Mainframe Development
Eclipse Che - A Revolutionary IDE for Distributed & Mainframe DevelopmentEclipse Che - A Revolutionary IDE for Distributed & Mainframe Development
Eclipse Che - A Revolutionary IDE for Distributed & Mainframe DevelopmentDevOps.com
 
JIT Spraying Never Dies - Bypass CFG By Leveraging WARP Shader JIT Spraying.pdf
JIT Spraying Never Dies - Bypass CFG By Leveraging WARP Shader JIT Spraying.pdfJIT Spraying Never Dies - Bypass CFG By Leveraging WARP Shader JIT Spraying.pdf
JIT Spraying Never Dies - Bypass CFG By Leveraging WARP Shader JIT Spraying.pdfSamiraKids
 
Advance Android Application Development
Advance Android Application DevelopmentAdvance Android Application Development
Advance Android Application DevelopmentRamesh Prasad
 

Similaire à Extension and Evolution (20)

Introduction to Programming Lesson 01
Introduction to Programming Lesson 01Introduction to Programming Lesson 01
Introduction to Programming Lesson 01
 
01 Introduction to programming
01 Introduction to programming01 Introduction to programming
01 Introduction to programming
 
Getting Native with NDK
Getting Native with NDKGetting Native with NDK
Getting Native with NDK
 
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
NDC Sydney 2019 - Microservices for building an IDE – The innards of JetBrain...
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
Xtext Webinar
Xtext WebinarXtext Webinar
Xtext Webinar
 
C# tutorial
C# tutorialC# tutorial
C# tutorial
 
Net core
Net coreNet core
Net core
 
Intro to Eclipse Che, by Tyler Jewell
Intro to Eclipse Che, by Tyler JewellIntro to Eclipse Che, by Tyler Jewell
Intro to Eclipse Che, by Tyler Jewell
 
Android develop guideline
Android develop guidelineAndroid develop guideline
Android develop guideline
 
Porting VisualWorks code to Pharo
Porting VisualWorks code to PharoPorting VisualWorks code to Pharo
Porting VisualWorks code to Pharo
 
(Costless) Software Abstractions for Parallel Architectures
(Costless) Software Abstractions for Parallel Architectures(Costless) Software Abstractions for Parallel Architectures
(Costless) Software Abstractions for Parallel Architectures
 
Android on IA devices and Intel Tools
Android on IA devices and Intel ToolsAndroid on IA devices and Intel Tools
Android on IA devices and Intel Tools
 
Android 101.pdf
Android 101.pdfAndroid 101.pdf
Android 101.pdf
 
Reversing and Patching Machine Code
Reversing and Patching Machine CodeReversing and Patching Machine Code
Reversing and Patching Machine Code
 
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
Domain-Specific Languages for Composable Editor Plugins (LDTA 2009)
 
Introduction to c_sharp
Introduction to c_sharpIntroduction to c_sharp
Introduction to c_sharp
 
Eclipse Che - A Revolutionary IDE for Distributed & Mainframe Development
Eclipse Che - A Revolutionary IDE for Distributed & Mainframe DevelopmentEclipse Che - A Revolutionary IDE for Distributed & Mainframe Development
Eclipse Che - A Revolutionary IDE for Distributed & Mainframe Development
 
JIT Spraying Never Dies - Bypass CFG By Leveraging WARP Shader JIT Spraying.pdf
JIT Spraying Never Dies - Bypass CFG By Leveraging WARP Shader JIT Spraying.pdfJIT Spraying Never Dies - Bypass CFG By Leveraging WARP Shader JIT Spraying.pdf
JIT Spraying Never Dies - Bypass CFG By Leveraging WARP Shader JIT Spraying.pdf
 
Advance Android Application Development
Advance Android Application DevelopmentAdvance Android Application Development
Advance Android Application Development
 

Plus de Eelco Visser

CS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term RewritingCS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term RewritingEelco Visser
 
CS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesCS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesEelco Visser
 
CS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingCS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingEelco Visser
 
CS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definitionCS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definitionEelco Visser
 
CS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionCS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionEelco Visser
 
A Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesA Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesEelco Visser
 
Declarative Type System Specification with Statix
Declarative Type System Specification with StatixDeclarative Type System Specification with Statix
Declarative Type System Specification with StatixEelco Visser
 
Compiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionCompiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionEelco Visser
 
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Eelco Visser
 
Compiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementCompiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementEelco Visser
 
Compiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersCompiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersEelco Visser
 
Compiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationCompiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationEelco Visser
 
Compiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesCompiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesEelco Visser
 
Compiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksCompiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksEelco Visser
 
Compiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisCompiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisEelco Visser
 
Compiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint ResolutionCompiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint ResolutionEelco Visser
 
Compiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type ConstraintsCompiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type ConstraintsEelco Visser
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingEelco Visser
 
Compiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisCompiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisEelco Visser
 
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingCompiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingEelco Visser
 

Plus de Eelco Visser (20)

CS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term RewritingCS4200 2019 | Lecture 5 | Transformation by Term Rewriting
CS4200 2019 | Lecture 5 | Transformation by Term Rewriting
 
CS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic ServicesCS4200 2019 | Lecture 4 | Syntactic Services
CS4200 2019 | Lecture 4 | Syntactic Services
 
CS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | ParsingCS4200 2019 | Lecture 3 | Parsing
CS4200 2019 | Lecture 3 | Parsing
 
CS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definitionCS4200 2019 | Lecture 2 | syntax-definition
CS4200 2019 | Lecture 2 | syntax-definition
 
CS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: IntroductionCS4200 2019 Lecture 1: Introduction
CS4200 2019 Lecture 1: Introduction
 
A Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation RulesA Direct Semantics of Declarative Disambiguation Rules
A Direct Semantics of Declarative Disambiguation Rules
 
Declarative Type System Specification with Statix
Declarative Type System Specification with StatixDeclarative Type System Specification with Statix
Declarative Type System Specification with Statix
 
Compiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler ConstructionCompiler Construction | Lecture 17 | Beyond Compiler Construction
Compiler Construction | Lecture 17 | Beyond Compiler Construction
 
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)Domain Specific Languages for Parallel Graph AnalytiX (PGX)
Domain Specific Languages for Parallel Graph AnalytiX (PGX)
 
Compiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory ManagementCompiler Construction | Lecture 15 | Memory Management
Compiler Construction | Lecture 15 | Memory Management
 
Compiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | InterpretersCompiler Construction | Lecture 14 | Interpreters
Compiler Construction | Lecture 14 | Interpreters
 
Compiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code GenerationCompiler Construction | Lecture 13 | Code Generation
Compiler Construction | Lecture 13 | Code Generation
 
Compiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual MachinesCompiler Construction | Lecture 12 | Virtual Machines
Compiler Construction | Lecture 12 | Virtual Machines
 
Compiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone FrameworksCompiler Construction | Lecture 11 | Monotone Frameworks
Compiler Construction | Lecture 11 | Monotone Frameworks
 
Compiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow AnalysisCompiler Construction | Lecture 10 | Data-Flow Analysis
Compiler Construction | Lecture 10 | Data-Flow Analysis
 
Compiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint ResolutionCompiler Construction | Lecture 9 | Constraint Resolution
Compiler Construction | Lecture 9 | Constraint Resolution
 
Compiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type ConstraintsCompiler Construction | Lecture 8 | Type Constraints
Compiler Construction | Lecture 8 | Type Constraints
 
Compiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type CheckingCompiler Construction | Lecture 7 | Type Checking
Compiler Construction | Lecture 7 | Type Checking
 
Compiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static AnalysisCompiler Construction | Lecture 6 | Introduction to Static Analysis
Compiler Construction | Lecture 6 | Introduction to Static Analysis
 
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term RewritingCompiler Construction | Lecture 5 | Transformation by Term Rewriting
Compiler Construction | Lecture 5 | Transformation by Term Rewriting
 

Dernier

A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality AssuranceInflectra
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfpanagenda
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Scott Andery
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 

Dernier (20)

A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance[Webinar] SpiraTest - Setting New Standards in Quality Assurance
[Webinar] SpiraTest - Setting New Standards in Quality Assurance
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdfSo einfach geht modernes Roaming fuer Notes und Nomad.pdf
So einfach geht modernes Roaming fuer Notes und Nomad.pdf
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
Enhancing User Experience - Exploring the Latest Features of Tallyman Axis Lo...
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 

Extension and Evolution

  • 1. Extension and Evolution IN4308 Model-Driven Software Development Lecture 12 Eelco Visser Software Engineering Research Group Delft University of Technology Netherlands May 25, 2010
  • 2. Conventional Software Development 'model' 'model' GPL GPL 'machine' 'machine' code code compile compile 'design' 'design' program program code code
  • 3. Conventional Software Maintenance understand understand 'model' 'model' GPL GPL 'machine' 'machine' compile compile 'design' 'design' program program code code modify modify abstractions encoded in program maintenance at low level of abstraction
  • 4. Model-Driven Software Development DSL DSL GPL GPL 'machine' 'machine' program program generate generate compile compile program program code code (model) (model) raise the level of abstraction to a technical or application domain automatically generate implementation code from model
  • 5. Model-Driven Software Evolution modify modify maintenance on models instead of implementation implementation regenerated after modification of models
  • 6. What makes a good DSL?
  • 7. Expressivity expressive dsl requires (much) less code than gpl implementation fewer lines of code = less implementation effort
  • 8. Coverage dsl covers a subset of programs in the target language generator is not surjective
  • 9. Completeness incomplete code generation produces programs with holes to be filled in by developer
  • 10. Portability C# C# dsl-to-csharp dsl-to-csharp dsl-to-java dsl-to-java Java Java abstract over the target domain generate code for multiple platforms from same model
  • 11. Code Quality does generator produce robust and correct code? are errors detected early in the translation pipeline? model verification is preferable over debugging target code
  • 12. DSL Engineering Dimensions ● expressivity ● coverage ● completeness ● portability ● code quality ● evolution
  • 13. Coverage dsl covers a subset of programs in the target language generator is not surjective not all target programs are reachable
  • 14. Coverage of 'Interesting' Programs targeting representatives of equivalence classes can we reach all equivalence classes?
  • 15. Program Equivalence Many programs are the same if we abstract over 'implementation details'. when are two programs the same?
  • 16. Program Equivalence Two programs are the same if they have the same - behaviour - userinterface - effects on the database - performance What is the meaning of 'same'? Abstract over non-important differences Implementation details (e.g. order of statements does not always matter) Look and feel
  • 17. Reasons for Lack of Coverage Completeness only part of the domain is covered Example: domain model vs business logic 80/20 rule : generate 80%, write 20% Tuning the generated code is not exactly what is desired
  • 18. Customization of Generated Code modify not all customizations can be realized in models generated code may need to be adapted
  • 19. Scaffolding (aka Fill in the Blanks) incomplete code generation produces programs with holes to be filled in by developer
  • 20. Scaffolding (aka Fill in the Blanks) Publication Publication title :: String title String authors →→ List<Author> authors List<Author> journal →→ Journal journal Journal public class Publication {{ public class Publication Private String _title; Private String _title; Public String getTitle() {{ Public String getTitle() citation() :: String Return _title; Return _title; citation() String }} Public void setTitle(x :: String) {{ Public void setTitle(x String) _title := x; _title := x; }} …… getters, setters for authors, getters, setters for authors, journal …… journal Public String citation() {{ Public String citation() // fill in code // fill in code }} 'boilerplate code' is generated 'business methods' should be }} filled in by developer
  • 21. Scaffolding Breaks Evolution modify modify modify modify ?? ? ? if model and code are modified, how do we merge the results?
  • 22. Protected Regions modify modify modify copy modify copy modify copy modify copy generator preserves 'protected regions' does not support unanticipated tuning breaks generator encapsulation by exposing implementation
  • 23. Protected Regions public void openUserScreenShowPersons() { ShowPersonsScreenComposite showPersonsScreen = new ShowPersonsScreenComposite(mainController.getShowPerso .getScreenPar this); /*PROTECTED REGION ID(ShowPersons_game_behavior_usecases_perso showPersonsScreen.personList.add("Marcy"); showPersonsScreen.personList.add("Freddy"); showPersonsScreen.personList.add("Mary-Anne"); /*PROTECTED REGION END*/ mainController.getShowPersonsScreenContainer() .showScreen(showPersonsScreen); // next step called by gui to transition...() method } public void systemCallEnd() { /*PROTECTED REGION ID(systemCall_game_behavior_usecases_perso // TODO: perform activity mainController.getShowPersonsScreenContainer().getShell().clo /*PROTECTED REGION END*/ } Source: http://public.tfh-berlin.de/~petrasch/uploads/media/TU_MDAPetrasch_110907.pdf
  • 24. Roundtrip Engineering modify modify extract model from modified code can changes to code be reflected in model? implies lack of abstraction
  • 25. Roundtrip Engineering modify modify modify modify preserve? preserve? Make changes to model and code can changes to code be reflected in model? implies model/code bijection
  • 26. Tuning Generated Code "entity" Id ":" Id "{" Property* Function* "}" -> Entity {cons("Entity")} Entity -- KW["entity"] _1 KW[":"] _2 KW["{"] _3 _4 KW["}"] Entity -- V[V is=2[H[KW["entity"] _1 KW[":"] _2 KW["{"]] _3 _4] KW["}"]] default pretty-print rules can be generated; tuning needed to get it right general: skeleton for user interface from data model need tuning
  • 27. Customization 'From the Outside' customization should never require direct modification of generated code customization code must modify/interact with generated code what is the interface? avoid exposing generation scheme
  • 28. Customization with Partial Classes inputs partial class extends generated class without modifying generated files
  • 29. Customization with Partial Classes public partial class Publication { { public partial class Publication entity Publication { { ////generated code; don't change generated code; don't change entity Publication Author → Author private Author _author; private Author _author; Author → Author … public Author getAuthor () { { public Author getAuthor () … }} return _author; return _author; }} }} public partial class Publication { { public partial class Publication public String citation() { {... public String citation() ... if(this.getAuthor() != null) { { if(this.getAuthor() != null) cc:= cc++getAuthor().getName() := getAuthor().getName() }} ... ... }} }}
  • 30. Evolution with Partial Classes modify modify ?? ?? examples: pp tables, styling
  • 31. Customization with Inheritance class GenPublication { { class GenPublication entity Publication { { ////generated code; don't change generated code; don't change entity Publication Author → Author private Author _author; private Author _author; Author → Author … public Author getAuthor () { { public Author getAuthor () … }} return _author; return _author; }} }} class Publication extends GenPublication { { class Publication extends GenPublication public String citation() { {... public String citation() ... if(this.getAuthor() != null) { { if(this.getAuthor() != null) gen default cc:= cc++getAuthor().getName() := getAuthor().getName() }} ... ... }} }}
  • 32. Generate Subsystem generated code is called from regular code
  • 33. Calling Stratego from C #include <strinclude.h> module foobar module foobar ATerm foo_0_0(StrSL sl, Aterm t) { strategies strategies t = innermost_1_0(...); return t; foo ==innermost(Foo <+ Bar) foo innermost(Foo <+ Bar) } #include “foobar.h” void main() { ATerm t = parse(file); t = foo_0_0(NUL, t); ... } calling convention should be fixed, implementation is hidden
  • 34. Model/Code Interaction customization code should be considered as part of the generator input should interact with (interface of) models, not with generated code
  • 35. Built-in Types aa::::AA f(x.a) f(x.a) class Aimpl { { class Aimpl f() {…} f() {…} }} Aimpl a; Aimpl a; x.a.f() x.a.f() make external code available through type abstraction to model built-in types capture domain-specific functionality
  • 36. Built-in Types: Patch entity PageDiff { page -> Page next -> PageDiff title :: String patch :: Patch created :: Date extend entity Page { previous -> PageDiff function makeChange(.., newText : WikiText,...) date :: Date : Page { author -> User PageDiff { version :: Int ... } patch := newText.makePatch(this.content) ... } } } extend entity PageDiff { function computeContent() : WikiText { if (next = null) { return patch.applyPatch(page.content); } else { return patch.applyPatch(next.content); } }
  • 37. Foreign Function Interface def f f def prim(f) prim(f) call f f call declare functions/types available in 'native' libraries
  • 38. Foreign Function Interface epoch2local-time == epoch2local-time ?EpochTime(t) ?EpochTime(t) ;; prim("SSL_epoch2localtime", t) prim("SSL_epoch2localtime", t) ;; prim-tuple-to-ComponentTime prim-tuple-to-ComponentTime Primitives in Stratego allow calling (wrapped) native functions.
  • 40. Multiple Models / Multiple DSLs split model into several models combine DSLs to increase coverage
  • 41. Multiple Models / Multiple DSLs LEX LEX YACC YACC CC CC LEX: lexical analysis with regular grammars YACC: context-free analysis with context-free grammars
  • 42. Multiple Models / Multiple DSLs DM DM UI UI AC AC JPA JPA Servlets Servlets Checks Checks DM: data model UI: user interface AC: access control
  • 43. Model/Model Interaction consider models as components / modules what is interface of a model? what is the scope of model elements model encapsulation; separate compilation
  • 44. LEX & YACC "PRINT" {{ return PRINT; }} "PRINT" return PRINT; [0-9]+ [0-9]+ {{ yylval == atoi(yytext); return NUMBER; }} yylval atoi(yytext); return NUMBER; [a-z] [a-z] {{ yylval == yytext[0] -- 'a'; return NAME; }} yylval yytext[0] 'a'; return NAME; {{ ;; }} n n {{ nextline(); }} nextline(); t t {{ ;; }} "//".*n {{ nextline(); }} "//".*n nextline(); .. {{ yyerror("illegal token"); }} yyerror("illegal token"); statement: statement: designator ASSIGN expression designator ASSIGN expression || PRINT expression PRINT expression || IF expression THEN stmtseq ELSE stmtseq FI IF expression THEN stmtseq ELSE stmtseq FI || IF expression THEN stmtseq FI IF expression THEN stmtseq FI || WHILE expression DO stmtseq OD WHILE expression DO stmtseq OD ;;
  • 45. Language Integration and Separation of Concerns lexical syntax lexical syntax [a-zA-Z][a-zA-Z0-9_]* -> Id [a-zA-Z][a-zA-Z0-9_]* -> Id [a-zA-Z0-9-_]+ [a-zA-Z0-9-_]+ -> FileName -> FileName {FileName "/"}+ {FileName "/"}+ -> ModuleName -> ModuleName ~[nr]* ~[nr]* -> SectionName -> SectionName context-free syntax context-free syntax "{" Statement* "}" "{" Statement* "}" -> Block {cons("Block")} -> Block {cons("Block")} Block Block -> Statement -> Statement "var" Id ":" Sort ";" -> Statement {cons("VarDecl")} "var" Id ":" Sort ";" -> Statement {cons("VarDecl")} Exp ";" Exp ";" -> Statement {cons("Stat")} -> Statement {cons("Stat")} "return" Exp ";" "return" Exp ";" -> Statement {cons("Return")} -> Statement {cons("Return")} context-free syntax context-free syntax "module" ModuleName Section* -> Module {cons("Module")} "module" ModuleName Section* -> Module {cons("Module")} "imports" ModuleName "imports" ModuleName -> Definition {cons("Imports")} -> Definition {cons("Imports")} SDF integrates lexical and contex-free syntax
  • 46. Language Integration and Separation of Concerns WebDSL provides define page topic (topic :: Topic) {{ define page topic (topic Topic) separate languages for …… navigate(editTopic(topic)){…} …… navigate(editTopic(topic)){…} different concerns. }} Language integration define page editTopic(topic :: Topic) {{ enables verified cross- define page editTopic(topic Topic) language references. …… }} userinterface predicate mayViewWeb(w :: Web) {{ predicate mayViewWeb(w Web) ((w.acl.view.length == 0) ((w.acl.view.length 0) || memberOf(w.acl.view)) || memberOf(w.acl.view)) }} extend entity Topic {{ predicate mayEditWeb(w :: Web) {{ predicate mayEditWeb(w Web) extend entity Topic memberOf(w.acl.edit) acl -> ACL acl -> ACL memberOf(w.acl.edit) }} }} rules page topic(topic :: Topic) {{ rules page topic(topic Topic) mayViewTopic(topic) mayViewTopic(topic) data model }} rules page editTopic(topic :: Topic) {{ rules page editTopic(topic Topic) mayEditTopic(topic) mayEditTopic(topic) }} access control
  • 47. Embedded Domain-Specific Languages DSL assimilate GPL GPL compile 'machine' 'machine' assimilate compile prog program program code code MetaBorg (OOPSLA'04) DSLs for abstraction over libraries/frameworks fine-grained interaction with 'host' code language conglomerates mix DSL and GPL code
  • 48. Swing Userinterface Language import javax.swing.*; import java.awt.*; public class Test3 { public static void main(String[] ps) { JFrame frame = frame { title = "Welcome!" content = panel of border layout { center = label { text = "Hello World" } south = panel of grid layout { row = { button { text = "cancel" } button { text = "ok"} } } } }; frame.pack(); frame.setVisible(true); } }
  • 49. DSL with embedded GPL Code assimilate compile 'machine' 'machine' assimilate compile code code provide GPL expressivity/coverage to complement DSL
  • 50. DSL with embedded GPL Code vexp : dexp { $$.hi = $$.lo = $1; } | '(' dexp ',' dexp ')' { $$.lo = $2; $$.hi = $4; if( $$.lo > $$.hi ){ printf( "interval out of ordern" ); YYERROR; } } | dexp '*' vexp { $$ = vmul($1, $1, $3); } | vexp '/' vexp { if(dcheck($3)) YYERROR; $$ = vdiv($1.lo, $1.hi, $3); } Source: http://dinosaur.compilertools.net/yacc/index.html
  • 51. Mixing DSLs: HQL in WebDSL function sortedBlogEntries(b : Blog) : List<BlogEntry> { var entries : List<BlogEntry> := select distinct e from BlogEntry as e, Blog as b where (b = ~b) and (e member of b._entries) order by e._created descending; return entries; }
  • 53. evolution scenarios DSL DSL DSL program program prog (model) (model)
  • 54. regular evolution DSL DSL DSL DSL DSL DSL program program modify program program prog modify prog (model) (model) (model) (model) regular evolution: adapt software to new requirements implementation simply regenerated after modification of models
  • 55. language evolution DSL DSL DSL program program prog (model) (model) evolve evolve language (syntax and/or transformations) evolve
  • 56. model migration DSL DSL DSL DSL DSL DSL program program migrate program program prog migrate prog (model) (model) (model) (model) evolve evolve language evolution requires migration of models
  • 57. platform evolution DSL DSL DSL DSL DSL DSL program program program program prog prog (model) (model) (model) (model) evolve evolve evolve evolve changes in the platform requires evolution of transformations
  • 58. model extraction DSL DSL DSL DSL DSL DSL program program abstract program program prog abstract prog (model) (model) (model) (model) derive DSL programs from (legacy) GPL programs
  • 59. abstraction evolution DSL DSL DSL program program prog (model) (model) abstract DSL DSL DSL program program prog (model) (model) develop higher-level abstractions
  • 60. Coupled Evolution Data Data Data Data evolve evolve model model Model' Model' Data migrate Data' Data' Data migrate
  • 61. Schedule ● Lab: implement your DSL ● Design 1: demonstrations Thursday and Friday ● Cases: grades coming up ● Lecture 13: Betsy Pepels from CapGemini ● Lecture 14: Johan den Haan & Michel Westrate from Mendix