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.
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.
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)
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.
Break complex program into a set of simple tasks, or procedures.
Procedures may be thought of linguistically as verbs.
Algol, FORTRAN, LISP, COBOL, BASIC
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
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
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
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,
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
Bill Kinnersley’s “The Language List” — available in no particular place.
Introduction to Programming Languages by Anthony A. Aaby
Now available only as part of a downloadable DVD image.