A brief history of programming languages

While I was thinking about the history of programming languages recently, I remembered slides I once made, showing a (simplified) family/influence/history diagram of languages.

Shared he in case it’s useful to anyone.

(It was made many years ago, so not up to date after 2010 – sorry. And I fully expect your comments correcting my interpretations…)

Some programming languages and their relationships (up to 2010)

Languages with C-style syntax

Functional languages (some languages intentionally on the border…)

Object-oriented languages (some languages intentionally on the border)

Here is a PDF file with the same diagrams.

In Honour of Niklaus Wirth

Niklaus Wirth died in Zürich on 1st January 2024. He was one of the great pioneers of programming language design, and specifically design of languages for education.

His languages were a huge influence on me, and on my thinking. Pascal was one of the first languages I learned, and Modula-2 and Oberon also opened worlds to me when I understood what lay behind their design.

The Informatics in Education journal has just published a special edition to honour Wirth’s tremendous contribution to our community. I contributed an article to this edition, titled Principles of Educational Programming Language Design.

I invite you to read it; it might be of interest to you if you are interested in programming language history, in the design of programming languages or in programming education.

The entire special edition is worth a look. It contains many other interesting contributions.


In 2002, I had the honour to introduce Wirth’s keynote address at the ITiCSE conference in Aarhus, and to have dinner with him. One of my treasured memories.

Image of Niklaus Wirth and Michael Kölling, sitting at a table at dinner.

Niklaus Wirth and I (in much younger years), at the conference dinner at ITiCSE 2002, in Aarhus

Sitting at a dinner table, chatting, are (from left to right): Michael Kölling, Niklaus Wirth, Michael E Caspersen, David Gries

At the ITiCSE 2002 conference dinner (left to right): Michael Kölling, Niklaus Wirth, Michael E Caspersen, David Gries

Designing a programming language: Don’t Be Clever

One lesson of programming language design? Don’t try to be too clever!

Here is an example from JavaScript​:

When you compare

0 == ‘0’

the system tries to be clever: “Comparing a number and a string? You probably meant to see whether the string contains the character ‘0’, so let’s just say ‘yes’!”, it thinks. So the result is true.

When you compare

0 == ”

it tries to be even cleverer: “Ahh, perhaps you meant to check whether the length of the string is zero! Let’s just help the user here and not require them to call a ‘length’ function. So tedious. It’s true!”

But of course

‘0’ == ”

“Comparing two strings – got it. Are they the same? No! Returning false.”

The result of all this: The fundamental property of transitivity of equality is broken in JavaScript!

a == b and b == c, therefore a == c ?

Not in JavaScript, it isn’t! How can anyone voluntarily program in a language like this?!

The lessons for me? Give me static typing any day. And don’t try to be clever when designing a language. Spelling things out is a good thing, not a bad thing.