We’re currently doing a major cleanup and revision of the APIs of the DSL Tools.  An aspect of this is a systematic renaming so that the API is a better match to the concepts we are dealing with.  One thing we decided to do is get rid of the Meta… prefix altogether.

In my experience around UML and MOF, the Meta… prefix causes endless confusion, especially the concept of a “meta-instance”: M3 is an instance of M4, M2 is an instance of M3, and so on.  I became notorious for insisting that “M0 is a fiction”.

The issue here is the relationship between a model, and the stuff that it is a model of; and what this has to do with building a model of the concepts of a modelling language.

Sometimes people say “a metamodel is a model of a model”.  This is simply wrong.  If X is a model of Y, then X systematically represents Y for some purpose, leaving out unnecessary detail. That is not the relationship between a metamodel and a model.

Sometimes people say “a model is an instance of a metamodel”.  This begs the question of what it means to be an instance of a model.  If I have a model of a program, what is an instance of that model?  A copy of the source code? The DLL?  The DLL loaded into memory? An execution of the program? A stacktrace?  A mathematical model of the program’s semantics? It is an ill-defined concept.

So, to avoid all of this (which in any case reminds me of the issue of how many angels can dance on the head of a pin), we decided to call the models of the concepts in our DSLs Domain Models; which contain Domain Classes, Domain Relationships, Domain Properties, Domain Roles and so on.  These models are used to generate tools, and serialized in files.  We also have a model which we use to generate the tool and formats that we use to manipulate Domain Models – we call this the Domain Model Domain Model, or DMDM.