Much fundamental research in computer science is driven by two complementary
notions of beauty in programming, that arising from the structure of a program
and that arising from the e_ciency of an algorithm. As Lewin famously said,
here's nothing so practical as good theory" [Marrow, 1984]. Decades of expe-
rience has borne out the remarkable e_cacy of theory in improving the practice
of programming.
Programming language theory is the study of the structural aspects of pro-
gramming. The central notion is that of compositionality, the construction of a
program by composition of separable parts. Results are formulated in terms of
programming languages de_ned by type systems, which mediate composition of
components, and semantics, which determines the execution behavior of those
programs. Notable theorems include the parametricity theorem, which provides
the mathematical foundation for the informal concept of data abstraction.
Algorithm theory is the study of the e_ciency aspects of programming. The
central notion is of asymptotic analysis of the time and space usage of a pro-
gram, expressed in terms of a size measure or a probability distribution on the
inputs. Results are formulated in terms of machine models of computation,
such as TM's or RAM's, which de_ne the basic steps of an algorithm and their
exceution cost, perhaps relative to parameters such as the number of proces-
sors on a PRAM. Algorithms are expressed in high-level assembler", a simple
imperative programming language, for which the translation to the o_cial"
machine model is readily understood. Often algorithms are expressed in terms
of explicit representations of data structures using pointers" and words" to
manage storage.
By and large the algorithms and programming languages communities oper-
ate in isolation from one another. Programming languages researchers focus on
the practicalities of building large software systems, and are seldom concerned
about e_ciency. Algorithms researchers focus on the e_ciency of core program-
ming techniques, and are seldom concerned about composition. (These are, of
course, caricatures of reality, but it seems to me that they contain an element
of truth.)
1
The separation between these two areas is not merely an accident of history,
or a product of social structures, but rather signals fundamental challenges that
might pro_tably be addressed by a joint research e_ort seeking to consolidate
and integrate advances on both aspects of programming. The prospects for a
successful e_ort hinge on a shared appreciation for the importance of mathe-
matically rigorous theories of programming and a shared sense of beauty that
drives much work in both areas.