history of computer programming languages

This is a work in progress. It’s bogged down because I had a neat idea of the evolution of structure in programming methodologies, which probably bears little resemblance to the real history of programming.

history

Computer programs have been required to do increasingly more varied things, with the result that their code has become increasingly complex. Consequently, the code has become very hard to maintain: a second programmer can’t understand what the first programmer was doing with their code; the first programmer can’t understand their own code a year later.

The conceptual development of programming languages followed this thread, to bring the code the programmer writes more in line with the concepts that are being modeled within the program.

“Intellectual manageability” (Djikstra)
Code reusability
Hierarchical systems
Top-down design

Human-readable. Extreme examples: COBOL, AppleScript.

Before programming languages

The early days

Various sorts of machines for specialized calculations go back to antiquity. (The Antikythera mechanism.)

In the late 1600s, ever more complex calculating machines came into fashion. (Pascal’s calculator—an adding machine. Leibniz invented parts for calculators that could multiply as well.)

Babbage’s Analytical Engine (designed ca. 1870, never built) was to take programs on cards; the mechanical state of the machine was the equivalent of memory.

Von Neumann—idea of putting program into memory rather than hard-wiring. (1945)

Assembler language

The lowest-level instructions the the CPU is to execute at each step can be thought of as integer numbers. Assembler languages simply re-codes these numbers into mnemonics. (Late 1940s.)

Typically, a new assembler language is developed for each CPU architecture.

Procedural programming (‘58)

Break complex program into a set of simple tasks, or procedures.

Procedures may be thought of linguistically as verbs.

Algol, FORTRAN, LISP, COBOL, BASIC

Abstract Data Type (ADT)

Structured programming (late ‘60s)

Associated data regarded as a single structure. For instance, a rectangle might be modeled in a program as four numbers, top, left, bottom, right. Rather than storing these numbers at random in memory, in structured programming, they are stored together as a structure, which might be named rect. The structure rect can then be handled as though it were a single entity, which is the way we were thinking of the rectangle to begin with.

The interpretation of the data is thus represented in the code. The code refers to the structures as individual things, as nouns.

Dijkstra, E. W., “Go To Statement Considered Harmful”, Comm ACM, Vol. 11, No. 3, March 1968, pp. 147-148

Dijkstra, E. W., Structured Programming, 1969

From: Federal Standard 1037C: Glossary of Telecommunications Terms

structured programming:
A technique for organizing and coding computer programs in which a hierarchy of modules is used, each having a single entry and a single exit point, and in which control is passed downward through the structure without unconditional branches to higher levels of the structure. Three types of control flow are used: sequential, test, and iteration.

Pascal, C

Recursive programming (‘60)

Extension of the procedural programming idea, with the capacity of a procedure to call itself from within itself.

Lisp, Pascal

Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I , John McCarthy

Modular programming (mid ‘70s)

Rather than acting on data entities, think of data entities as having behaviors. For instance, rather than changing all the numbers in the rect structure in order to move the conceptual rectangle, you call on the move behavior of the rect module.

Linguistically, these modules, as nouns, are now active. Rather than always being the object of the verbs (the data that procedures act upon), they can be the subject of a phrase.

In the modular programming methodology, one of the most important principles is encapsulation, whereby the data contained within a module is accessible from the rest of the program only via behaviors of the module. This makes it much easier to control what happens when data is modified.

D.L. Parnas, On the Criteria To Be Used in Decomposing Systems into Modules Commun. ACM, Vol. 15, No. 12, December 1972 pp. 1053-1058

In this context “module” is considered to be a responsibility assignment rather than a subprogram

Modula

Functional programming

Think of program as a the composition of a set of mathematical functions on some data. Data represented as local variables of functions. Assignment replaced with recursion.

Proceedings of the 1981 Conference on Functional Programming Languages and Computer Architecture, Portsmouth, NH, October 1981

Haskell, Caml,

Object-Oriented programming (late ‘80s)

We naturally arrange the things in our universe into classes, such as the class of all people. These classes can have sub-classes: the class of people contains the sub-class of all women. Classes may be said to inherit properties and behaviors. Women have hearts because people have hearts; women cry because people cry (and people cry because primates cry, etc.)

Object-oriented methodologies are an extension of modular ones, the additional ingredient being inheritance. With this ingredient, the code can refer directly to kinds of interactive things.

In object-oriented programming, concepts are modeled in code directly using the ideas of classes and inheritance. A particular member of a class is called an object.

Booch, G. “Object-Oriented Development.”
IEEE Trans Software Eng 12 (2 1986): 211-221.

Proceedings of the ACM Conference on Object-Oriented Programming Systems, Languages, and Applications, October 1986

C++, Python, Java

integrated development environments

GUI builders

Bill Kinnersley’s “The Language List” — available in no particular place.

Language history diagram

Computer Languages History

Introduction to Programming Languages by Anthony A. Aaby
Now available only as part of a downloadable DVD image.