際際滷

際際滷Share a Scribd company logo
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 Bu鍖ers
   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 Bu鍖ers
Meta-data model for serialization
Protocol Bu鍖ers

 Encode structured data
 Language-neutral
 Platform-neutral
 Extensible
 E鍖cient
Protocol Bu鍖er 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 Bu鍖ers are
  310 times smaller
  20100 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 (鍖le 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 鍖exible
 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 de鍖ned (statically typed)
  language
 Translate and optimize code towards
  speci鍖c browsers
 Debugging actually works nowadays
He vetia
         Helvetia
Meta-model for programming languages
Practical Models in Practice
Practical Models in Practice
Practical Models in Practice
Programming
  Language
    Model
ID	
 ::=	
 letter	
 {	
 letter	
 |	
 digit	
 }	
 ;




              a..z                 a..z
                                  0..9
scanIdenti鍖er
	 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

More Related Content

Practical Models in Practice

  • 1. Practical Models in Practice www.lukas-renggli.ch
  • 2. Practical Models of Models in Practice www.lukas-renggli.ch
  • 3. Practical Meta- Models in Practice www.lukas-renggli.ch
  • 4. Lukas Renggli Software Engineer at Google YouTube Video Analytics SCG Alumni Bachelor, Master and PhD Open-Source Communities Seaside, Magritte and Pier Helvetia, PetitParser
  • 5. Roadmap 1. Protocol Bu鍖ers 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
  • 7. Protocol Bu鍖ers Encode structured data Language-neutral Platform-neutral Extensible E鍖cient
  • 8. Protocol Bu鍖er IDL message Person { 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++ 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);
  • 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. Demo
  • 13. Why not XML/JSON? Protocol Bu鍖ers are 310 times smaller 20100 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 your data once, and use it across platforms and languages Evolution supported by design Used at Google for almost all data storage (鍖le formats, database) remote procedure protocols (RPC)
  • 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 im e Adaptive Object Model
  • 27. Demo
  • 28. Magritte Very powerful and 鍖exible 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 really a model? public class Main implements EntryPoint { public void onModuleLoad() { Label label = new Label(Hello World); RootPanel.add(label); } }
  • 31. 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
  • 32. 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
  • 33. public class Main implements 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 JavaScript using a high-level widget library in a well de鍖ned (statically typed) language Translate and optimize code towards speci鍖c browsers Debugging actually works nowadays
  • 36. He vetia Helvetia Meta-model for programming languages
  • 41. ID ::= letter { letter | digit } ; a..z a..z 0..9
  • 42. scanIdenti鍖er 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 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] )
  • 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. Demo
  • 49. He vetia Grammar is 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 the enablers of practical software development. He vetia www.lukas-renggli.ch