2207 Chap01
2207 Chap01
DAVID GARLAN
MARY SHAW
School of Computer Science, Carnegie Mellon University
Pittsburgh, PA 15213, USA
ABSTRACT
As the size of software systems increases, the algorithms and data structures of
the computation no longer constitute the major design problems. When systems
are constructed from many components, the organization of the overall system -
the software architecture - presents a new set of design problems. This level of
design has been addressed in a number of ways including informal diagrams and
descriptive terms, module interconnection languages, templates and frameworks for
systems that serve the needs of specific domains, and formal models of component
integration mechanisms.
In this paper, we provide an introduction to the emerging field of software
architecture. We begin by considering a number of common architectural styles
upon which many systems are currently based and show how different styles can
be combined in a single design. Then we present six case studies to illustrate how
architectural representations can improve our understanding of complex software
systems. Finally, we survey some of the outstanding problems in the field, and
consider a few of the promising research directions.
1. Introduction
As the size and complexity of software systems increases, the design problem goes
beyond the algorithms and data structures of the computation: designing and spec-
ifying the overall system structure emerges as a new kind of problem. Structural
issues include gross organization and global control structure; protocols for com-
munication, synchronization, and data access; assignment of functionality to design
elements; physical distribution; composition of design elements; scaling and perfor-
mance; and selection among design alternatives.
This is the software architecture level of design. There is a considerable body
of work on this topic, including module interconnection languages, templates and
frameworks for systems that serve the needs of specific domains, and formal models
of component integration mechanisms. In addition, an implicit body of work exists
in the form of descriptive terms used informally to describe systems. And while there
is not currently a well-defined terminology or notation to characterize architectural
structures, good software engineers make common use of architectural principles
when designing complex software. Many of the principles represent rules of thumb
or idiomatic patterns that have emerged informally over time. Others are more
carefully documented as industry and scientific standards.
It is increasingly clear that effective software engineering requires facility in
architectural software design. First, it is important to be able to recognize common
paradigms so that high-level relationships among systems can be understood and
so that new systems can be built as variations on old systems. Second, getting
the right architecture is often crucial to the success of a software system design;
2 Chapter 1: An Introduction to Software Architecture
the wrong one can lead to disastrous results. Third, detailed understanding of
software architectures allows the engineer to make principled choices among design
alternatives. Fourth, an architectural system representation is often essential to the
analysis and description of the high-level properties of a complex system.
In this paper, we provide an introduction to the field of software architecture.
The purpose is to illustrate the current state of the discipline and examine the ways
in which architectural design can impact software design. The material presented
here is selected from a semester course, Architectures for Software Systems, taught
at CMU by the authors [1]. Naturally, a short paper such as this can only briefly
highlight the main features of the terrain. This selection emphasizes informal de-
scriptions, omitting much of the course's material on specification, evaluation, and
selection among design alternatives. We hope, nonetheless, that this will serve to
illuminate the nature and significance of this emerging field.
In the following section, we outline a number of common architectural styles
upon which many systems are currently based, and show how heterogeneous styles
can be combined in a single design. Next, we use six case studies to illustrate how
architectural representations of a software system can improve our understanding of
complex systems. Finally, we survey some of the outstanding problems in the field
and consider a few of the promising research directions.
The text that makes up the bulk of this article has been drawn from numerous
other publications by the authors. The taxonomy of architectural styles and the
case studies have incorporated parts of several published papers [1, 2, 3, 4]. To a
lesser extent material has been drawn from other articles by the authors [5, 6, 7].
2. F r o m P r o g r a m m i n g L a n g u a g e s t o Software A r c h i t e c t u r e
One characterization of progress in programming languages and tools has been regu-
lar increases in abstraction level—or the conceptual size of software designers build-
ing blocks. To place the field of Software Architecture into perspective let us begin by
looking at the historical development of abstraction techniques in computer science.
• the software structure (which included a representation package with its primitive
operators),
• integrity of the result (invariants of data structures and protection from other
manipulation),
The effect of this work was to raise the design level of certain elements of soft-
ware systems, namely abstract data types, above the level of programming language
statements or individual algorithms. This form of abstraction led to an understand-
ing of a good organization for an entire module that serves one particular purpose.
This involved combining representations, algorithms, specifications, and functional
interfaces in uniform ways. Certain support was required from the programming
language, of course, but the abstract data type paradigm allowed some parts of sys-
tems to be developed from a vocabulary of data types rather than from a vocabulary
of programming-language constructs.
software system designers now recognize useful system organizations. One of these is
based on the theory of abstract data types. But this is not the only way to organize
a software system.
Many other organizations have developed informally over time, and are now part
of the vocabulary of software system designers. For example, typical descriptions of
software architectures include synopses such as (italics ours):
• "Camelot is based on the client-server model and uses remote procedure calls
both locally and remotely to provide communication among applications and
servers." [8]
• "The easiest way to make the canonical sequential compiler into a concurrent
compiler is to pipeline the execution of the compiler phases over a number of pro-
cessors. . . . A more effective way [is to] split the source code into many segments,
which are concurrently processed through the various phases of compilation [by
multiple compiler processes] before a final, merging pass recombines the object
code into a single program." [11]
Other software architectures are carefully documented and often widely dis-
seminated. Examples include the International Standard Organization's Open Sys-
tems Interconnection Reference Model (a layered network architecture) [12], the
NIST/ECMA Reference Model (a generic software engineering environment archi-
tecture based on layered communication substrates) [13, 14], and the X Window
System (a distributed windowed user interface architecture based on event trigger-
ing and callbacks) [15].
We are still far from having a well-accepted taxonomy of such architectural
paradigms, let alone a fully-developed theory of software architecture. But we can
now clearly identify a number of architectural patterns, or styles, that currently form
the basic repertoire of a software architect.
3. C o m m o n Architectural Styles
We now examine some of these representative, broadly-used architectural styles. Our
purpose is to illustrate the rich space of architectural choices, and indicate what are
some of the trade-offs in choosing one style over another.
To make sense of the differences between styles, it helps to have a common
framework from which to view them. The framework we will adopt is to treat an
architecture of a specific system as a collection of computational components—or
simply components—together with a description of the interactions between these
components—the connectors. Graphically speaking, this leads to a view of an ab-
stract architectural description as a graph in which the nodes represent the compo-
nents and the arcs represent the connectors. As we will see, connectors can represent
interactions as varied as procedure call, event broadcast, database queries, and pipes.
Common Architectural Styles 5
1
In general, we find that the boundaries of styles can overlap. This should not deter us from
identifying the main features of a style with its central examples use.
6 Chapter 1: An Introduction to Software Architecture
Filters
Pipes
2
This is true in spite of the fact that pipes and filters, like every style, has a set of devout
religious followers - people who believe that all problems worth solving can best be solved using
that particular style.
Common Architectural Styles 7
filter systems, where filters do need not know what other filters are in the system in
order to interact with them. The significance of this is that whenever the identity
of an object changes it is necessary to modify all other objects that explicitly invoke
it. In a module-oriented language this manifests itself as the need to change the
"import" list of every module that uses the changed module. Further there can be
side-effect problems: if A uses object B and C also uses B, then C's effects on B look
like unexpected side effects to A, and vice versa.
Usually
procedure calls ^""~ ~^
w^ — ' Useful Systems
/ ^ ^ * ^ Basic Utility
Core
Level
Composites of ^ \x
various elements
Figure 3: Layered Systems
3.5. Repositories
In a repository style there are two quite distinct kinds of components: a central data
structure represents the current state, and a collection of independent components
operate on the central data store. Interactions between the repository and its external
components can vary significantly between systems.
The choice of control discipline leads to major subcategories. If the types of trans-
actions in an input stream of transactions trigger selection of processes to execute,
the repository can be a traditional database. If the current state of the central data
structure is the main trigger of selecting processes to execute, the repository can be
a blackboard.
Figure 4 illustrates a simple view of a blackboard architecture. (We will examine
more detailed models in the case studies.) The blackboard model is usually presented
with three major parts:
T h e knowledge sources: separate, independent parcels of application-dependent
knowledge. Interaction among knowledge sources takes place solely through
the blackboard.
The blackboard data structure: problem-solving state data, organized into an
application-dependent hierarchy. Knowledge sources make changes to the black-
board that lead incrementally to a solution to the problem.
Blackboard
(shared
uc ks3
data)
^^^[ks4j
Memory
Blackboard systems have traditionally been used for applications requiring com-
plex interpretations of signal processing, such as speech and pattern recognition.
Several of these are surveyed by Nii [34]. They have also appeared in other kinds of
systems that involve shared access to data with loosely coupled agents [35].
There are, of course, many other examples of repository systems. Batch-sequential
systems with global databases are a special case. Programming environments are
often organized as a collection of tools together with a shared repository of programs
and program fragments [36]. Even applications that have been traditionally viewed
as pipeline architectures, may be more accurately interpreted as repository systems.
For example, as we will see later, while a compiler architecture has traditionally been
presented as a pipeline, the "phases" of most modern compilers operate on a base of
shared information (symbol tables, abstract syntax tree, etc.).
Program
Being
Interpreted
Computation
state machine
Data access
Fetch/store
Figure 5: Interpreter
organized around a main program and a set of subroutines. The main program
acts as the driver for the subroutines, typically providing a control loop for
sequencing through the subroutines in some order.
4. Case Studies
We now present six examples to illustrate how architectural principles can be used to
increase our understanding of software systems. The first example shows how different
architectural solutions to the same problem provide different benefits. The second case
study summarizes experience in developing a a domain-specific architectural style for
a family of industrial products. The third case study examines the familiar compiler
architecture in a fresh light. The remaining three case studies present examples of
the use of heterogeneous architectures.
The KWIC [Key Word in Context] index system accepts an ordered set of
lines, each line is an ordered set of words, and each word is an ordered set
of characters. Any line may be "circularly shifted" by repeatedly removing
the first word and appending it at the end of the line. The KWIC index
system outputs a listing of all circular shifts of all lines in alphabetical
order.
Parnas used the problem to contrast different criteria for decomposing a system
into modules. He describes two solutions, one based on functional decomposition with
shared access to data representations, and a second based on a decomposition that
hides design decisions. Since its introduction, the problem has become well-known
and is widely used as a teaching device in software engineering. Garlan, Kaiser, and
Notkin also use the problem to illustrate modularization schemes based on implicit
invocation [7].
While KWIC can be implemented as a relatively small system it is not simply of
pedagogical interest. Practical instances of it are widely used by computer scientists.
For example, the "permuted" [sic] index for the Unix Man pages is essentially such a
system.
From the point of view of software architecture, the problem derives its appeal
from the fact that it can be used to illustrate the effect of changes on software design.
Parnas shows that different problem decompositions vary greatly in their ability to
withstand design changes. Among the changes he considers are:
• Changes in processing algorithm: For example, line shifting can be performed
on each line as it is read from the input device, on all the lines after they are
read, or on demand when the alphabetization requires a new set of shifted lines.
• Changes in data representation: For example, lines can be stored in various
ways. Similarly, circular shifts can be stored explicitly or implicitly (as pairs of
index and offset).
Garlan, Kaiser, and Notkin, extend Parnas' analysis by considering:
• Enhancement to system function: For example, modify the system so that
shifted lines to eliminate circular shifts that start with certain noise words (such
as "a", "an", "and", etc.). Change the system to be interactive, and allow the
user to delete lines from the original (or, alternatively, from circularly shifted)
lists.
Case Studies 15
z\
Master Control
Subprogram Call
System I/O
Alphabetized
Characters
Index
1
Output
Input
Medium
Medium
We now outline four architectural designs for the KWIC system. All four are
grounded in published solutions (including implementations). The first two are those
considered in Parnas' original article. The third solution is based on the use of
an implicit invocation style and represents a variant on the solution examined by
Garlan, Kaiser, and Notkin. The fourth is a pipeline solution inspired by the Unix
index utility.
After presenting each solution and briefly summarizing its strengths and weakness,
we contrast the different architectural decompositions in a table organized along the
five design dimensions itemized above.
Input Output
M \f
I V \t 1
Alphabetic
ire
Characters Circular Shift Shifts
Input Output
Medium Medium
Input Output
Medium
Medium Lines Lines Z2
Figure 8: KWIC - Implicit Invocation Solution
Input Circular
Input
Medium - > •
Shift
Pipe
System I/O Output
—> Alphabetizer —> Output
Medium
compute. Data sharing between filters is strictly limited to that transmitted on pipes.
(See Figure 9.)
This solution has several nice properties. First, it maintains the intuitive flow of
processing. Second, it supports reuse, since each filter can function in isolation (pro-
vided upstream filters produce data in the form it expects). New functions are easily
added to the system by inserting filters at the appropriate point in the processing
sequence.
On the other hand it has a number of drawbacks. First, it is virtually impossible
to modify the design to support an interactive system. For example, in order to delete
a line, there would have to be some persistent shared storage, violating a basic tenet
of this approach. Second, the solution is inefficient in terms of its use of space, since
each filter must copy all of the data to its output ports.
4-1.5. Comparisons
The solutions can be compared by tabulating their ability to address the design consid-
erations itemized earlier. A detailed comparison would have to involve consideration
of a number of factors concerning the intended use of the system: for example, is it
batch or interactive, update-intensive or query-intensive, etc.
Figure 10 provides an approximation to such an analysis, based on the discussion
of architectural styles introduced earlier. As Parnas pointed out, the shared data
solution is particularly weak in its support for changes in the overall processing algo-
rithm, data representations, and reuse. On the other hand it can achieve relatively
good performance, by virtue of direct sharing of data. Further, it is relatively easy to
add a new processing component (also accessing the shared data). The abstract data
type solution allows changes to data representation and supports reuse, without nec-
essarily compromising performance. However, the interactions between components
in that solution are wired into the modules themselves, so changing the overall pro-
cessing algorithm or adding new functions may involve a large number of changes to
the existing system. The implicit invocation solution is particularly good for adding
new functionality. However, it suffers from some of the problems of the shared data
approach: poor support for change in data representation and reuse. Moreover, it
may introduce extra execution overhead. The pipe and filter solution allows new
filters to be placed in the stream of text processing. Therefore it supports changes in
processing algorithm, changes in function, and reuse. On the other hand, decisions
about data representation will be wired into the assumptions about the kind of data
that is transmitted along the pipes. Further, depending on the exchange format,
Case Studies 19
there may be additional overhead involved in parsing and unparsing the data onto
pipes.
oscilloscope
object
waveform
software architecture that formed the basis of the next generation of Tektronix oscil-
loscopes. Since then the framework has been extended and adapted to accommodate
a broader class of system, while at the same time being better adapted to the specific
needs of instrumentation software.
In the remainder of this section, we outline the stages in this architectural devel-
opment.
User interface
enforced by the layers conflicted with the needs for interaction between the various
functions. For example, the model suggests that all user interactions with an oscillo-
scope should be in terms of the visual representations. But in practice real oscilloscope
users need to directly affect the functions in all layers, such as setting attenuation
in the signal manipulation layer, choosing acquisition mode and parameters in the
acquisition layer, or creating derived waveforms in the waveform manipulation layer.
The third attempt yielded a model in which oscilloscope functions were viewed as
incremental transformers of data. Signal transformers serve to condition external sig-
nals. Acquisition transformers derive digitized waveforms from these signals. Display
transformers convert these waveforms into visual data. (See Figure 13.)
This architectural model was a significant improvement over the layered model
in that it did not isolate the functions in separate partitions. For example, nothing
in this model would prevent signal data directly feeding into display filters. Further,
the model corresponded well to the engineers' view of signal processing as a dataflow
problem.
The main problem with the model was that it was not clear how the user should
interact with it. If the user were simply at one end of the system, then this would
represent an even worse decomposition than the layered system.
22 Chapter 1: An Introduction to Software Architecture
4-2.6. Summary
This case study illustrates the issues involved in developing an architectural style for
a real application domain. It underscores the fact that different architectural styles
have different effects on the ability to solve a set of problems. Moreover, it illustrates
that architectural designs for industrial software must typically be adapted from pure
forms to specialized styles that meet the needs of the specific domain. In this case,
the final result depended greatly on the properties of pipe and filter architectures, but
found ways to adapt that generic style so that it could also satisfy the performance
needs of the product family.
Text Code
Computations
(transducers and Tree Datalefch/store
transforms)
Might be
rule-based
the tree, it becomes natural to re-draw the architecture as in Figure 18. Now the con-
nections between passes denote control flow, which is a more accurate depiction; the
rather stronger connections between the passes and the tree/symbol table structure
denote data access and manipulation. In this fashion, the architecture has become a
repository, and that is indeed a more appropriate way to think about a compiler of
this class.
Happily, this new view also accommodates various tools that operate on the inter-
nal representation rather than the textual form of a program; these include syntax-
directed editors and various analysis tools.
Note that this repository resembles a blackboard in some respects and differs
in others. Like a blackboard, the information of the computation is located cen-
trally and operated on by a number of independent computations which interact only
through the shared data. However, whereas the execution order of the operations in
a blackboard is determined by the types of the incoming database modifications, the
execution order of the compiler is predetermined.
4-4- Case 4: A Layered Design with Different Styles for the Layers
The PROVOX system by Fisher Controls offers distributed process control for chem-
ical production processes [43]. Process control capabilities range from simple control
loops that control pressure, flow, or levels to complex strategies involving interre-
lated control loops. Provisions are made for integration with plant management and
information systems in support of computer integrated manufacturing. The system
architecture integrates process control with plant management and information sys-
tems in a 5-level layered hierarchy. Figure 19 shows this hierarchy: the right side is
the software view, and the left side is the hardware view. Each level corresponds to
a different process management function with its own decision-support requirements.
Different kinds of computation and response times are required at different levels
of this hierarchy. Accordingly, different computational models are used. Levels 1 to 3
are object-oriented; Levels 4 and 5 are largely based on conventional data-processing
repository models. For present purposes it suffices to examine the object-oriented
model of Level 2 and the repositories of Levels 4 and 5.
For the control and monitoring functions of Level 2, PRO VOX uses a set of points,
or loci of process control. Figure 20 shows the canonical form of a point definition;
seven specialized forms support the most common kinds of control. Points are, in
essence, object-oriented design elements that encapsulate information about control
points of the process. The points are individually configured to achieve the desired
control strategy. Data associated with a point includes: Operating parameters, in-
cluding current process value, setpoint (target value), valve output, and mode (au-
Case Studies 27
TAG
TAG
TAG
TAG
tomatic or manual). Tuning parameters, such as gain, reset, derivative, and alarm
trip-points. Configuration parameters, including tag (name) and I/O channels.
In addition, the point's data can include a template for a control strategy. Like any
good object, a point also includes procedural definitions such as control algorithms,
communication connections, reporting services, and trace facilities. A collection of
points implements the desired process control strategy through the communication
services and through the actual dynamics of the process (e.g., if one point increases
flow into a tank, the current value of a point that senses tank level will reflect this
change). Although the communication through process state deviates from the usual
procedural or message-based control of objects, points are conceptually very like
objects in their encapsulation of essential state and action information.
Reports from points appear as input transactions to data collection and analysis
processes at higher design levels. The organization of the points into control processes
can be defined by the designer to match the process control strategy. These can be
further aggregated into Plant Process Areas (points related to a set of equipment such
as a cooling tower) and thence into Plant Management Areas (segments of a plant
that would be controlled by single operators).
PROVOX makes provisions for integration with plant management and business
systems at Levels 4 and 5. Selection of those systems is often independent of pro-
cess control design; PROVOX does not itself provide MIS systems directly but does
provide for integrating a conventional host computer with conventional database man-
agement. The data collection facilities of Level 3, the reporting facilities of Level 2,
and the network that supports distributed implementation suffice to provide pro-
cess information as transactions to these databases. Such databases are commonly
designed as repositories, with transaction processing functions supporting a central
data store—quite a different style from the object-oriented design of Level 2.
The use of hierarchical layers at the top level of a system is fairly common. This
permits strong separation of different classes of function and clean interfaces between
the layers. However, within each layer the interactions among components are often
28 Chapter 1: An Introduction to Software Architecture
Knowledge Base
Memor
:^n
Incuts Working
Memory
i
Computation
state mach '
Data Updates
Rule
antecedent
subexpressions
Unfinished Data-flow
^actions network
for partially
Execution evaluated
stack rule activations
Agenda
Control
procedures
Preferences ' •
and
priorities
Metarules
simple interpreter vanishes in a sea of new interactions and data flows. Although the
interfaces among the original modules remain, they are not distinguished from the
newly-added interfaces.
However, the interpreter model can be rediscovered by identifying the components
of Figure 22 with their design antecedents in Figure 21. This is done in Figure 23.
Viewed in this way, the elaboration of the design becomes much easier to explain and
understand. For example, we see that:
• The knowledge base remains a relatively simple memory structure, merely gain-
ing substructure to distinguish active from inactive contents.
• The rule interpreter is expanded with the interpreter idiom (that is, the inter-
pretation engine of the rule-based system is itself implemented as a table-driven
interpreter), with control procedures playing the role of the pseudo-code to be
executed and the execution stack the role of the current program state.
• "Rule and data element selection" is implemented primarily as a pipeline that
progressively transforms active rules and facts to prioritized activations; in this
pipeline the third filter ("nominators") also uses a fixed database of metarules.
• Working memory is not further elaborated.
The interfaces among the rediscovered components are unchanged from the simple
model except for the two bold lines over which the interpreter controls activations.
This example illustrates two points. First, in a sophisticated rule-based system
the elements of the simple rule-based system are elaborated in response to execution
characteristics of the particular class of languages being interpreted. If the design
is presented in this way, the original concept is retained to guide understanding and
later maintenance. Second, as the design is elaborated, different components of the
simple model can be elaborated with different idioms.
Note that the rule-based model is itself a design structure: it calls for a set of
rules whose control relations are determined during execution by the state of the
computation. A rule-based system provides a virtual machine—a rule executor—to
support this model.
Knowledge Base
Working Memory
Rule Interpreter
Condition
Level n Action
Condition
Action
Level 3
i^ Condition
Level 2
Condition Pah
Action
Level 1 blackboard
^Stimulus
Iphange
Response Frame
V
Blackboard Scheduling
Monitor Queue
Control flow
Data flow I
1.
Focus of
Control Scheduler
Database
5. P a s t , P r e s e n t , and F u t u r e
We have outlined a number of architectural styles and shown how they can be applied
and adapted to specific software systems. We hope that this has convinced the reader
that analysis and design of systems in terms of software architecture is both viable
and worth doing. Further we hope to have made it clear that an understanding of
the emerging vocabulary of architectural styles is a significant—if not necessary—
intellectual tool for the software engineer.
There is, of course, much more to software architecture than we have had space
to cover. In particular, we have said very little about existing results in the areas of
analysis, formal specification, domain-specific architectures, module interconnection
languages, and special-architecture tools.
This is not to say that more work isn't needed. Indeed, we can expect to see
significant advances in a number of areas including:
• Better taxonomies of architectures and architectural styles.
• Formal models for characterizing and analyzing architectures.
• Better understanding of the primitive semantic entities from which these styles
are composed.
• Notations for describing architectural designs.
34 Chapter 1: An Introduction to Software Architecture
Condition
Not relevant
to blackboard
model
^Response Frame
Acknowledgements
We gratefully acknowledge our many colleagues who have contributed to the ideas
presented in this paper. In particular, we would like to thank Chris Okasaki, Curtis
Scott, and Roy Swonger for their help in developing the course from which much of this
material was drawn. We thank David Notkin, Kevin Sullivan, and Gail Kaiser for their
contribution towards understanding event-based systems. Rob Allen helped develop a
rigorous understanding of the pipe and filter style. We would like to acknowledge the
oscilloscope development team at Tektronix, and especially Norm Delisle, for their
part in demonstrating the value of domain-specific architectural styles in an industrial
context. Finally, we would like to thank Barry Boehm, Larry Druffle, and Dilip Soni
for their constructive comments on early drafts of the paper.
This work was funded in part by the Department of Defense Advanced Research
Project Agency under grant MDA972-92-J-1002, by National Science Foundation
Grants CCR-9109469 and CCR-9112880, and by a grant from Siemens Corporate
Research. It was also funded in part by the Carnegie Mellon University School of
Computer Science and Software Engineering Institute (which is sponsored by the
U.S. Department of Defense). The views and conclusions contained in this document
are those of the authors and should not be interpreted as representing the official
policies, either expressed or implied, of the U.S. Government, the Department of
Defense, the National Science Foundation, Siemens Corporation, or Carnegie Mellon
University.
6. References
[1] D. Garlan, M. Shaw, C. Okasaki, C. Scott, and R. Swonger, "Experience with
a course on architectures for software systems," in Proceedings of the Sixth SEI
Conference on Software Engineering Education, Springer Verlag, LNCS 376, Oc-
tober 1992.
[2] M. Shaw, "Toward higher-level abstractions for software systems," in Data &
Knowledge Engineering, vol. 5, pp. 119-128, North Holland: Elsevier Science
Publishers B.V., 1990.
[4] M. Shaw, "Software architectures for shared information systems," in Mind Mat-
ters: Contributions to Cognitive and Computer Science in Honor of Allen Newell,
Erlbaum, 1993.
[5] R. Allen and D. Garlan, "A formal approach to software architectures," in Pro-
ceedings of IFIP'92 (J. van Leeuwen, ed.), Elsevier Science Publishers B.V.,
September 1992.
[6] D. Garlan and D. Notkin, "Formalizing design spaces: Implicit invocation mech-
anisms," in VDM'91: Formal Software Development Methods, (Noordwijkerhout,
The Netherlands), pp. 31-44, Springer-Verlag, LNCS 551, October 1991.
[7] D. Garlan, G. E. Kaiser, and D. Notkin, "Using tool abstraction to compose
systems," IEEE Computer, vol. 25, June 1992.
[8] A. Z. Spector et al., "Camelot: A distributed transaction facility for Mach and
the Internet - an interim report," Tech. Rep. CMU-CS-87-129, Carnegie Mellon
University, June 1987.
[9] M. Fridrich and W. Older, "Helix: The architecture of the XMS distributed file
system," IEEE Software, vol. 2, pp. 21-29, May 1985.
10] M. A. Linton, "Distributed management of a software database," IEEE Software,
vol. 4, pp. 70-76, November 1987.
11] V. Seshadri et al., "Semantic analysis in a concurrent compiler," in Proceed-
ings of ACM SIGPLAN '88 Conference on Programming Language Design and
Implementation, ACM SIGPLAN Notices, 1988.
12] M. C. Paulk, "The ARC Network: A case study," IEEE Software, vol. 2, pp. 6 1 -
69, May 1985.
13] M. Chen and R. J. Norman, "A framework for integrated case," IEEE Software,
vol. 9, pp. 18-22, March 1992.
14] "NIST/ECMA reference model for frameworks of software engineering environ-
ments." NIST Special Publication 500-201, December 1991.
15] R. W. Scheifler and J. Gettys, "The X window system," ACM Transactions on
Graphics, vol. 5, pp. 79-109, Apr. 1986.
16] M. J. Bach, The Design of the UNIX Operating System, ch. 5.12, pp. 111-119.
Software Series, Prentice-Hall, 1986.
17] N. Delisle and D. Garlan, "Applying formal specification to industrial problems:
A specification of an oscilloscope.," IEEE Software, September 1990.
18] G. Kahn, "The semantics of a simple language for parallel programming," Infor-
mation Processing, 1974.
19] M. R. Barbacci, C. B. Weinstock, and J. M. Wing, "Programming at the
processor-memory-switch level," in Proceedings of the 10th International Confer-
ence on Software Engineering, (Singapore), pp. 19-28, IEEE Computer Society
Press, April 1988.
38 Chapter 1: An Introduction to Software Architecture
[21] W. Harrison, "RPDE 3 : A framework for integrating tool fragments," IEEE Soft-
ware, vol. 4, Nov. 1987.
[23] S. P. Reiss, "Connecting tools using message passing in the field program devel-
opment environment," IEEE Software, July 1990.
[25] R. M. Balzer, "Living with the next generation operating system," in Proceedings
of the 4th World Computer Conference, Sept. 1986.
[26] G. Krasner and S. Pope, "A cookbook for using the model-view-controller user
interface paradigm in Smalltalk-80," Journal of Object Oriented Programming,
vol. 1, pp. 26-49, August/September 1988.
[31] G. R. McClain, ed., Open Systems Interconnection Handbook. New York, NY:
Intertext Publications McGraw-Hill Book Company, 1991.
[34] H. P. Nii, "Blackboard systems Parts 1 k 2," AI Magazine, vol. 7 nos 3 (pp.
38-53) and 4 (pp. 62-69), 1986.