Practical Models
   in Practice
   www.lukas-renggli.ch
Practical Models of
Models in Practice
    www.lukas-renggli.ch
Practical Meta-
Models in Practice
    www.lukas-renggli.ch
Lukas Renggli
‣ Software Engineer at Google
 YouTube Video Analytics

‣ SCG Alumni
 Bachelor, Master and PhD

‣ Open-Source Communities
 Seaside, Magritte and Pier
 Helvetia, PetitParser
Roadmap
1. Protocol Buffers
   Meta-data model for serialization
2. Magritte
   Meta-model for generic services
3. Google Web Toolkit
   Model-driven web architecture
4. Helvetia
   Meta-model for programming languages
Protocol Buffers
Meta-data model for serialization
Protocol Buffers

‣ Encode structured data
‣ Language-neutral
‣ Platform-neutral
‣ Extensible
‣ Efficient
Protocol Buffer IDL

message Person {
  required int32 id = 1;
  required string name = 2;
  optional string email = 3;
}
message Person {
  required int32 id = 1;
  required string name = 2;
  optional string email = 3;
}




         protoc




                               C++
Serialize in C++


Person person;
person.set_name("John Doe");
person.set_id(1234);
person.set_email("jdoe@example.com");

fstream output("myfile", ios::out | ios::binary);
person.SerializeToOstream(&output);
Deserialize in Python


file = open("myfile", "rb")
person = Person()
person.ParseFromString(file.read())
file.close

print "Name: ", person.name
print "E-mail: ", person.email
Demo
Why not XML/JSON?

‣ Protocol Buffers are
 – 3—10 times smaller
 – 20—100 times faster
 – consistent code generators
 – less ambiguous
 – evolvable
message Person {               message Person {
  required int32 id = 1;         required int32 id = 1;
  required string name = 2;      required string name = 2;
  optional string email = 3;     repeated string email = 3;
}                                repeated Phone phone = 4;
                               }




                                          :Person
          :Person
                                         :Person
‣ Describe your data once, and use it
  across platforms and languages
‣ Evolution supported by design
‣ Used at Google for almost all
 – data storage (file formats, database)
 – remote procedure protocols (RPC)
Magritte
Meta-model for generic services
Address Object


               :Address
    street = 'Schützenmattstrasse'
    plz = 3012
    place = 'Bern'
    canton = 'Bern'
Address Class


           :Address                        Address
street = 'Schützenmattstrasse'   class street: String
plz = 3012                             plz: Integer
place = 'Bern'                         place: String
canton = 'Bern'                        canton: String
Address Description

                                 Magritte                                 :StringDescription
                                                                   label = 'Street'

                                                                         :NumberDescription
                                                                   label = 'PLZ'
                                                                   required = true
           :Address                                                range = 1000..9999
street = 'Schützenmattstrasse'   description                              :StringDescription
                                                  :Container
plz = 3012                                                         label = 'Place'
                                               label = 'Address'
place = 'Bern'                                                     required = true
canton = 'Bern'
                                                                      :SingleOptionDescription
                                                                   label = 'Canton'
                                                                   required = true
                                                                   sorted = true
                                                                   options = #( 'Bern' 'Zurich' ... )
User Interfaces
result := anAddress asMorph
	 addButtons;
	 addWindow;
	 callInWorld
Web Interfaces
result := self call: (anAddress asComponent
	 addValidatedForm;
	 yourself)


                                 *

                                 *

                             *
Other Services
                    Reports
Viewers                                    Filtering
          Editors        Validation


Serialization                      Initialization
                 Indexing
      Copying             Initialization


   Extension                  Customization
                Adaptation
Meta-
              Metamodel




            <described-by>



              Metamodel



Developer
            <described-by>



            Domain Model



End User
Meta-
  Metamodel




<described-by>



  Metamodel


                  Magritte
                 Developer
<described-by>



Domain Model


                 Magritte
                 End User
Run- t im e

 Adaptive
Object Model
End users
customizability
Demo
Magritte

