The execution of programming languages in general can be performed in three different ways:
Interpretation is used for the definition of the operational semantics
and in prototypical implementations of all kinds of programming languages.
In order to obtain efficiency, compilation is needed. Programming languages
complying with the imperative programming style imposed by the
von Neumann architecture
are usually compiled into native machine code.
For a language like PROLOG which cannot be easily mapped
into the imperative
programming paradigm, the compilation
into an
abstract machine especially
designed for it is usually a good compromise w.r.t. efficiency and
development costs. The machine code for such an abstract machine is
interpreted by an ordinary (but of course highly optimized) imperative
program in contrast to the execution of native machine code
with a hardware-encoded interpreter (a processor).
In case of relational programming languages, for quite some time
only interpreters
existed. In 1967, Absys (Aberdeen System),
an interpreter for (a predecessor of) pure PROLOG, was developed
at the University of Aberdeen.
In 1977, David H. D. Warren et. al. developed DEC-10 PROLOG, the first
PROLOG compiler, and in 1983, he designed the WAM
[\protect\citeauthoryearWarren1983]
,
the abstract machine that has become the de facto standard
implementation technique for relational languages
[\protect\citeauthoryearVan Roy1994]
.
The WAM can be characterized as follows:
Since the coupling of the WAM and the LLAMA is loose, a deep understanding
of the WAM will not be required. Only