The operational semantics for a programming language describes how a valid program is interpreted as sequences of computational steps. These sequences then are the meaning of the program. In the context of functional programs, the final step in a terminating sequence returns the value of the program. (In general there can be many computation sequences and many return values for a single program, because the program could be nondeterministic.)
For the first time, the concept of operational semantics was used in defining the semantics of Algol 68. The following statement is a quote from the revised ALGOL 68 report:
The meaning of a program in the strict language is explained in terms of a hypothetical computer which performs the set of actions which constitute the elaboration of that program. (Algol68, Section 2)
The first use of the word "operational semantics" in its present meaning is attributed to Dana Scott (Plotkin04b). What follows is a quote from Scott's seminal paper on formal semantics, in which he mentions the "operational" aspects of semantics.
It is all very well to aim for a more ‘abstract’ and a ‘cleaner’ approach to semantics, but if the plan is to be any good, the operational aspects cannot be completely ignored. (Scott70)
Structural Operational Semantics (SOS) was introduced by Gordon Plotkin in (Plotkin04a) as a logical means to defining operational semantics. The basic idea behind SOS is to define the behavior of a program in terms of the behavior of its parts, thus providing a structural, i.e., syntax oriented and inductive, view on operational semantics. An SOS specification defines the behavior of a program in terms of a (set of) transition relation(s). SOS specifications take the form of a set of inference rules which define the valid transitions of a composite piece of syntax in terms of the transitions of its components.
For a simple example, we consider part of the semantics of a simple programming language; proper illustrations are given in Plotkin04a and Hennessy90, and other textbooks. Let range over programs of the language, and let range over states (e.g. functions from memory locations to values). If we have expressions (ranged over by ), values () and locations (), then a memory update command would have semantics
Informally, the rule says that "if the expression in state reduces to value , then the program will update the state with the assignment ".
The semantics of sequencing can be given by the following rules
Informally, the first rule says that, if the program in state can reduce to the program with state , then the program in state will reduce to the program . The second rule says that if program in state finishes in state , then the program in state will reduce to the program in state . The semantics is structural, because the meaning of the sequential program , is defined by the meaning of and the meaning of .
If we also have Boolean expressions over the state, ranged over by , then we can define the semantics of the while command:
Such a definition allows formal analysis of the behavior of programs, permitting the study of relations between programs. Important relations include simulation preorders and bisimulation. These are especially useful in the context of concurrency theory.
Thanks to its intuitive look and easy to follow structure, SOS has gained great popularity and has become a de facto standard in defining operational semantics. As a sign of success, the original report (so-called Aarhus report) on SOS (Plotkin04a) has attracted some 900 citations according to the CiteSeer , making it one of the most cited technical reports in Computer Science.