Composing

Domain-Specific Languages

            Eelco Visser
      Delft University of Technology
           http://eelcovisser.org

                12/11/2009
      Technical University Eindhoven
Software Engineering




                implement
Problem                          Solution
Domain                           Domain
                  validate
Programming Languages
Abstraction                  Scala



     Programming Languages



machine
Abstraction                                     Scala
                        garbage collection

              objects


      Programming Languages
expressions                        structured
                                  control-flow

                  procedures
machine
Problem
          GPL   Machine
Domain
The Next Level of Abstraction?




           Formal Methods
Spec




Problem
          GPL    Machine
Domain
Spec




Problem
          GPL    Machine
Domain
The Next Level of Abstraction?




   Domain-Specific Languages
The Next Level of Abstraction?


SQL

   Domain-Specific Languages
                                 CFG (BNF)

                          RegExp
Problem
                 DSL                 GPL             Machine
Domain




          Domain-Specific Languages: Specialization
Software System




Composition of Specialized Sub-domains
Software System




  Separation of Concerns



Composition of Specialized Sub-domains
Loose Coupling




Lack of consistency checks
Thesis


         Separation of Concerns

                requires

          Linguistic Integration
Case
                 Study




World Wide Web
where does that link point?
is that URL unique?




                      who may edit this entry?
                                                   where is data stored?
request

Client                  Server


            response




         Architecture
quest   Convert Request
                          Access Control   Validate Forms
          Parameters




        Render Page Or
                                           Handle Actions
           Redirect
ponse



                                              Update
                                             Database
Access                          Data
  Navigation
quest          Convert Request
                                   Control                     Validation
                                   Access Control   Validate Forms
                 Parameters




    Forms                        Data Model                   Actions
               Render Page Or
                                                    Handle Actions
                  Redirect
ponse

                                                              Object
     Page
                                 Data Binding              Relational
   Templates
                                                            Mapping
                                                       Update
                                                      Database
Access              Data
Navigation
                 Control           Validation



  Forms        Data Model            Actions



                                    Object
  Page
              Data Binding         Relational
Templates
                                    Mapping

      (Some) Concerns in Web Applications
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping




               data model             entity class         classes
                   orm                    JPA           active record
                 actions               Java/Seam             Ruby
             data validation
               navigation                servlets        controllers
             page templates         JavaServer Faces
                  forms                  JSF tags      embedded html
              data binding             JSF + Seam
             access control               Acegi
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                          <s:link view="/entry.xhtml"
                               value="#{entry.title}"
                               propagation="none">
                               <f:param name="entry" value="#{entry.id}"/>
                          </s:link>

@Name("entry")
public class EntryBean implements EntryBeanInterface {
  @RequestParameter("entry")
  private Long entryId;
}
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                   map.root :controller => "homme" # should be "home"




                                                    http://zef.me/2308/when-rails-fails
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping




               data model             entity class          classes
                   orm                    JPA            active record
                 actions               Java/Seam
                                             boilerplate code Ruby
             data validation
               navigation                       loose coupling
                                         servlets          controllers
             page templates         JavaServer Faces
                  forms                no/little consistency checking
                                         JSF tags        embedded html
              data binding             JSF + Seam
             access control               Acegi
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                  - separate languages for separate concerns

                  - linguistically integrated

                  - compile-time consistency checking

                  - 100% code generation (no scaffolding)
Access      Data
Navigation
             Control   Validation


  Forms
             Data
             Model
                        Actions     entity Blog {
                                      name :: String (id)
                        Object
  Page
Templates
              Data
             Binding
                       Relational     entries -> Set<Entry>
                        Mapping
                                      authors -> Set<User>
                                    }
                                    entity Entry {
                                      url     :: String (id)
                                      title   :: String (name)
                                      text    :: WikiText
                                      blog    -> Blog (inverse=Blog.entries)
                                      author -> User (inverse=User.entries)
                                      created :: DateTime
                                    }
                                    entity User {
                                      username :: String
                                      password :: Secret
                                      blogs       -> Set<Blog> (inverse=Blog.authors)
                                      entries     -> Set<Entry> (inverse=Entry.author)
                                    }
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                                    define page entry(e : Entry) {
                                     header{output(e.title)}

                                        output(e.text)

                                        “Posted by “ output(e.author)
                                        “ on “ output(e.created)

                                        navigate(editentry(e)){“Edit”}
                                    }
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model


                                    define page editentry(e : Entry) {
                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping
                                      form{
                                        input(e.url)
                                        input(e.title)
                                        input(e.text)
                                        input(e.author)
                                        input(e.created)
                                        action(“Save”, action{
                                         return entry(e);
                                        })
                                      }
                                    }
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                                    entity Entry {
                                      url validate(isUniqueEntry(this),
                                       “Entry with that URL already exists”)
                                    }
