UML Reflections
UML Reflections
net/publication/227079533
UML reflections
CITATIONS READS
2 327
4 authors, including:
Gerson Sunyé
University of Nantes
98 PUBLICATIONS 1,476 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Gerson Sunyé on 27 May 2014.
Abstract The UML shares with reflective architectures the idea that
self-definition of languages and systems is a key principle for building and
maintaining complex systems. The UML is now defined by a four-layer
metalevel structure, enabling a flexible and extensible definition of mod-
els by metamodels, and even a self-description of the meta-metamodel
(the MOF). This metalevel dimension of UML is currently restricted to
structural reflection. But recently a new extension to the UML, called
the Action Semantics (AS), has been proposed for standardization to
the OMG. This paper explores how this proposed extension brings a
behavioural reflection dimension to the UML. Indeed, we show that it
is not only possible but quite effective to use the AS for manipulating
UML models (including the AS metamodel). Besides elegant conceptual
achievements, such as a metacircular definition of the AS, reflective mod-
eling with the AS leverages on the UML metalevel architecture to provide
the benefits of a reflective approach, in terms of separation of concerns,
within a mainstream industrial context. A complete model can now be
built as an ideal model representing the core concepts in the application,
to which non-functional requirements are integrated as fully traceable
transformations over this ideal model. For example, this approach paves
the way for powerful UML-defined semantics-based model transforma-
tions such as refactoring, aspect weaving, application of design patterns
or round-trip engineering.
1 Introduction
The UML (Unified Modeling Language) shares with reflective architectures the
idea that self-definition of languages and systems is a key principle for building
and maintaining complex systems. In its recent versions, the UML adopted a
four-layer metalevel structure, which has enabled a flexible and extensible defi-
nition of models through metamodels, and even a self-description of the meta-
metamodel. We concur with Bézivin and Lemesle [1] that this metalevel archi-
tecture is both a sign that models are now becoming first-class entities, but also
that modeling now challenges the role of programming as the central activity
in software development. But this metalevel dimension of the UML is currently
restricted to structural reflection, a restriction that, in our view, holds up this
mutation. Fortunately, new additions to the standard are now introducing be-
havioural reflection capabilities that will, again in our opinion, play a major role
in this software development shift.
:Device
:Operator
<<actor>> +controls
Device
Operator
1 0..* +start()
+stop()
Static Dynamic
ControllingSite RemoteSite
TCP/IP :Device
:Operator
:Operator
Functional Physical
Until recently, the UML lacked precise and formal foundations for several
constructs such as transition guard expressions or method bodies, for which it
resorted to semantic loopholes in the form of “uninterpreted” strings. Some tools
use general purpose programming languages or specific proprietary languages,
but yet this is a rather ad hoc and non-standard answer to the problem. Be-
cause this was hampering the acceptance of the UML in some industrial circles
(e.g., the aerospace or telecom industry), where the strong emphasis on the crit-
icality of software is coped with using precise behaviour description languages
and formal verification tools, the Action Semantics (AS) [10] has been proposed
for standardization to the Object Management Group (OMG). The AS aims
at filling this gap by providing means to annotate UML models with action
statements as well as a model of execution for these statements. The AS is intro-
duced as a metamodel integrated into the UML metamodel. Building over what
already exists in the CCITT Specification and Description Language (SDL) com-
munity [6,11], the integration of the Action Semantics into the UML standard
should promote interoperability among tools, and allow for executable modeling
and simulation, as well as full code or test cases generation.
This paper explores how this proposed extension brings a behavioural reflec-
tion dimension to the UML. While the purpose of the AS is to annotate models
with executable specifications for applications source code, we show in this paper
that it is not only possible but quite effective to use the AS for manipulating
UML models, including even the AS metamodel. Besides providing grounds for
neat conceptual achievements, such as a metacircular minimal definition of the
AS itself, reflective programming with the AS leverages on the UML metalevel
architecture (the UML metamodel is itself an UML model) to provide the ben-
efits of a reflective approach within a mainstream industrial context. Indeed, a
model can now be built as an ideal model representing the core concepts in the
application, to which non-functional requirements are integrated as transforma-
tions over this ideal model.
This novel approach to metamodeling builds on the strong commitment to-
wards separation of concerns that UML also shares with approaches such as AOP
(Aspect Oriented Programming) and SOP (Subject Oriented Programming).
With its nine views which are like projections of a whole multi-dimensional sys-
tem onto separate plans, some of them being orthogonal, the UML indeed pro-
vides the designer with an interesting separation of concerns, covering four main
dimensions of software modeling (see Fig. 1): functional (use cases diagrams ex-
press the requirements), static (class diagrams), dynamic (statecharts, sequence
diagrams for the specification of behavioural aspects) and physical (implementa-
tion diagrams). By applying the AS reflectively to models and metamodels, we
have been able to show how designers can carry on, within the UML notational
context, activities such as behaviour-preserving transformations [23] (see § 4.2),
design pattern application [12] (§ 4.3) and design aspects weaving [15] (§ 4.4).
The rest of the paper is structured as follows. Section 2 recalls the principles
of the UML metalevel architecture ; besides explaining the architecture itself, this
section also discusses the parallel with well-known object-oriented programming
languages metalevel architectures. Section 3 reviews the Action Semantics as it
is currently submitted for standardization at the OMG and it explains how it
can be used for reflective modeling. Section 4 shows the interest of using the
Action Semantics at the metamodel level for specifying and programming model
transformations in several contexts. Related work are discussed in Section 5, and
a conclusion summarizes our contributions.
The UML is all about defining models for executable software artifacts, and
more precisely objects. Commonly, the UML is used to define models for ob-
jects that will eventually execute on some computer to carry on a computation.
A model usually abstracts implementation details of executable objects into
entities, which are depicted using a graphical notation and, more and more im-
portantly, a standard XMI serialization format. On the other hand, a model can
provide more information that a crude program, mainly by representing and by
giving details about relationships between objects, which are implemented by
only a few expressible relationships in programming languages (client, inheri-
tance, sometimes agregation and a few others).
If models can describe executable objects and their relationships, it has been
soon recognized that they could as well describe other artifacts, and more pre-
cisely models. After all, models are built of entities and relationships. Hence,
models of models, or metamodels, can describe what kinds of entities and rela-
tionships are found in models. Without surprize, metamodels being themselves
models, the idea of describing them using metametamodels comes immediately
to minds. To avoid a potential infinite metaregression, a fixed-point must be
sought to define precisely and completely a modeling architecture.
2.2 A standard four-layer metalevel architecture
The UML follows a four-layer modeling architecture, each layer being a model
of the layer under, the last one being a model of itself. The first layer, called M0 ,
holds the executable (“living”) entities when the code generated from the model
is executed, i.e. running objects, with their attribute values and links to other
objects. The second layer M1 is the modeling layer. It represents the model as
the designer conceives it. In UML, this is the place where well-known classes,
associations, state machines,... are defined (via the nine views, quoted above).
The running objects are “instances” of the classes defined at this level. The
third level M2 is the metamodel level, i.e. a description of what a syntactically
correct model is. Finally the fourth level M3 is the meta-metamodel level, i.e. the
definition of the metamodel syntax, such as the syntax of the UML metamodel.
UML creators chose a four-layer architecture because it provides a basis for
aligning the UML with other standards based on a similar infrastructure, such
as the widely used Meta-Object Facility (MOF).
This four-level architecture brings a form of structural reflection to the UML.
Each level defines the syntax and semantic constraints of models one level be-
low. Defining UML as a metamodel allows for easy extension of UML to serve
specific modeling needs, while the MOF serves as a unique root to define sev-
eral modeling languages, perhaps adapted to specific application areas. Bézivin
and Lemesle have explored the underpinnings and consequences of this met-
alevel architecture and predict a mainstream role to modeling in future software
development processes [1].
In terms of structural reflection, however, the UML architecture is somewhat
restricted. As the major restriction, notice that the relationship between levels
is neither explicitly defined nor explicitly used in the definition of UML [1]. This
relationship is not precisely instantiation, since it is a many-to-many relation-
ship, many elements of one level usually concur to the definition of one or more
elements one level below. Moreover, a more traditional instantiation relationship
can be depicted between elements of adjacent levels, such as between classes de-
fined at level M1 and the objects at level M0 . Bézivin and Lemesle suggest the
term “based-on” to name this relationship between levels, a convention we adopt
here. Again, we concur with these authors that the two relationships, “based-
on” and “instance-of”, will have to be reified into UML and the MOF for this
metalevel architecture to fully bear fruits.
Traditional modeling methods which do not have support for any action lan-
guage to specify the behaviour of model elements have focused on separating
analysis and design, i.e. the what the system has to do and the how that will
be achieved. If this separation clearly has some benefits, such as allowing the
a:Foo b:Foo M0
c:Foo
is instance of
M1
Foo
is instance of
M2
1
StateMachine +behavior Class +type AssociationEnd
+child
2..* +connection
+parent
+outgoing
State Transition
Association
+incoming
PseudoState FinalState
is instance of
M3
1
Class +type AssociationEnd
+child
2..* +connection
+parent
Association
+action
Action
The AS was originally conceived for precisely specifying the behaviour of models.
We advocate the extension of its scope beyond this basic role. An UML execu-
tion engine, i.e. an implementation of the AS model of execution is originally
dedicated to the manipulation of M0 instances of UML models. Such manipula-
tions are specified at the M1 level, as part of the whole model of the application.
But since both (1) the UML meta-model and (2) the UML execution model for
the AS are themselves UML models, we can use the AS to specify the evolution
of these models:
Packet +content
ObjectIdentity
+status:enum{ready,transit,executing,complete} 0..1 1
1 +target
0..*
InvocationPacket
+requester
SynchronousInvocationPacket SynchronousInvocationExecution
0..1 1
Action is defined as an action that sends a message to a target object and blocks
until it receives an answer. The semantics of execution for this action is (par-
tially) described in Fig. 4 and completed with the following production extracted
from the specification:
Production 1 : synchronous invocation action generates a synchronous
invocation packet and blocks itself.
precondition: self.status = #ready
postcondition: self.status@post = #executing -- put call in executing
-- state while subordinate execution proceeds.
packet:SynchronousInvocationPacket.isNew and -- create a call packet
packet.requester@post=self and
packet.status@post= #ready and
packet.target@post=self.input target() and
packet.content@post=self.input argument
It is obvious to deduce a sequence of AS primitive actions which creates and
initializes a packet conforming to this postcondition.
packet := new SynchronousInvocationPacket -- a CreateObjectAction
packet.requester := self -- a CreateLinkAction
packet.status := #ready -- a WriteAttributeAction
packet.target := self.target -- a ReadLinkAction then a CreateLinkAction
packet.content := self.argument -- n ReadLinkActions, n CreateLinkActions
Until now, this has been left out of the OMG specification, where productions
focus on giving a precise meaning to the execution of actions, putting aside
the building of compliant and efficient execution engines. Productions do not
explicitly state how to compute the next snapshot in an object history and thus
are an inappropriate formalism for tools implementors. This idea could also be
used to let the user define new actions based on primitive ones, thus extending
the AS.
Finally, we propose to give the programmer the full power of UML reflexivity
by providing M0 level entities with a link to the M1 level, and M1 level entities
a link to M2 level in such a way that she can freely navigate between the various
levels of modelisations, both at runtime and at design time.
In this section, we discuss why and show how to use the behavioural reflection
introduced by the Action Semantics to implement model transformations. We
present three different uses for this approach: implementing refactorings, apply-
ing design patterns and weaving design aspects.
Using the UML meta-modeling architecture and the Action Semantics for speci-
fying transformations is appealing: the development of meta-tools capitalizes on
experience designers have gained when modeling UML applications. Some recur-
rent problems suddently vanish: portability of transformations is ensured for all
UML-compliant tools with access to the metamodel, there is no learning-curve
for the writing of new meta-tools, as it is pure UML and any development pro-
cess supporting the UML applies to the building and reuse of transformations
[18]. This paves the way to off-the-shelf transformation components.
We strongly believe that this use of the Action Semantics will change the
traditional software development process. More concretely, the Action Seman-
tics is an important step towards the use of UML in an effective development
environment, since it offers the possibility of enacting early design models and
to evolve or refine it until its implementation. The development approach we
propose here starts with an early design model, created by the designers from
an analysis model. This model is completely independent of the implementation
environment, it assumes an “ideal world”, where the processing power and the
memory are infinite, there is no system crash, no transmission error, no database
conflicts, etc. Since this model encloses Action Semantics statements, it can be
enacted by the Action Semantics machine and validated. Once the validation is
finished, the designer can add some environment-specific aspects to the design
model (database access, distribution), apply design patterns and restructure the
model using design refactorings.
As already outlined, transformations rank in two categories: the ones related
to the application domain and those involved in generating efficient implementa-
tions for the target platform. The following example illustrates the difference: if
the designer knows a collection of objects has to be notified when another object
changes, then she annotates the corresponding classes as collaborating into an
Observer pattern [12]. A generic transformation supporting this pattern adds
an update method to every observer. Specific transformations for implementing
the pattern offer designers choices that fit implementation trade-offs: execution
speed vs. memory footprint, point-to-point notification vs. broadcasting, depend-
ing on requirements on the underlying hardware. This last transformation is not
at all related to the application, and must not distract the designer from its
application refinement.
The two categories are not exclusive : some transformations bridge the appli-
cation domain and the implementation domain, thus falling into both categories.
These transformations perform the “weaving” of the two aspects into a single
implementation model.
An OCL expert might rightfully notice that the operation child is not defined
neither in the OCL documentation nor as an additional operation in the UML
metamodel. We have defined it symmetrically to the parent operation, defined
for Classes.
Another interesting use for Action Semantics is the application of Design Pat-
terns, i.e. the specification of the proposed terminology and structure of a pat-
tern in a particular context (called instance or occurrence of a pattern). In other
words, we envisage the application of a pattern as a sequence of transformations
that are applied to an initial situation in order to reach a final situation, an
explicit occurrence of a pattern.
This approach is not, and does not intend to be, universal since only a few
patterns mention an existing situation to which they could be applied (see [7]
for further discussion on this topic). In fact, our intent is to provide designers
with metaprogramming facilities, so they are able to define (and apply) their
3
Since the Action Semantics does not have an official surface language, we adopt an
“OCL-based” version in our examples.
own variants of known patterns. The limits of this approach, such as pattern
and trade-offs representation in UML, are discussed in [26].
As an example of design pattern application, we present below a transforma-
tion operation that applies the Proxy pattern. The main goal of this pattern is
to provide a placeholder for another object, called Real Subject, to control access
to it. It is used, for instance, to defer the cost of creation of an expensive object
until it is actually needed:
Class :: addProxy
pre:
let classnames = self .package. allClasses →collect(each : Class | each.name) in
(classnames→excludes(self.name+’Proxy’) and
classnames→excludes(’Real’+self.name))
actions:
let name := self.name
let self .name := name.concat(’Proxy’)
let super :=
self .package.addClass(name,self.allSuperTypes(),{}→including(self))
let real :=
self .package.addClass(’Real’.concat(name),{}→including(super),{})
let ass := self .addAssociationTo(’realSubject’,real)
self .operations→forAll(op : Operation | op.moveTo(real))
This operation uses three others (actually, refactorings), that will not be
precisely described here. They are however somewhat similar to the remove-
Class() operation presented above. The first operation, addClass(), adds a new
class to a package, and inserts it between a set of super-classes and a set of
subclasses. The second, addAssociationTo(), creates an association between two
classes. The third, moveTo(), moves a method to another class and creates a
“forwarder” method in the original class.
This transformation should be applied to a class that is to play the role of
real subject 4 . Its application proceeds as follows:
Finally, we would like to show how Action Semantics can support the task of de-
veloping applications that contain multiple aspects. Aspects (or concerns) [17,28]
refer to non-functional requirements that have a global impact on the implemen-
tation. The approach used in dealing with this is to separate these aspects from
the conceptual design, and to introduce them into the system only during the
final coding phase. Ultimately, the merging of aspects should be handled by an
automated tool. In our example, we attempt to show how aspects can be weaved
as early as the design level through model transformation [14], using the Action
Semantics to write the transformation rules.
<<persistent>> <<persistent>>
Customer Address
1.. 1
∗
<<persistent>>
1.. Account
∗
1
number: String
+debit
1..
∗
<<persistent>>
Check
Savings External Checking check_no: String
1 0..∗ amount: Float
interest_rate: Float bank_ref: String +outstanding
PState_Check
<<persistent>> Incarnation_Check
Check flag_incarnation_cheque: String
1 1 1 1 get_check_no(): String
check_no: String get_check_no(): String set_check_no(a_no: String)
amount: Float +pstate set_check_no(a_no: String)
get_amount(): Float
get_amount(): Float
set_amount(a_amount: Float)
set_amount(a_amount: Float)
The createMethod() operation is also defined in the Class context. Its role is
to create a new Method from a string and to add it to the Class:
Class :: createMethod(name : String)
actions:
let newMethod := Method.new
let newMethod.name := name
self .addMethod(newMethod)
let result := newMethod
<<persistent>>
Checking 1
Incarnation_Check
get_check_no():String
1 PState_Checking
1 1 1 set_check_no(a_no:String)
get_number():String get_amount():Float
+pstate +incarnation_check
set_number(a_number:String) set_amount(a_amount:Float)
get_check_no():Strring
0..* +outstanding
set_check_no(a_no:String)
1 1 get_amount():Float
<<persistent>> Incarnation_Checking
+pstate set_amount(a_amt:Float) 1 1
Check
+incarnation_checking get_number():String
check_no:String
set_number(a_number:String)
amount:Float
5 Related work
Because the complete UML specification of a model relies on the use of uninter-
preted entities (strings), with no well-defined and accepted common formalism
and semantics, commercial UML tools often use metaprogramming languages to
manipulate models. This is the case, for instance, of Softeam’s Objecteering that
uses J (a “Java-like” language [25]), and of Rational Rose or Ilogix’ Rhapsody
which both use Visual Basic.
In the worst cases – that is for most of the modeling tools – these statements
are simply inserted at the right place into the code skeleton. The semantics of
execution is then given by the specification of the programming language. Unfor-
tunately, this often implies an over-specification of the problem (for example, in
Java, a sequential execution of the statements of a method is imposed). Verifica-
tion and testing are feasible only when the source code is available, far too late in
the development process. Moreover, the designer must have some knowledge of
the way the code is generated for the whole model to have a good understanding
of the implications of her inserted code (for instance, if you are using Rhapsody
and its C++ code generation tools, a knowledge of the way the tool generate
code for associations is required for using them in your own code).
At best, the modeling tool has its own action language, and then the model
may be executed and simulated in the early development phases, but with the
drawbacks of no standardization, no interoperability, and two formalisms for
the modeler to learn (the UML and the action language). The purpose of these
languages is similar to the one we look for when using the Action Semantics as
a metaprogramming language. There are, however, several advantages in favor
of a standard Action Semantics. Users of these tools have toneed not learn yet
a new language. Thanks to a tight integration into UML, the Action Semantics
leverages other UML facilities, such as OCL, and in particular its navigation
facilities.
As reflection is concerned, we have already pointed out in Section 2 the
similarities and differences between the structural reflection aspects of UML and
those of reflective object-oriented languages. On the behavioural reflection side,
most of the existing models are based on an interpretive or compilative pattern.
In the first case, reflection is introduced in the language by reifying a metacircular
interpreter (consider 3-Lisp and other reflective functional languages), while in
the second it is introduced by reifying compilation strategies in the compiler
either statically (consider OpenC++) or dynamically (consider Smalltalk and
OpenJIT). Elements of the run-time systems are also reified into the language.
Our approach to behavioural reflection in UML is rather based on an ex-
ecution model close to operational semantics where computations are seen as
sequences of states and computation steps transform an initial state into a fol-
lowing state in an history. Thanks to the integration with UML, reflection is
achieved by having states represented as models and the Action Semantics en-
abled to manipulate these models. Hence, reflection in the UML with the AS
appears closer to the work on rewriting systems [19,8] and rewriting logics [20]
than the more traditional interpretive or compilative approaches.
6 Conclusion
With the standardization of the Action Semantics by the OMG, the metalevel
architecture of the UML is now supported by a language allowing the speci-
fication of actions in a portable way. In this paper, we have shown how the
Action Semantics brings a behavioural reflection dimension to the UML. We
have shown that it is not only possible but quite effective to use the AS for ma-
nipulating UML models, including the AS metamodel. Behavioural reflection has
been brought to the fore by a metacircular definition of the Action Semantics. To
enable reflective metamodeling in the AS, we have reified in UML a meta-of link
that allows actions defined in a model to act upon model elements through their
description at the metamodel level, much in the same way code in a reflective
object-oriented language can access class properties through metaclasses.
Applications of reflective modeling with the AS leverages on the UML met-
alevel architecture to provide the benefits of a reflective approach, in terms
of separation of concerns, within a mainstream industrial context. A complete
model can now be built as an ideal model representing the core concepts in the
application, to which non-functional requirements are integrated as fully trace-
able transformations over this ideal model. For example, we have illustrated how
this approach paves the way for powerful UML-defined semantics-based model
transformations such as refactoring, aspect weaving, and application of design
patterns.
An implementation conforming to the current version of the Action Semantics
specification is in development in UMLAUT 5 , a freely available UML modeling
tool. The complete integration between the Action Semantics and the UML in
Umlaut provides an excellent research platform for the implementation of design
patterns, refactorings and aspects.
References
1. J. Bézivin and R. Lemesle. Reflective modelling scheme. In Elec-
tronic Proceedings of the OOPSLA’99 Workshop on Object-Oriented Reflec-
tion and Software Engineering, OORaSE’99, pages 107–122, 1999. web site:
http://www.disi.unige.it/person/CazzolaW/OORaSE99.html.
2. G. Blair, G. Coulson, F. Costa, and H. Duran. On the design of reflective middle-
ware platforms. In Proceedings of the Reflective Middleware Workshop, RM 2000,
2000.
3. D. Bobrow and M. Stefik. The Loops Manual. Xerox PARC, Palo Alto CA, USA,
December 1983.
4. J.-P. Briot and P. Cointe. The OBJVLISP Model: Definition of a Uniform, Reflex-
ive and Extensible Object Oriented Language. In Proceedings of ECAI’86, pages
225–232, 1986.
5. J.-P. Briot and P. Cointe. A Uniform Model for Object-Oriented Languages Using
the Class Abstraction. In Proceedings of IJCAI’87, pages 40–43, 1987.
6. CCITT. Red Book, SDL, Recommendation Z.100 to Z.104, 1984.
7. M. Cinnide and P. Nixon. A methodology for the automated introduction of design
patterns. In International Conference on Software Maintenance, Oxford, 1999.
8. M. Clavel and J. Meseguer. Axiomatizing Reflective Logics and Languages. In Pro-
ceedings of the First International Conference on Reflection, Reflection’96, pages
263–288, 1996.
5
http://www.irisa.fr/UMLAUT/
9. P. Cointe. Metaclasses are first class: the objvlisp model. In Proceedings of OOP-
SLA’87, pages 156–167. ACM, 1987.
10. T. A. S. Consortium. Updated joint initial submission against the action semantics
for uml rfp, 2000.
11. J. Floch. Supporting Evolution and Maintenance by using a Flexible Automatic
Code Generator. In Proceedings of the 17th International Conference on Software
Engineering, pages 211–219, Apr. 1995.
12. E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns: Elements of
Reusable Object-Oriented Software. Addison Wesley, 1995.
13. O. M. Group. Action semantics for the uml rfp, ad/98-11-01, 1998.
14. W. Ho, F. Pennaneac’h, and N. Plouzeau. Umlaut: A framework for weaving
uml-based aspect-oriented designs. In Technology of object-oriented languages and
systems (TOOLS Europe), volume 33, pages 324–334. IEEE Computer Society,
June 2000.
15. R. Keller and R. Schauer. Design components: Towards software composition at
the design level. In Proceedings of the 20th International Conference on Software
Engineering, pages 302–311. IEEE Computer Society Press, Apr. 1998.
16. Kennedy-Carter. Executable UML (xuml), http://www.kc.com/html/xuml.html.
17. G. Kiczales, J. Lamping, A. Menhdhekar, C. Maeda, C. Lopes, J.-M. Loingtier,
and J. Irwin. Aspect-oriented programming. In M. Akşit and S. Matsuoka, ed-
itors, ECOOP ’97 — Object-Oriented Programming 11th European Conference,
Jyväskylä, Finland, volume 1241 of Lecture Notes in Computer Science, pages 220–
242. Springer-Verlag, New York, N.Y., June 1997.
18. P. Kruchten. Rational Unified Process: an Introduction. Addison-Wesley, Read-
ing/MA, 1998.
19. M. Kurihara and A. Ohuchi. An Algebraic Specification and an Object-Oriented
Implementation of a Reflective Language. In Proceedings of the International
Workshop on New Models for Software Architecture ’92, Reflection and Meta-Level
Architectures, pages 137–142, November 1992.
20. J. Malenfant, C. Dony, and P. Cointe. A Semantics of Introspection in a Reflective
Prototype-Based Language. Lisp and Symbolic Computation, Kluwer, 9(2/3):153–
179, May/June 1996.
21. J. McAffer. Meta-level programming with coda. In Proceedings of ECOOP’95,
number 952 in Lecture Notes in Computer Science, pages 190–214. AITO, Springer-
Verlag, 1995.
22. H. Okamura, Y. Ishikawa, and M. Tokoro. Al-1/d: A distributed programming
system with multi-model reflection framework. In A. Yonezawa and B. Smith,
editors, Proceedings of the International Workshop on New Models for Software
Architectures, Reflection and Metalevel Architectures, pages 36–47. RISE (Japan),
ACM Sigplan, JSSST, IPSJ, November 1992.
23. W. F. Opdyke. Refactoring Object-Oriented Frameworks. PhD thesis, University
of Illinois, Urbana-Champaign, 1992. Tech. Report UIUCDCS-R-92-1759.
24. Projtech-Technology. Executable UML, http://www.projtech.com/pubs/xuml.html.
25. Softeam. UML Profiles and the J language: Totally control your application de-
velopment using UML. In http://www.softeam.fr/us/pdf/uml profiles.pdf, 1999.
26. G. Sunyé, A. Le Guennec, and J.-M. Jézéquel. Design pattern application in UML.
In E. Bertino, editor, ECOOP’2000 proceedings, number 1850, pages 44–62. Lecture
Notes in Computer Science, Springer Verlag, June 2000.
27. S. Tan, D. Raila, and R. Campbell. An Object-Oriented Nano-Kernel for Oper-
ating System Hardware Support. In Proceedings of the International Workshop
on Object-Orientation in Operating Systems, IWOOOS’95. IEEE, Coputer Society
Press, 1995.
28. P. Tarr, H. Ossher, and W. Harrison. N degrees of separation: Multi-dimensional
separation of concerns. In ICSE’99 Los Angeles CA, 1999.