Managed ObjectsOne of benefits of model-driven engineering is to generate commonly used data management services, such as persistence, logging, security, etc, as well as lower-level model constraints like maintaining inverse relationships and enforcing invariants, from a user specified model. In Ensō, data managers are not built into the framework or programming language, but user-definable. They can be composed using mixin inheritance, similar to the Decorator pattern in object-oriented languages, allowing programmers to construct extensible stacks of data managers.
Managed Data: Modular Strategies for Data Abstraction (Ensō Paper 1 of 6) (accepted to SPLASH Onwards 2012)
Alex Loh, William R. Cook, and Tijs van der Storm
Object GrammarsObject Grammars define a mapping between text and object graphs. Parsing recognizes syntactic features and creates the corresponding object structure. In the reverse direction, rendering recognises graph structures and generates an appropriate textual presentation. The key to Object Grammars is the expressive power of the mapping: how different can the syntactic and graph structures be? Our system supports declarative resolution/rendering of cross-links and predicates. It is also compositional, allowing modular definition of languages. We have implemented our approach to Object Grammars in the Enso system and illustrate the utility of our approach by showing how it enables definition and composition of domain-specific languages (DSLs).
Object Grammars: Compositional & Bidirectional Mapping Between Text and Graphs (Ensō Paper 2 of 6) (accepted to SLE 2012)
Tijs van der Storm, William R. Cook, and Alex Loh
Composable DSL InterpretersDSL and MDE technology typically focus on manipulation and maintenance of models, but often leave developers to define the operational semantics --- what these models do --- on their own. Partial code generation techniques that leave stubs to be manually filled, black-box hand-written interpreters, and transformation rules that do not compose, further aggravate extensibility and scalability problems. Our vision is to be able to build DSLs from a library of languages similar to application libraries today through a system of composable models, grammars, and semantics.
Debuggers for Specification LanguagesThe conventional debugging paradigm of state inspection at execution breakpoints is poorly suited for specification languages such as yacc or ATL that are not control-flow-based. The underlying sequencing of execution events is not directly related to the DSL code that the application programmer writes, and the program state typically includes huge amounts of generated data mixed in with the pertinent models. If code generators were used, the resulting general purpose language program will be even harder to connect back to the original DSL code.
A classic example is SQL: its execution model, the query optimizer, elides the actual sequence of operations and its huge intermediate states are not amenable to manual inspection. A more appropriate approach should instead directly link the errors in the observable program output to the errant subsections of the program source.