ABSTRACT

A software architecture (henceforth architecture) is an abstraction that allows a designer to ignore lowlevel implementation issues, such as programming languages, hardware and device requirements, and communication protocols. Garlan and Perry [1995] state that architectures “simplify our ability to comprehend large systems by presenting them at a level of abstraction at which a system’s high-level design can be understood.” The idea of abstracting away detail to uncover the essential structure of a complex system is very old. The classical notion of architecture abstracts the structure of a building or other human construction away from the entity itself. By 1980, this idea had been adopted by computer engineers and network engineers. Common examples in these domains include RISC architectures, instruction set architectures, shared-memory architectures [Hennessy and Patterson, 1996], layered architectures, TCP/IP architectures, and IP forwarding architectures [Leon-Garcia and Widjaja, 2000].