Modelling and programming have traditionally been seen as separate activities. Their respective technologies tend not to integrate. This is frustrating because models usually represent executing systems and programming languages need to provide features that map onto concepts from problem domains. This leads to a gap between models and programs that model-driven techniques seek to bridge. There are a number of ways in which this gap could be addressed:
o Modelling languages can be made executable so that they completely address the systems they are used to represent. It is easier to map a complete model to an implementation than an incomplete one.
o Languages can be made flexible so that domain specific features can be directly represented and thereby close the conceptual gap between the problem domain and its representation, or a model and its implementation.
o Programming languages can subsume models so that programming and modelling are performed using the same platform. Programs can easily reason about, manipulate and transform models.
o Both modelling and programming technologies can be organized in terms of meta-architectures that support reflection and meta-level extensions. General purpose features can co-exist with specialized language constructs.
XMF and XModeler were designed to address these issues.
XMF is a programming language designed to support meta-programming and domain specific languages. XMF runs on a VM written in Java in terms of a self-describing data-model. The structure of XMF data is shown as a class diagram in XModeler as:
XMF is both a compiled and interpreted language (like Lisp and Smalltalk) where both the compiler and the interpreter are written in XMF. The basic language included with XMF is based on OCL with the following differences:
o Higher-order functions: functions make it easy to define general-purpose data transformations. OCL iterators are encoded using functions in XMF.
o Variables and update: the addition of state to OCL turns it into a convenient very high-level programming language. If you use XMF to do modelling then you can ignore this feature.
o Pattern matching: data can be matched and deconstructed using patterns. This is used extensively in model transformations.
The XMF VM supports the following features:
o IO: XMF uses a variety of channels that work in the same way as Java streams. The IO package in XMF provides extensive support for serializing data, for example as XML.
o Foreign Functions: it is easy to load Java classes and make them work as though they are XMF classes.
o Threads: used, for example, in socket connections.
o Daemons: used to monitor changes to slot values on any object.
o A Meta-Object Protocol: allows key VM instructions to be extended by the user.
o Undo: transactional state changes can be undone.
Another key feature of XMF is the ability to extend the core language with syntax classes. A Syntax class has a grammar that describes how to process the concrete form of the new language construct and how to produce a replacement abstract syntax structure. The grammar language and parsing machinery are all written in XMF:
XMF is a Java program and can be downloaded by following this link. Instructions for starting XMF are given here under Software -> XMF. There are many language constructs included in XMF including: loops; classes; XML processors; code generators; micro-Java; rule-based languages; data walkers; HTML generation; pretty printers. XMF classes allow new definitions to be added dynamically and therefore system classes can be extended.
XModeler is a tool for executable modeling. It is build on top of XMF by adding language constructs for controlling GEF libraries on Eclipse. It can be used as an IDE for developing XMF programs and for modeling systems. Since it provides access to graphical primitives it allows graphical modeling languages to be developed in a number of ways, for example meta-packages are a lightweight way of producing a tailored language.
Here is a simple example of the use of XModeler to develop and view an XMF application. Firstly open a file browser containing a number of files. A manifest is like a Make-file on Unix; .xmf files contain XMF source code; .xml files contain diagram layout information:
The Library.xmf file contains a standard Library model written in XMF:
Compile and load the file. The resulting package can be browsed as a tree and viewed as a diagram:
Object diagrams (snapshots) can be created interactively or using XMF language constructs. Here is a simple snapshot creation program:
Here is another one:
Loading the snapshot and running test(2) produces the following diagram:
Remember the constraints defined on the classes in the Library model? We can run those against the snapshot and produce a report (too large to see everything):
How about those constraints? Some of them seem to have the same structure. Look at all_books_have_unique_titles and all_readers_have_unique_names. They do the same check, just using different slots – right? XMF allows us to capture this as a new language construct:
The definition of the new language construct is given as a syntax class called Unique:
XModeler can be downloaded here (for Windows and Mac) and includes extensive documentation including walkthroughs.