Hacker News new | past | comments | ask | show | jobs | submit login
The Early Development of Programming Languages (1976) [pdf] (trailing-edge.com)
74 points by nynyny7 on Jan 10, 2021 | hide | past | favorite | 13 comments



This is a paper by Donald Knuth and his student Luis Trabb Pardo, and the published version has a more readable reprint: https://doi.org/10.1016/B978-0-12-491650-0.50019-8 (without paywall: http://sci-hub.se/https://doi.org/10.1016/B978-0-12-491650-0...). See also someone's blog post: https://gregorias.github.io/2014/11/22/early-high-level-prog...

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.


One of the highlights of reading The Art of Computer Programming (TAOCP) is the small historical lessons sprinkled in the text. Truth be told they're usually the main thing I understand. Sometimes I wish Knuth would just write a history book on computing. He has such a unique perspective as both a leader of the field and a great historian of it. Of course at this point he probably shouldn't have any distractions from TAOCP.


This reminded me of something Knuth says about this paper (starting around 8:17) in the talk I mentioned in another comment, showing that his historical knowledge, at least on this particular topic, wasn't always so deep:

> 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.


For anyone who may need more incentive to download the PDF: Knuth is co-author.


Speaking of names, in the abstract of the paper they mention:

> 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.

https://en.wikipedia.org/wiki/Currying

https://en.wikipedia.org/wiki/Haskell_Curry


A recurring joke in functional programming books is some footnote mentioning that currying was discovered by Schönfinkel but named after Curry because "schönfinkeling" didn't catch on.



Actually, this is the original (non-mirrored) link and it works fine: http://bitsavers.org/pdf/stanford/cs_techReports/STAN-CS-76-...

bitsavers.org, maintained by Al Kossow, is a very important resource for computer history.


Yes, works also fine for me; maybe the link of the original post should be corrected.


I haven't read it fully yet, but I will write that TPK algorithm in some language(s). Post here if you have some (! OR ?)


This appears to be what it would be in C or C++.

  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);
          }
  }



Thanks for the link!! (Yeah, I am not going to look it up before I did my own…)




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: