practice
Doi: 10.1145/1498765.1498781
The ecosystem of purpose-built languages
is a key part of systems development.
BY miKe ShAPiRo
Purpose-Built
Languages
In my college computer science lab, two eternal
debates flourished during breaks from long nights of
coding and debugging: “emacs versus vi?” and “what
is the best programming language?” Later, as I began
my career in industry, I noticed that the debate over
programming languages was also going on in the
hallways of Silicon Valley campuses. It was the 1990s,
and at Sun Microsystems many of us were watching
Java claim significant mindshare among developers,
particularly those previously developing in C or C++.
I have always found the notion of best language to be
too subjective and too dependent on the nature of the
programming task at hand. Over my career, however,
I have spent significant time pondering two related
questions that I think are more fundamental. First,
is software engineering at large being done on fewer
languages over time? That is, is the set of computer
languages converging Second, what makes a particular
language “better” or useful or more rapidly adopted for
a particular task?
In examining these questions I have found it
particularly interesting to look not at the battle of
the heavyweights, but rather at their less well-studied
offshoots, the purpose-built languages. These languages
36 communicAtionS of the Acm | APriL 2009 | voL. 52 | no. 4
sprout like weeds alongside the road
of mainstream language development, and they exhibit properties and
a history that lead one to reconsider
instinctive answers to the fundamental language questions. Considering
purpose-built languages, programming language development is not
converging at all, and utility seems to
have little to do with traditional notions of structure or properties that
are empirically “better” from a lan-guage-design perspective. Purpose-built languages even defy a strict
definition worthy of a prescriptive
compiler grammarian: they somehow
seem “smaller” than a full-fledged
programming language; they are not
always Turing-complete; they can
lack formal grammars (and parsers);
they are sometimes stand-alone but
often a part of a more complex environment or containing program; they
are often but not always interpreted;
they are typically designed for a single
purpose but often (accidentally) jump
from one type of use to another. And
some are even nameless.
Most significantly, purpose-built
languages have often formed an essential part of the development of
larger software systems such as operating systems, whether as a part of developer tools or as glue between distinct pieces of a larger environment.
So it is particularly interesting to unearth some of these lesser-known creations and look at their connections
to our larger language insights. In my
career, while working on several commercial operating systems and large
software components, I have come
to conclude that not only are new
languages developing all the time,
but they are also often integral to the
growth and maintenance of larger-scale software systems.
The Unix environment, with its
philosophy of little tools that can be
easily connected, was an ideal greenhouse for the growth of purpose-built
languages. A cursory scan of Unix
manuals from the early 1980s shows
more than 20 little languages of vari-
illustration by john hersey