‣ Very powerful and flexible
‣ Runtime adaptive code
‣ End-user programmable code
‣ Can cause meta meta-confusion
‣ Can be slower than hardcoding
Google Web Toolkit
  Model-driven web architecture
Is this really a model?
    public class Main implements EntryPoint {
      public void onModuleLoad() {
        Label label = new Label(“Hello World”);
        RootPanel.add(label);
      }
    }
Is this really a model?
      public class Main implements EntryPoint {
        public void onModuleLoad() {
          Label label = new Label(“Hello World”);
          RootPanel.add(label);
        }
      }




High-level
 Widgets
Is this really a model?
      public class Main implements EntryPoint {
        public void onModuleLoad() {
          Label label = new Label(“Hello World”);
          RootPanel.add(label);
        }
      }




High-level                                    Description
 Widgets                                      Language
public class Main implements EntryPoint {
  public void onModuleLoad() {                platform
    Label label = new Label(“Hello World”);
    RootPanel.add(label);                     independent
  }
}                                             model



                                              model
                                              transformation
Transformation
            Mozilla   Chrome   Safari   IE   ...

 English

French

German

      ...
GWT

‣ Write JavaScript using a high-level widget
  library in a well defined (statically typed)
  language
‣ Translate and optimize code towards
  specific browsers
‣ Debugging actually works nowadays
He vetia
         Helvetia
Meta-model for programming languages
Programming
  Language
    Model
ID	
  ::=	
  letter	
  {	
  letter	
  |	
  digit	
  }	
  ;




              a..z                 a..z
                                  0..9
scanIdentifier
	 self step.	
	 ((currentCharacter between: $A and: $Z) or:
[ currentCharacter between: $a and: $z ]) ifTrue: [
	 	 [ self recordMatch: #IDENTIFIER.
	 	 self step.
	 	 (currentCharacter between: $0 and: $9)
or: [ (currentCharacter between: $A and: $Z) or:
[ currentCharacter between: $a and: $z ] ] ]
  	 	 	 whileTrue.
     	 ^ self reportLastMatch ]
#(	#[1 0 9 0 25 0 13 0 34 0 17 0 40 0 21 0 41]
	 #[1 0 9 0 25 0 13 0 34 0 93 0 76 0 157 0 112]
	 #[1 2 38 0 21 2 38 0 25 2 38 0 26 0 13 0 34]
 	 #[0 1 154 0 16 0 21 0 25 0 26 0 34 0 40 0 41]
 	 #[0 1 210 0 76 0 81]
 	 #[0 1 214 0 76 0 81]
 	 #[1 0 173 0 76 0 177 0 81]
 	 #[0 1 134 0 16 0 21 0 25 0 26 0 34 0 40 0 41]
 	 #[1 1 46 0 21 1 46 0 25 1 46 0 26 1 69]
 
 #[1 1 54 0 21 1 54 0 25 1 54 0 26 1 54 0 34]
 
 #[0 2 102 0 21 0 25 0 26 0 34 0 40 0 41 0 76]
	 #[0 2 50 0 21 0 25 0 26 0 76 0 79]
	 #[1 1 13 0 76 2 85 0 124 1 21 0 125]
	 #[1 2 89 0 17 2 30 0 21 2 30 0 82]
	 #[1 2 93 0 21 2 97 0 82] )
ID	
  ::=	
  letter	
  {	
  letter	
  |	
  digit	
  }	
  ;




              a..z                 a..z
                                  0..9




                            44
ID	
  ::=	
  letter	
  {	
  letter	
  |	
  digit	
  }	
  ;


                    sequence

             letter              many

                                 choice

                         letter      digit


                            45
Extensible        sequence

             letter          many        Composable

                             choice
Transformable
                      letter     digit

                                Customizable
                        46
Editors                                    Code
                                              Highlighting

Contextual
                   He vetia
 Menus                                           Custom
                     sequence                   Inspector
Navigation
                letter            many              Search

   Code                           choice
                                                    Error
  Folding
                                                  Correction
                           letter     digit
      Code
    Expansion                                   Debuggers
                         Refactorings
                             47