Access      Data
Navigation
             Control   Validation


  Forms
             Data
                        Actions
                                    access control rules
             Model


  Page        Data
                        Object
                       Relational
                                    principal is User
Templates    Binding
                        Mapping      with credentials username, password

                                    rule page entry(e : Entry) {
                                      !e.private
                                      || principal in e.blog.authors
                                    }

                                    rule page newentry(b : Blog) {
                                      principal in e.blog.authors
                                    }

                                    rule page editentry(e : Entry) {
                                      e.author == principal
                                    }
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                  - separate languages for separate concerns

                  - linguistically integrated

                  - compile-time consistency checking

                  - 100% code generation (no scaffolding)

                  - order of magnitude decrease in code size
http://researchr.org
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object               Stratego/XT
  Page        Data
                       Relational
Templates    Binding
                        Mapping




             Domain-Specific Language Engineering
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object      Stratego/XT
  Page        Data
                       Relational
Templates    Binding
                        Mapping




   WebDSL                            Java
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object               Stratego/XT
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                                     Core
   WebDSL                                     Java
                                    WebDSL
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object               Stratego/XT
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                                             Python



                                     Core
   WebDSL                                     Java
                                    WebDSL



                                              C#
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model

                        Object                     Stratego/XT
  Page        Data
                       Relational
Templates    Binding
                        Mapping




                                                   Python



                                     Core
   WebDSL                                    PIL    Java
                                    WebDSL



                                                    C#
Access      Data
Navigation
               Control   Validation


               Data
  Forms                   Actions
               Model

                          Object                                           Stratego/XT
  Page          Data
                         Relational
Templates      Binding
                          Mapping



                                      Component-Based Language Engineering
       DM                PIL



                                                                                Python
          UI             PIL



       AC                PIL
                                       +           WebDSL
                                                             Core
                                                            WebDSL
                                                                     PIL         Java



                                                                                 C#




       DV                PIL
Access      Data
Navigation
             Control   Validation


             Data
  Forms                 Actions
             Model


  Page        Data
                        Object
                       Relational   - separate languages for separate concerns
Templates    Binding
                        Mapping     - linguistically integrated
                                    - compile-time consistency checking
                                    - 100% code generation (no scaffolding)
                                    - order of magnitude decrease in code size

                                                        http://webdsl.org




http://strategoxt.org                                 http://researchr.org

