Modeling and simulation are enablers for principled (software) system design.
From the modeling point of view, implementation details are not interesting and are thus neglected by designers who reason at a high level of abstraction. By neglecting this information, a system can be modeled in formalisms such as statecharts and DEVS. Such formalisms are much more abstract and formal than a piece of code written in a specific programming language. Certain properties, such as reachable states or deadlocks, can be proved or disproved with the assistance of model-checking tools. In this way, most of the problems are solved in the design phase, and manual implementation is kept minimal. All these result in higher stability, better maintainability and less potential errors in the systems.
Some of the modeling formalisms provide a rigorous way to specify interfaces (e.g., class diagrams), interaction protocols (e.g., activity diagrams and sequence diagrams) and behavior (e.g., statecharts and DEVS). The combined use of them protects the internal structure of components (modular parts of a system), while still revealing enough information to the outside world to ensure reusability. For example, in the UML (Unified Modeling Language) 2.0, the interface of a component is defined by a class diagram. The associations between classes reflect the relations between them. Sequence diagrams are used to illustrate the interaction between different components (of the same type or of different types). They influence each other at run-time by means of messages. Finally, the full internal behavior of these components is specified with statecharts, which give an executable semantics to them. With this semantics, simulation as well as code synthesis of the system becomes possible.
Specifying the complete behavior with a formalism is analogous with implementation. However, this approach differs from the traditional implementation phase in that by specifying a system in a formal way, the designers are able to fully predict its run-time behavior and prove its correctness. The models can be simulated in appropriate environments. Code can be automatically synthesized with code generators. Those tools save human labor and greatly increase productivity.