Gordon Plotkin introduced the structural operational semantics,
Matthias Felleisen and Robert Hieb the reduction semantics, and
Gilles Kahn the natural semantics.
Small-step semantics Structural operational semantics Structural operational semantics (SOS, also called
structured operational semantics or
small-step semantics) was introduced by
Gordon Plotkin in (
Plotkin81) as a logical means to define 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 that 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
Plotkin81 and
Hennessy90, and other textbooks. Let C_1, C_2 range over programs of the language, and let s range over states (e.g. functions from memory locations to values). If we have expressions (ranged over by E), values and locations (L), then a memory update command would have semantics: \frac{\langle E,s\rangle \Rightarrow V}{\langle L:=E\,,\,s\rangle\longrightarrow (s\uplus (L\mapsto V))} Informally, the rule says that "
if the expression E in state s reduces to value V,
then the program L:=E will update the state s with the assignment L=V". The semantics of sequencing can be given by the following three rules: :1. \frac{\langle C_1,s\rangle \longrightarrow s'} {\langle C_1;C_2 \,,s\rangle\longrightarrow \langle C_2, s'\rangle} :2. \frac{\langle C_1,s\rangle \longrightarrow \langle C_1',s'\rangle} {\langle C_1;C_2 \,,s\rangle\longrightarrow \langle C_1';C_2\,, s'\rangle} :3. \frac{} {\langle \mathbf{skip} ,s\rangle\longrightarrow s} Informally, the first rule says that, if program C_1 in state s finishes in state s', then the program C_1;C_2 in state s will reduce to the program C_2 in state s'. (You can think of this as formalizing "You can run C_1, and then run C_2 using the resulting memory store.) The second rule says that if the program C_1 in state s can reduce to the program C_1' with state s', then the program C_1;C_2 in state s will reduce to the program C_1';C_2 in state s'. (You can think of this as formalizing the principle for an optimizing compiler: "You are allowed to transform C_1 as if it were stand-alone, even if it is just the first part of a program.") The semantics is structural, because the meaning of the sequential program C_1;C_2, is defined by the meaning of C_1 and the meaning of C_2. If we also have Boolean expressions over the state, ranged over by B, then we can define the semantics of the
while command: \frac{\langle B,s\rangle \Rightarrow \mathbf{true}}{\langle\mathbf{while}\ B\ \mathbf{ do }\ C,s\rangle\longrightarrow \langle C;\mathbf{while}\ B\ \mathbf{do}\ C,s\rangle} \quad \frac{\langle B,s\rangle \Rightarrow \mathbf{false}}{\langle\mathbf{while}\ B\ \mathbf{ do }\ C,s\rangle\longrightarrow s} 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 (
Plotkin81) has attracted more than 1000 citations according to the CiteSeer making it one of the most cited technical reports in
Computer Science.
Reduction semantics Reduction semantics is an alternative presentation of operational semantics. Its key ideas were first applied to purely functional
call by name and
call by value variants of the
lambda calculus by
Gordon Plotkin in 1975 and generalized to higher-order functional languages with imperative features by
Matthias Felleisen in his 1987 dissertation. The method was further elaborated by Matthias Felleisen and Robert Hieb in 1992 into a fully
equational theory for
control and
state. Reduction semantics are given as a set of
reduction rules that each specify a single potential reduction step. For example, the following reduction rule states that an assignment statement can be reduced if it sits immediately beside its variable declaration: \mathbf{let\ rec}\ x = v_1\ \mathbf{in}\ x \leftarrow v_2;\ e\ \ \longrightarrow\ \ \mathbf{let\ rec}\ x = v_2\ \mathbf{in}\ e To get an assignment statement into such a position it is “bubbled up” through function applications and the right-hand side of assignment statements until it reaches the proper point. Since intervening \mathbf{let} expressions may declare distinct variables, the calculus also demands an extrusion rule for \mathbf{let} expressions. Most published uses of reduction semantics define such “bubble rules” with the convenience of evaluation contexts. For example, the grammar of evaluation contexts in a simple
call by value language can be given as E ::= [\,\ \big|\ v\ E\ \big|\ E\ e\ \big|\ x \leftarrow E \ \big|\ \mathbf{let\ rec}\ x = v\ \mathbf{in}\ E\ \big|\ E;\ e where e denotes arbitrary expressions and v denotes fully-reduced values. Each evaluation context includes exactly one hole [\,] into which a term is plugged in a capturing fashion. The shape of the context indicates with this hole where reduction may occur. To describe “bubbling” with the aid of evaluation contexts, a single axiom suffices: E[\,x \leftarrow v;\ e\,]\ \ \longrightarrow\ \ x \leftarrow v;\ E[\,e\,] \qquad \text{(lift assignments)} This single reduction rule is the lift rule from Felleisen and Hieb's lambda calculus for assignment statements. The evaluation contexts restrict this rule to certain terms, but it is freely applicable in any term, including under lambdas. Following Plotkin, showing the usefulness of a calculus derived from a set of reduction rules demands (1) a Church-Rosser lemma for the single-step relation, which induces an evaluation function, and (2) a Curry-Feys standardization lemma for the transitive-reflexive closure of the single-step relation, which replaces the non-deterministic search in the evaluation function with a deterministic left-most/outermost search. Felleisen showed that imperative extensions of this calculus satisfy these theorems. Consequences of these theorems are that the equational theory—the symmetric-transitive-reflexive closure—is a sound reasoning principle for these languages. However, in practice, most applications of reduction semantics dispense with the calculus and use the standard reduction only (and the evaluator that can be derived from it). Reduction semantics are particularly useful given the ease by which evaluation contexts can model state or unusual control constructs (e.g.,
first-class continuations). In addition, reduction semantics have been used to model
object-oriented languages,
contract systems, exceptions, futures, call-by-need, and many other language features. A thorough, modern treatment of reduction semantics that discusses several such applications at length is given by Matthias Felleisen, Robert Bruce Findler and Matthew Flatt in
Semantics Engineering with PLT Redex.
Big-step semantics Natural semantics Big-step structural operational semantics is also known under the names
natural semantics,
relational semantics and
evaluation semantics. Big-step operational semantics was introduced under the name
natural semantics by
Gilles Kahn when presenting Mini-ML, a pure dialect of
ML. One can view big-step definitions as definitions of functions, or more generally of relations, interpreting each language construct in an appropriate domain. Its intuitiveness makes it a popular choice for semantics specification in programming languages, but it has some drawbacks that make it inconvenient or impossible to use in many situations, such as languages with control-intensive features or concurrency. A big-step semantics describes in a divide-and-conquer manner how final evaluation results of language constructs can be obtained by combining the evaluation results of their syntactic counterparts (subexpressions, substatements, etc.). == Comparison ==