History of programming languages
The history of programming languages spans from documentation of early mechanical computers to modern tools for software development. Early programming languages were highly specialized, relying on mathematical notation and similarly obscure syntax. Throughout the 20th century, research in compiler theory led to the creation of high-level programming languages, which use a more accessible syntax to communicate instructions.
The first high-level programming language was Plankalkül, created by Konrad Zuse between 1942 and 1945. The first high-level language to have an associated compiler was created by Corrado Böhm in 1951, for his PhD thesis. The first commercially available language was FORTRAN, developed in 1956 by a team led by John Backus at IBM.
Early history
During 1842–1849, Ada Lovelace translated the memoir of Italian mathematician Luigi Menabrea about Charles Babbage's newest proposed machine: the Analytical Engine; she supplemented the memoir with notes that specified in detail a method for calculating Bernoulli numbers with the engine, recognized by most historians as the world's first published computer program.Jacquard Looms and Charles Babbage's Difference Engine both were designed to utilize punched cards, which would describe the sequence of operations that their programmable machines should perform.
The first computer codes were specialized for their applications: e.g., Alonzo Church was able to express the lambda calculus in a formulaic way, and the Turing machine was an abstraction of the operation of a tape-marking machine.
First programming languages
In the 1940s, the first recognizably modern electrically powered computers were created. The limited speed and memory capacity forced programmers to write hand-tuned assembly language programs. It was eventually realized that programming in assembly language required a great deal of intellectual effort.An early proposal for a high-level programming language was Plankalkül, developed by Konrad Zuse for his Z1 computer between 1942 and 1945, but not implemented at the time.
The first functioning programming languages designed to communicate instructions to a computer were written in the early 1950s. John Mauchly's Short Code, proposed in 1949, was one of the first high-level languages ever developed for an electronic computer. Unlike machine code, Short Code statements represented mathematical expressions in an understandable form. However, the program had to be interpreted into machine code every time it ran, making the process much slower than running the equivalent machine code.
In the early 1950s, Alick Glennie developed Autocode, possibly the first compiled programming language, at the University of Manchester. In 1954, a second iteration of the language, known as the "Mark 1 Autocode", was developed for the Mark 1 by R. A. Brooker. Brooker, with the University of Manchester, also developed an autocode for the Ferranti Mercury in the 1950s. The version for the EDSAC 2 was devised by Douglas Hartree of the University of Cambridge Mathematical Laboratory in 1961. Known as EDSAC 2 Autocode, it was a straight development from Mercury Autocode, adapted for local circumstances, and was noted for its object code optimization and source-language diagnostics, which were advanced for the time. A contemporary but separate thread of development, Atlas Autocode was developed for the University of Manchester Atlas 1 machine.
In 1954, FORTRAN was invented at IBM by a team led by John Backus; it was the first widely used high-level general-purpose language to have a functional implementation, in contrast to only a design on paper. When FORTRAN was first introduced, it was viewed with skepticism due to bugs, delays in development, and the comparative efficiency of "hand-coded" programs written in assembly. However, in a hardware market that was rapidly evolving, the language eventually became known for its efficiency. It is still a popular language for high-performance computing and is used for programs that benchmark and rank the world's TOP500 fastest supercomputers.
Another early programming language was devised by Grace Hopper in the US, named FLOW-MATIC. It was developed for the UNIVAC I at Remington Rand during the period from 1955 until 1959. Hopper found that business data processing customers were uncomfortable with mathematical notation, and in early 1955, she and her team wrote a specification for an English language programming language and implemented a prototype. The FLOW-MATIC compiler became publicly available in early 1958 and was substantially complete in 1959. Flow-Matic was a major influence in the design of COBOL, since only it and its direct descendant AIMACO were in use at the time.
Other languages still in use today include LISP, invented by John McCarthy, and COBOL, created by the Short Range Committee. Another milestone in the late 1950s was the publication, by a committee of American and European computer scientists, of "a new language for algorithms"; the ALGOL 60 Report. This report consolidated many ideas circulating at the time and featured three key language innovations:
- nested block structure: code sequences and associated declarations could be grouped into blocks without having to be turned into separate, explicitly named procedures;
- lexical scoping: a block could have its own private variables, procedures, and functions, invisible to code outside that block, that is, information hiding.
- a mathematically exact notation, Backus–Naur form, was used to describe the language's syntax. Nearly all subsequent programming languages have used a variant of BNF to describe the context-free portion of their syntax.
ALGOL's key ideas were continued, producing ALGOL 68:
- syntax and semantics became even more orthogonal, with anonymous routines, a recursive typing system with higher-order functions, etc.;
- not only the context-free part, but the full language syntax and semantics were defined formally, in terms of Van Wijngaarden grammar, a formalism designed specifically for this purpose.
Some notable languages that were developed in this period include:
- 1951 – Regional Assembly Language
- 1952 – Autocode
- 1954 – IPL
- 1955 – FLOW-MATIC
- 1957 – FORTRAN
- 1957 – COMTRAN
- 1958 – LISP
- 1958 – ALGOL 58
- 1959 – FACT
- 1959 – COBOL
- 1959 – RPG
- 1960 – ALGOL 60
- 1962 – APL
- 1962 – Simula
- 1962 – SNOBOL
- 1963 – CPL
- 1964 – Speakeasy
- 1964 – BASIC
- 1964 – PL/I
- 1966 – JOSS
- 1966 – MUMPS
- 1967 – BCPL
- 1967 – Logo.
- 1968 – Algol 68
Establishing fundamental paradigms
- Speakeasy, developed in 1964 at Argonne National Laboratory by Stanley Cohen, is an object-oriented programming system, much like the later MATLAB, IDL and Mathematica numerical package. Speakeasy has a clear Fortran foundation syntax. It first addressed efficient physics computing internally at ANL, was modified for research use for the Federal Reserve Board in the early 1970s and then was made available commercially; Speakeasy and Modeleasy are still in use.
- Simula, invented in the late 1960s by Nygaard and Dahl as a superset of ALGOL 60, was the first language designed to support object-oriented programming.
- FORTH, the earliest concatenative programming language was designed by Charles Moore in 1969 as a personal development system while at the National Radio Astronomy Observatory.
- C, an early systems programming language, was developed by Dennis Ritchie and Ken Thompson at Bell Labs between 1969 and 1973.
- Smalltalk provided a complete ground-up design of an object-oriented language.
- Prolog, designed in 1972 by Alain Colmerauer, Phillipe Roussel, and Robert Kowalski, was the first logic programming language.
- ML built a polymorphic type system on Lisp, pioneering statically typed functional programming languages.
The 1960s and 1970s also saw considerable debate over the merits of "structured programming", which essentially meant programming without the use of
goto. A significant fraction of programmers believed that, even in languages that provide goto, it is bad programming style to use it except in rare circumstances. This debate was closely related to language design: some languages had no goto, which forced the use of structured programming.To provide even faster compile times, some languages were structured for "one-pass compilers" which expect subordinate routines to be defined first, as with Pascal, where the main routine, or driver function, is the final section of the program listing.
Some notable languages that were developed in this period include:
- 1967 – BCPL
- 1967 – Logo
- 1969 – B
- 1970 – Pascal
- 1970 – Forth
- 1972 – C
- 1972 – Smalltalk
- 1972 – Prolog
- 1973 – ML
- 1975 – Scheme
- 1978 – SQL
1980s: consolidation, modules, performance
One important new trend in language design was an increased focus on programming for large-scale systems through the use of modules, or large-scale organizational units of code. Modula, Ada, and ML all developed notable module systems in the 1980s. Module systems were often wedded to generic programming constructs: generics being, in essence, parametrized modules.
Although major new paradigms for imperative programming languages did not appear, many researchers expanded on the ideas of prior languages and adapted them to new contexts. For example, the languages of the Argus and Emerald systems adapted object-oriented programming to distributed computing systems.
The 1980s also brought advances in programming language implementation. The reduced instruction set computer movement in computer architecture postulated that hardware should be designed for compilers rather than for human assembly programmers. Aided by central processing unit speed improvements that enabled increasingly aggressive compiling methods, the RISC movement sparked greater interest in compiler technology for high-level languages.
Language technology continued along these lines well into the 1990s.
Some notable languages that were developed in this period include:
- 1980 – C++
- 1983 – Ada
- 1984 – Common Lisp
- 1984 – MATLAB
- 1984 – dBase III, dBase III Plus
- 1985 – Eiffel
- 1986 – Objective-C
- 1986 – LabVIEW
- 1986 – Erlang
- 1987 – Perl
- 1988 – PIC
- 1988 – Tcl
- 1988 – Wolfram Language