The Early Development of Programming Languages (1976) [pdf]
bitsavers.trailing-edge.com
bitsavers.trailing-edge.com
There's also a video version of this paper: https://www.computerhistory.org/collections/catalog/10262213... — This is a nice talk (~80 minutes followed by ~30 minutes of Q&A) that Donald Knuth gave on 2003-December-03 at the Computer History Museum. This paper was reprinted with corrections/updates as pages 1 to 93 of "Selected Papers on Computer Languages" (the fifth volume of Knuth's collected papers), and the talk was given shortly after this book came out, so he spoke about the first chapter of the book.
The clever idea here is to illustrate (very) early programming languages from their first decade (roughly 1947 to 1957), by writing the same program ("TPK") in each of them. A while ago I added a little bit about it to the lede of https://en.wikipedia.org/w/index.php?title=TPK_algorithm&old...
What it reveals is that many ideas of programming languages that we now consider obvious in fact took a long time and many people to be developed. The early programming languages did not look at all like languages have looked, more or less, since 1958 (when both ALGOL and LISP were introduced).
> This talk will discuss contributions of Zuse (1945), Goldstine and von Neumann (1946), Curry (1948), Mauchly et al (1949), Burks (1950), Wheeler (1951), Rutishauser (1951), Böhm (1951), Glennie (1952), Hopper et al (1953), Laning and Zierler (1953), Brooker (1954), Kaminynin and Ljubimskiy (1954), Ershov (1955), Grems and Porter (1955), Elsworth et al (1955), Blum (1956), Perlis et al (1956), Katz et al (1956), Bauer and Samelson (1956), Melahn et al (1956), as well as the prototype of FORTRAN developed by Backus et al from 1954 to 1957. At least a dozen of these efforts will be illustrated by showing how a particular procedure called the TPK algorithm might have been coded at the time.
> The other background to this work… In 1962 I was asked to give a talk at the ACM National Conference which was held in Syracuse, and this [slide] was the review that occurred in Datamation. And basically he pans the thing [the conference]. He says “Fortunately a large number of the society's members were unable to attend.” And he goes on and says “Well, the hotel was pretty good and there was good breakfast…” But he says here “Another paper which was titled A History of Writing Compilers”—which was mine—“was actually the history of one individual's rather limited experience with *a* compiler”.
> Well, that wasn't exactly true, but it was true enough: in other words, in 1962 I didn't know about almost anything of what I'm going to tell you tonight. So I took it as “maybe, you know, if I'm going to talk about the history of something, maybe I ought to actually research it, look into it.” And so over the next few years I started learning more about this and the more I learned the more fascinating it got…
More broadly though, I echo your comment about Knuth's passion for history, which goes surprisingly deep: in fact in his paper “Ancient Babylonian Algorithms” (click on any of the PDF links at https://scholar.google.com/scholar?cluster=10887370978433539...) he mentions having used dictionaries of Akkadian and Sumerian to make sure his translation was accurate, and in a 2016 lecture (https://www.youtube.com/watch?v=4UFkH5ZlVqQ or https://www.youtube.com/watch?v=DjZB9HvddQk = https://www.youtube.com/watch?v=ZK4jnuCWl0Y) he mentions learning enough Sanskrit (or at least the Devanagari script) to fix an error in the transliteration in a Wikipedia article.
> Curry (“Composition”, 1948)
And suddenly I was like wow I wonder if the concept of currying was invented by this guy so I look it up. Turns out that while someone else is credited for inventing currying, it’s named after this Curry guy indeed. And more things are named after him, including the Haskell programming language.
bitsavers.org, maintained by Al Kossow, is a very important resource for computer history.
float f(float t)
{
return sqrt(abs(t)) + 5 * pow(t, 3);
}
void tpk(void)
{
int i;
float y, a[11];
for (int i = 0; i < 11; ++i)
scanf("%f", &a[i]);
for (int i = 11; i > 0; --i) {
y = f(a[i]);
if (y > 400)
printf("%d TOO LARGE", i);
else
printf("%d %f", i, y);
}
}