Programming Language Evolution

Here's my rough diagram of the evolution of programming languages. The vertical position of each language approximates the year it appeared.

A more accurate and detailed version can be found here.

Paradigms (If all you have is a hammer, then everything looks like a nail.)

A programming language is a toolbox filled with problem solving tools.

The kinds of problem solving tools we use shapes the kinds of solutions we build.

I've color-coded the languages according to paradigm:

The color of Scala is meant to indicate a fusion of the object and functional paradigms.

Imperative: Programs = Algorithms + Data

Like assembly languages, imperative languages separate algorithms and data. Passive data is manipulated by active algorithms. The gap between assembly languages and imperative languages is narrow, making the job of writing a compiler easier. The flow of control is specified by the algorithm using control structures such as selection, iteration, and goto.

Functional: Programs = Functions

Functions represent algorithms, but functions also represent data. In other words, functions can be inputs to and outputs of other functions. This implies that functions can be created at runtime, when more information is available. It also implies the ability to write meta-functions, meta-meta-functions, etc. Often increasing the level of abstraction (i.e., metas) shortens the length and depth of a program making it easier to test and debug.

Object: Program = Data

Objects are the main kind of data in an object-oriented language. Objects encapsulate their state and behavior (methods). This guards against algorithms manipulating inappropriate data.

Logic: Program = Facts + Rules + Queries

See Prolog Overview.