Demo
He vetia
‣ Grammar is the meta-model
‣ Composable programming languages
‣ Extensible programming languages
‣ Tooling is built around the grammar
Structural    Behavioral
            Model         Model


Run-time
 Static
Run-time
Adaptive




                        He vetia
“Meta-models are the enablers of
practical software development.”

                               He vetia

        www.lukas-renggli.ch

Practical Models in Practice

  • 1.
    Practical Models in Practice www.lukas-renggli.ch
  • 2.
    Practical Models of Modelsin Practice www.lukas-renggli.ch
  • 3.
    Practical Meta- Models inPractice www.lukas-renggli.ch
  • 4.
    Lukas Renggli ‣ SoftwareEngineer at Google YouTube Video Analytics ‣ SCG Alumni Bachelor, Master and PhD ‣ Open-Source Communities Seaside, Magritte and Pier Helvetia, PetitParser
  • 5.
    Roadmap 1. Protocol Buffers Meta-data model for serialization 2. Magritte Meta-model for generic services 3. Google Web Toolkit Model-driven web architecture 4. Helvetia Meta-model for programming languages
  • 6.
  • 7.
    Protocol Buffers ‣ Encodestructured data ‣ Language-neutral ‣ Platform-neutral ‣ Extensible ‣ Efficient
  • 8.
    Protocol Buffer IDL messagePerson {   required int32 id = 1;   required string name = 2;   optional string email = 3; }
  • 9.
    message Person {  required int32 id = 1;   required string name = 2;   optional string email = 3; } protoc C++
  • 10.
    Serialize in C++ Personperson; person.set_name("John Doe"); person.set_id(1234); person.set_email("jdoe@example.com"); fstream output("myfile", ios::out | ios::binary); person.SerializeToOstream(&output);
  • 11.
    Deserialize in Python file= open("myfile", "rb") person = Person() person.ParseFromString(file.read()) file.close print "Name: ", person.name print "E-mail: ", person.email
  • 12.
  • 13.
    Why not XML/JSON? ‣Protocol Buffers are – 3—10 times smaller – 20—100 times faster – consistent code generators – less ambiguous – evolvable
  • 14.
    message Person { message Person {   required int32 id = 1;   required int32 id = 1;   required string name = 2;   required string name = 2;   optional string email = 3;   repeated string email = 3; } repeated Phone phone = 4; } :Person :Person :Person
  • 15.
    ‣ Describe yourdata once, and use it across platforms and languages ‣ Evolution supported by design ‣ Used at Google for almost all – data storage (file formats, database) – remote procedure protocols (RPC)
  • 16.
  • 17.
    Address Object :Address street = 'Schützenmattstrasse' plz = 3012 place = 'Bern' canton = 'Bern'
  • 18.
    Address Class :Address Address street = 'Schützenmattstrasse' class street: String plz = 3012 plz: Integer place = 'Bern' place: String canton = 'Bern' canton: String
  • 19.
    Address Description Magritte :StringDescription label = 'Street' :NumberDescription label = 'PLZ' required = true :Address range = 1000..9999 street = 'Schützenmattstrasse' description :StringDescription :Container plz = 3012 label = 'Place' label = 'Address' place = 'Bern' required = true canton = 'Bern' :SingleOptionDescription label = 'Canton' required = true sorted = true options = #( 'Bern' 'Zurich' ... )
  • 20.
    User Interfaces result :=anAddress asMorph addButtons; addWindow; callInWorld
  • 21.
    Web Interfaces result :=self call: (anAddress asComponent addValidatedForm; yourself) * * *
  • 22.
    Other Services Reports Viewers Filtering Editors Validation Serialization Initialization Indexing Copying Initialization Extension Customization Adaptation
  • 23.
    Meta- Metamodel <described-by> Metamodel Developer <described-by> Domain Model End User
  • 24.
    Meta- Metamodel <described-by> Metamodel Magritte Developer <described-by> Domain Model Magritte End User
  • 25.
    Run- t ime Adaptive Object Model
  • 26.
  • 27.
  • 28.
    Magritte ‣ Very powerfuland flexible ‣ Runtime adaptive code ‣ End-user programmable code ‣ Can cause meta meta-confusion ‣ Can be slower than hardcoding
  • 29.
    Google Web Toolkit Model-driven web architecture
  • 30.
    Is this reallya model? public class Main implements EntryPoint { public void onModuleLoad() { Label label = new Label(“Hello World”); RootPanel.add(label); } }
  • 31.
    Is this reallya model? public class Main implements EntryPoint { public void onModuleLoad() { Label label = new Label(“Hello World”); RootPanel.add(label); } } High-level Widgets
  • 32.
    Is this reallya model? public class Main implements EntryPoint { public void onModuleLoad() { Label label = new Label(“Hello World”); RootPanel.add(label); } } High-level Description Widgets Language
  • 33.
    public class Mainimplements EntryPoint { public void onModuleLoad() { platform Label label = new Label(“Hello World”); RootPanel.add(label); independent } } model model transformation
  • 34.
    Transformation Mozilla Chrome Safari IE ... English French German ...
  • 35.
    GWT ‣ Write JavaScriptusing a high-level widget library in a well defined (statically typed) language ‣ Translate and optimize code towards specific browsers ‣ Debugging actually works nowadays
  • 36.
    He vetia Helvetia Meta-model for programming languages
  • 40.
  • 41.
    ID  ::=  letter  {  letter  |  digit  }  ; a..z a..z 0..9
  • 42.
    scanIdentifier self step. ((currentCharacter between: $A and: $Z) or: [ currentCharacter between: $a and: $z ]) ifTrue: [ [ self recordMatch: #IDENTIFIER. self step. (currentCharacter between: $0 and: $9) or: [ (currentCharacter between: $A and: $Z) or: [ currentCharacter between: $a and: $z ] ] ] whileTrue. ^ self reportLastMatch ]
  • 43.
    #( #[1 0 90 25 0 13 0 34 0 17 0 40 0 21 0 41] #[1 0 9 0 25 0 13 0 34 0 93 0 76 0 157 0 112] #[1 2 38 0 21 2 38 0 25 2 38 0 26 0 13 0 34] #[0 1 154 0 16 0 21 0 25 0 26 0 34 0 40 0 41] #[0 1 210 0 76 0 81] #[0 1 214 0 76 0 81] #[1 0 173 0 76 0 177 0 81] #[0 1 134 0 16 0 21 0 25 0 26 0 34 0 40 0 41] #[1 1 46 0 21 1 46 0 25 1 46 0 26 1 69] #[1 1 54 0 21 1 54 0 25 1 54 0 26 1 54 0 34] #[0 2 102 0 21 0 25 0 26 0 34 0 40 0 41 0 76] #[0 2 50 0 21 0 25 0 26 0 76 0 79] #[1 1 13 0 76 2 85 0 124 1 21 0 125] #[1 2 89 0 17 2 30 0 21 2 30 0 82] #[1 2 93 0 21 2 97 0 82] )
  • 44.
    ID  ::=  letter  {  letter  |  digit  }  ; a..z a..z 0..9 44
  • 45.
    ID  ::=  letter  {  letter  |  digit  }  ; sequence letter many choice letter digit 45
  • 46.
    Extensible sequence letter many Composable choice Transformable letter digit Customizable 46
  • 47.
    Editors Code Highlighting Contextual He vetia Menus Custom sequence Inspector Navigation letter many Search Code choice Error Folding Correction letter digit Code Expansion Debuggers Refactorings 47
  • 48.
  • 49.
    He vetia ‣ Grammaris the meta-model ‣ Composable programming languages ‣ Extensible programming languages ‣ Tooling is built around the grammar
  • 50.
    Structural Behavioral Model Model Run-time Static Run-time Adaptive He vetia
  • 51.
    “Meta-models are theenablers of practical software development.” He vetia www.lukas-renggli.ch