Composing Domain-Specific Languages

  • 1.
    Composing Domain-Specific Languages Eelco Visser Delft University of Technology http://eelcovisser.org 12/11/2009 Technical University Eindhoven
  • 2.
    Software Engineering implement Problem Solution Domain Domain validate
  • 3.
  • 4.
    Abstraction Scala Programming Languages machine
  • 5.
    Abstraction Scala garbage collection objects Programming Languages expressions structured control-flow procedures machine
  • 6.
    Problem GPL Machine Domain
  • 7.
    The Next Levelof Abstraction? Formal Methods
  • 8.
    Spec Problem GPL Machine Domain
  • 9.
    Spec Problem GPL Machine Domain
  • 10.
    The Next Levelof Abstraction? Domain-Specific Languages
  • 11.
    The Next Levelof Abstraction? SQL Domain-Specific Languages CFG (BNF) RegExp
  • 12.
    Problem DSL GPL Machine Domain Domain-Specific Languages: Specialization
  • 13.
    Software System Composition ofSpecialized Sub-domains
  • 14.
    Software System Separation of Concerns Composition of Specialized Sub-domains
  • 15.
    Loose Coupling Lack ofconsistency checks
  • 16.
    Thesis Separation of Concerns requires Linguistic Integration
  • 17.
    Case Study World Wide Web
  • 19.
    where does thatlink point? is that URL unique? who may edit this entry? where is data stored?
  • 20.
    request Client Server response Architecture
  • 21.
    quest Convert Request Access Control Validate Forms Parameters Render Page Or Handle Actions Redirect ponse Update Database
  • 22.
    Access Data Navigation quest Convert Request Control Validation Access Control Validate Forms Parameters Forms Data Model Actions Render Page Or Handle Actions Redirect ponse Object Page Data Binding Relational Templates Mapping Update Database
  • 23.
    Access Data Navigation Control Validation Forms Data Model Actions Object Page Data Binding Relational Templates Mapping (Some) Concerns in Web Applications
  • 24.
    Access Data Navigation Control Validation Data Forms Actions Model Object Page Data Relational Templates Binding Mapping data model entity class classes orm JPA active record actions Java/Seam Ruby data validation navigation servlets controllers page templates JavaServer Faces forms JSF tags embedded html data binding JSF + Seam access control Acegi
  • 25.
    Access Data Navigation Control Validation Data Forms Actions Model Object Page Data Relational Templates Binding Mapping <s:link view="/entry.xhtml" value="#{entry.title}" propagation="none"> <f:param name="entry" value="#{entry.id}"/> </s:link> @Name("entry") public class EntryBean implements EntryBeanInterface { @RequestParameter("entry") private Long entryId; }
  • 26.
    Access Data Navigation Control Validation Data Forms Actions Model Object Page Data Relational Templates Binding Mapping map.root :controller => "homme" # should be "home" http://zef.me/2308/when-rails-fails
  • 27.
    Access Data Navigation Control Validation Data Forms Actions Model Object Page Data Relational Templates Binding Mapping data model entity class classes orm JPA active record actions Java/Seam boilerplate code Ruby data validation navigation loose coupling servlets controllers page templates JavaServer Faces forms no/little consistency checking JSF tags embedded html data binding JSF + Seam access control Acegi
  • 28.
    Access Data Navigation Control Validation Data Forms Actions Model Object Page Data Relational Templates Binding Mapping - separate languages for separate concerns - linguistically integrated - compile-time consistency checking - 100% code generation (no scaffolding)
  • 29.
    Access Data Navigation Control Validation Forms Data Model Actions entity Blog { name :: String (id) Object Page Templates Data Binding Relational entries -> Set<Entry> Mapping authors -> Set<User> } entity Entry { url :: String (id) title :: String (name) text :: WikiText blog -> Blog (inverse=Blog.entries) author -> User (inverse=User.entries) created :: DateTime } entity User { username :: String password :: Secret blogs -> Set<Blog> (inverse=Blog.authors) entries -> Set<Entry> (inverse=Entry.author) }
  • 30.
    Access Data Navigation Control Validation Data Forms Actions Model Object Page Data Relational Templates Binding Mapping define page entry(e : Entry) { header{output(e.title)} output(e.text) “Posted by “ output(e.author) “ on “ output(e.created) navigate(editentry(e)){“Edit”} }
  • 31.
    Access Data Navigation Control Validation Data Forms Actions Model define page editentry(e : Entry) { Object Page Data Relational Templates Binding Mapping form{ input(e.url) input(e.title) input(e.text) input(e.author) input(e.created) action(“Save”, action{ return entry(e); }) } }
  • 32.
    Access Data Navigation Control Validation Data Forms Actions Model Object Page Data Relational Templates Binding Mapping entity Entry { url validate(isUniqueEntry(this), “Entry with that URL already exists”) }
  • 33.
    Access Data Navigation Control Validation Forms Data Actions access control rules Model Page Data Object Relational principal is User Templates Binding Mapping with credentials username, password rule page entry(e : Entry) { !e.private || principal in e.blog.authors } rule page newentry(b : Blog) { principal in e.blog.authors } rule page editentry(e : Entry) { e.author == principal }
  • 34.
    Access Data Navigation Control Validation Data Forms Actions Model Object Page Data Relational Templates Binding Mapping - separate languages for separate concerns - linguistically integrated - compile-time consistency checking - 100% code generation (no scaffolding) - order of magnitude decrease in code size
  • 35.
  • 36.
    Access Data Navigation Control Validation Data Forms Actions Model Object Stratego/XT Page Data Relational Templates Binding Mapping Domain-Specific Language Engineering
  • 37.
    Access Data Navigation Control Validation Data Forms Actions Model Object Stratego/XT Page Data Relational Templates Binding Mapping WebDSL Java
  • 38.
    Access Data Navigation Control Validation Data Forms Actions Model Object Stratego/XT Page Data Relational Templates Binding Mapping Core WebDSL Java WebDSL
  • 39.
    Access Data Navigation Control Validation Data Forms Actions Model Object Stratego/XT Page Data Relational Templates Binding Mapping Python Core WebDSL Java WebDSL C#
  • 40.
    Access Data Navigation Control Validation Data Forms Actions Model Object Stratego/XT Page Data Relational Templates Binding Mapping Python Core WebDSL PIL Java WebDSL C#
  • 41.
    Access Data Navigation Control Validation Data Forms Actions Model Object Stratego/XT Page Data Relational Templates Binding Mapping Component-Based Language Engineering DM PIL Python UI PIL AC PIL + WebDSL Core WebDSL PIL Java C# DV PIL
  • 42.
    Access Data Navigation Control Validation Data Forms Actions Model Page Data Object Relational - separate languages for separate concerns Templates Binding Mapping - linguistically integrated - compile-time consistency checking - 100% code generation (no scaffolding) - order of magnitude decrease in code size http://webdsl.org http://strategoxt.org http://researchr.org