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 ’90s, and at Sun 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 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 language-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 even have no name.