PREFACE
xxxi
complexity. This gives a solid foundation to the programmer’s intuition and the
programming techniques built on top of it.
A wide variety of languages and programming paradigms can be modeled by
a small set of closely-related kernel languages. It follows that the kernel language
approach is a truly language-independent way to study programming. Since any
given language translates into a kernel language that is a subset of a larger, more
complete kernel language, the underlying unity of programming is regained.
Reducing a complex phenomenon to its primitive elements is characteristic of
the scientiﬁc method. It is a successful approach that is used in all the exact
sciences. It gives a deep understanding that has predictive power. For example,
structural science lets one design
all
bridges (whether made of wood, iron, both,
or anything else) and predict their behavior in terms of simple concepts such as
force, energy, stress, and strain, and the laws they obey [62].
Comparison with other approaches
Let us compare the kernel language approach with three other ways to give pro-
gramming a broad scientiﬁc basis:
•
A
foundational calculus
, like the
λ
calculus or
π
calculus, reduces program-
ming to a minimal number of elements. The elements are chosen to simplify
mathematical analysis, not to aid programmer intuition. This helps theo-
reticians, but is not particularly useful to practicing programmers. Founda-
tional calculi are useful for studying the fundamental properties and limits
of programming a computer, not for writing or reasoning about general
applications.
•
A
virtual machine
deﬁnes a language in terms of an implementation on an
idealized machine. A virtual machine gives a kind of operational semantics,
with concepts that are close to hardware. This is useful for designing com-
puters, implementing languages, or doing simulations. It is not useful for
reasoning about programs and their abstractions.
•
A
multiparadigm language
is a language that encompasses several program-
ming paradigms. For example, Scheme is both functional and imperative
([38]) and Leda has elements that are functional, object-oriented, and logi-
cal ([27]). The usefulness of a multiparadigm language depends on how well
the diﬀerent paradigms are integrated.
The kernel language approach combines features of all these approaches. A well-
designed kernel language covers a wide range of concepts, like a well-designed
multiparadigm language. If the concepts are independent, then the kernel lan-
guage can be given a simple formal semantics, like a foundational calculus. Final-
ly, the formal semantics can be a virtual machine at a high level of abstraction.
This makes it easy for programmers to reason about programs.
Copyright
c
±
2001-3 by P. Van Roy and S. Haridi. All rights reserved.