Code Generation Ákos Horváth Gábor Bergmann Dániel Varró Model Driven Systems Development Lecture 8
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Agenda
Code Generation in general Approaches Advanced Text Generation Issues Example template languages o JET, Velocity, Xpand and XTend
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Code Generation (text synthesis)
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Why? Let’s shorten Development time! Use our models/requirements/plans to derive… o Documentation o Source code o Configuration descriptors o Communication messages o Object Serialization o…
Need to support designing „text” synthesis Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Text synthesis The realization of a high-level model on an implementation platform A choice between certain attributes – compromise between: o Compatibility o Performance o Maintainability o Reusability
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Similarity with compilers Mapping between abstraction levels o e.g., From C to assembly
Usage of design patterns o e.g., function calls in C
Many similarities, NOT a strict separation o pl. C++ templates, automatically generated ctor+dtor
Prediction: o yesterday’s design pattern today’s code generation feature tomorrow’s language element
Domain-specific instead of universal languages Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Example: Source Code generation in MDD DSM model code generation
High-level language
compile
Assembly Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Approaches
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Approaches Dedicated o Specific, ad-hoc o Using a dedicated code generator
Template based
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Specific, ad-hoc
Designed for the specific problem domain: o o o o o
Best performance Quick and dirty Long development, hard maintainability Zero reusability Dedicated problem domains • Minimal changes during support cycle (safety critical embedded system, defense) • Certifiability
o Example: • ARINC653 Multistatic configuration generator (python script) Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Dedicated code generator Parameters
Model
Dedicated Code generator
Textual artifact
Based on a framework: o Faster development time o Slower performance, better reusability o Embedded systems, moderate changes during project lifecycle Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Dedicated code generator Parameters
Model
Dedicated Code generator
Textual artifact
Examples: o o o o o
IBM Rational Software Architect VASP (DO-178B Level A) Display graphics in avionics Mathworks Matlab Simulink Esterel Scade suite
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Template Based Parameters
Model Template
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Template Compiler/generator Executable Template Code
Textual Artifact
Metamodeling and Domain Specific Modeling
Template Based Parameters
Name=”John Doe” Balance=”1000$” Model Template
Template Compiler/generator Executable Template Code
Textual Artifact
Dear [Name],
Dear John Doe,
I would like to inform you that your current balance is [Balance]
I would like to inform you that your current balance is 1000$
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Template Based Parameters
Model Template
Template Compiler/generator Executable Template Code
Textual Artifact
Fastest development time „Slowest” performance, highest reusability Fast changing environments (e.g., web based technologies) Complex changes during project lifecycle o Models and templates can be changed independently
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Template Based Parameters
Model Template
Template Compiler/generator Executable Template Code
Textual Artifact
Examples: o o o o o
JET (for EMF models) Velocity (/JSP) OpenArchitectureWare/ XPand (MDD approach) AutoFilter (Kalman filters) Smarty (php)
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Advanced Code/Text Generation Issues
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Direct source code generation Direct source code generation o o o o
Simple structure Low complexity Fast development Linear output generation (single pass) o Problematic formatting o Problematic M2C synchronization
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Output:
Metamodeling and Domain Specific Modeling
AST generation AST generation
Output:
o Represents the program structure (PSM) o Can be very complex o Slower development o Non-linear generation process o Support for M2C synchronization o Incremental output generation o ”pretty formatting” o E.g., Eclipse JDT Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Direct source code generation vs. AST Direct source code generation o o o o
Simple structure Low complexity Fast development Linear output generation (single pass) o Problematic formatting o Problematic M2C synchronization
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
AST generation o Represents the program structure (PSM) o Can be very complex o Slower development o Non-linear generation process o Support for M2C synchronization o Incremental output generation o ”pretty formatting” o E.g., Eclipse JDT
Metamodeling and Domain Specific Modeling
Generator model Model Input Models
Generator Model
generate
Generated Documents
”AST” models ”Output” models
Multiple source models ”generator” model Stores all additional information References to both Input Models and „Outputs” (prettyprintable) Helps code generation by o o o o
Multiple output streams Traceability between models cross references Support for Non-linear ”Multi Pass” traversals and model build Support for complex model hierarchies (multiple AST-s, packages etc.)
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Model to code synchronization What if the output text is changed? M2C synchronization Works only with AST based approaches Requires o Traceability between model and text o Model compare o Change localization
Incremental model building for better performance Example o Eclipse JDT: java source and its AST o EMF: model generator Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Manual and generated parts Don’t overwrite manual extensions upon re-generation Where to put non-changing parts o Model • Allows better reusability • Increases complexity
o Template • Works well for simple cases
o AST • Manual markings in AST the rest is generated
o Directly to code • Java no support – Use generalization
• C# partial classes Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Code formatting Where to include? o Model • Does not follow typical MVC design paradigm
o Templates • Simple formatting element
o AST • Can store all relevant information • Makes it very complex
Best solution: Code formatting as separate step o a new step in the generation workflow o Can be handled with 3rd party code formatters • Eclipse JDT formatter • XML DOM serializer
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Keywords and special characters Restricted keywords in the target language o Java: abstract, class o XML: ‘<‘ , ‘>’ o etc.
Needs to validate the model before generation o Can be very complex separate step before code generation o Example • Java simple support: isJavaIdentifierStart() (in Character) • EMF validation
Escaping o On the model (in separate generator model?) o Only at code generation time Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Java Emitter Templates (JET) Velocity, Xpand, Xtend
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Java Emitter Templates Model
JET Templates + Parameters
Template Compiler/generator
JET classes
execute
Java Emitting Templates (JET) o o o o o o
JSP-like template language using Java as its control sequence Compiled to Java Open output format (Text) Parameters as Java objects Part of EMF Eclipse uses JET as its own template language
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Generated Document
JET example <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> <demo> <% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%> <% } %>
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
JET example <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> Package of representing class
<demo> Packages to import Jet Header Namei of the Class <% for (Iterator = elementList.iterator(); i.hasNext();representing ) { %>the Template <element><%=i.next().toString()%>
<% } %> Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
JET example <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> Input parameter Start of code section <demo> <% for (Iterator i = elementList.iterator(); End of code section i.hasNext(); ) { %> <element><%=i.next().toString()%> <% } %>
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
JET example <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> <demo>
<% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%> Start of target document <% } %>
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
JET example <%@ jet package="hello" imports="java.util.*" class="XMLDemoTemplate" %> <% List elementList = (List) argument; %> Loop with the input parameter
<demo>
<% for (Iterator i = elementList.iterator(); i.hasNext(); ) { %> <element><%=i.next().toString()%> <% } %>
Loop body Returns value of the argument
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Apache Velocity Model Velocity Templates
Velocity Template Engine Executable Template Code
execute
Generated Document
Apache Velocity o o o o
JSP like template language with limited control sequence Interpreted Open output format (Text) Parameters as a Map
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Velocity example <demo> #set( $tempString = " Element") #foreach( $element in $elementList) <element> ${element.toString()} <element> #end
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Velocity example Start of target document
New value of tempString <demo> #set( $tempString = "Element") #foreach( $element in $elementList) <element> ${element.toString()} <element> #end Setting values New variable
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Velocity example Input parameter <demo> #set( $tempString = "Element") #foreach( $element in $elementList) <element> ${element.toString()} <element> #end For loop New running variable Arbitrary Java method call
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Xtend EMF model
Validation
Transformation (Xtend)
Generator (Xpand)
execute
M2C workflow (former OAW)
Eclipse M2C (former OAW) o Complete M2C workflow • Validation • Transformation (Xtend language) • Code generation (Xpand language)
Mainly for EMF model based transformation Flexible workflow definition Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Generated Document
Xtend EMF model
Validation
Transformation (Xtend)
Generator (Xpand)
execute
M2C workflow (former OAW)
Interpreted Statically-typed template language Polymorphic template invocation Support for AOP programming Error handling Support for whitespace generation/definition
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Generated Document
Xpand «IMPORT XMLmetamodel» «DEFINE main FOR Model» «FILE this.name + ".myxml"» <demo> «EXPAND listElement FOREACH elements» «ENDFILE» «ENDDEFINE» «DEFINE listElement FOR Element» <element> «this.toString()» «ENDDEFINE» Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Xpand «IMPORT XMLmetamodel» Import EMF metamodel «DEFINE main FOR Model» «FILE this.name + ".myxml"» <demo> Define template for specific type «EXPAND listElement FOREACH elements» «ENDFILE» «ENDDEFINE» «DEFINE listElement FOR Element» <element> «this.toString()» «ENDDEFINE» Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Xpand «IMPORT XMLmetamodel» «DEFINE main FOR Model» «FILE this.name + ".myxml"» <demo> «EXPAND listElement FOREACH elements» Output file definition Start of target document «ENDFILE» «ENDDEFINE» «DEFINE listElement FOR Element» <element> «this.toString()» «ENDDEFINE» Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Xpand «IMPORT XMLmetamodel» «DEFINE main FOR Model» «FILE this.name + ".myxml"» <demo> «EXPAND listElement FOREACH elements» «ENDFILE» EReference holding the elements «ENDDEFINE» Invoke other template with type definition
«DEFINE listElement FOR Element» <element> «this.toString()» «ENDDEFINE» Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Xtend overview Foundation of Xtext2 o Original purpose: compile Xtext2 DSLs to Java
A JVM-based language o Imperative, statically typed, compiles to Java o Incorporates functional programming constructs
Advanced features o o o o o o o
Type inference Properties Everything is an expression Operator overloading Power switch Lambda expressions Templates
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Xtend example import com.google.inject.Inject
Java Import
class DomainmodelGenerator implements IGenerator { @Inject extension IQualifiedNameProvider nameProvider
?
override void doGenerate(Resource resource, IFileSystemAccess fsa) { for(e: resource.allContentsIterable.filter(typeof(Entity))) { fsa.generateFile( Built-in function e.fullyQualifiedName.toString.replace(".", "/") + ".java", e.compile) } } Syntactic sugar for first parameter def compile(Entity e) ''' «IF e.eContainer != null» package «e.eContainer.fullyQualifiedName»; «ENDIF» ‘’’ =generated text is the default public class «e.name» «IF e.superType != null » extends «e.superType.fullyQualifiedName» «ENDIF»{ «FOR f:e.features» «f.compile» «ENDFOR» }
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Summary
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling
Code generation - Summary • Started from source code generation • UML -> Java, C++, …. • Used in many other text based artifacts •document generation (web) •report generation (XML, XLS, CSV, print) •Configuration (wsdl) • Strong tool support • Xpand • Xtend • (CodeDOM) • There are some use cases outside of the MDE field
Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Metamodeling and Domain Specific Modeling