Computer Shopper's lexicon of programming languages, old and new, concludes with an overview of the history of computing
While there are other languages that could be covered as part of the Rough Guide, and I have no doubt that angry enthusiasts for language X are already massing on the hilltops, it seems time to call a close before we degenerate into the examination of increasingly similar dialects.
By now you have seen enough languages to get an impression of what is possible - this should enable you to come to terms with any new language that pops up. In short, the Rough Guide has explored all of the components that go to make a language, and anything new should be recognisable as a combination of features that you've seen before. All that's left is to provide an overview that shows how one language relates to another.
The early days of programming were only a fraction removed from the hot soldering iron, let alone machine code, and programmers couldn't see that there were any benefits to be gained from moving away from the internal structure of the machine. Indeed, as efficiency was then the most important consideration, and the highly technical skill of programming took a long time to acquire, many thought that high-level languages would simply be impractical . There were many experimental languages around at the time that edged the idea of an assembly language towards the idea of a high- level language, but the real breakthrough was Fortran.
The principal designer of Fortran was John Backus, but he had a little help from IBM . Even so, it took around five years and lots of programmers to produce the working compiler that emerged in 1958. This really was the forefront of technology, because there wasn't anycompilertheoryto help, and Fortran (standing for 'formula translation') had to include the ability to compile arbitrarily complicated arithmetic expressions written in a natural algebraic way. The early versions of Fortran had lots of problems, but the successful implementation of a high-level language demonstrated two things: it could be done and it was worth doing. After Fortran, the flood gates were open and high-level languages poured though.
Fortran was, and is, a language designed to be used by scientists and engineers. It caters for their needs by making it easy to code complicated bits of maths and by being good at numerical I/O. Cobol was originally proposed as a non-technical language. The original designers (principally Grace Hopper, as far as I can tell) even doubted that the people who wanted to use it could cope with algebraic notation - so instead of A+B you had to write A PLUS B. This approach did make Cobol the least technical of languages, and also the most wordy. It wasn't so good at working things out, but it was good at moving data from one place to another and displaying it.
Now we come to Algol. Algol was designed by computer scientists for computer scientists. It included all of the fun computing ideas of the time - nested block structure, recursion and so on. It was hopeless at the practical things that Fortran and Cobol were good at, but it was a theoretically pleasing language! Neatly enough, the three languages were a success with the audiences that they were aimed at - scientists used Fortran, business people used Cobol and the computer scientists used Algol. Of course, this is a picture simplified to the point where some distortion of reality is inevitable, but it's not a gross distortion.
As an aside, it's worth mentioning that IBM's success with Fortran encouraged the company to try its luck a second time with a mega-language that incorporated elements of Fortran, Algol and Cobol. It was called PL/1, standing for Programming Language 1. The main problem with PL/1 was that it was a bit on the big side. You still come across the occasional compiler for PL/1, or a subset, but it can't be rated as a popular language.
Fortran's best-known off-spring has to be Basic. In many ways, early Basic is just a cut-down version of Fortran with extras to cope with the needs of an interactive environment. Although philosophers will probably haggle for many years about exactly what made Basic the great success that it has been, I think it was the combination of Fortran's simple structure with the broadening of its applications area to include non-numeric work. Basic was and still is, one of the easiest languages in which to do character-based work, because of its use of variable-length strings. Its biggest mistake was to generalise the line number labels used by Fortran into combined line editing and label numbers. This, plus the fact that it didn't support modules of anykind worth using, made it an essentially weak language.
Of course, I would argue that this weakness has been overcome in modern versions of Basic by the inclusion of procedures and functions. Indeed, some might even argue that QuickBASIC is slightly too aggressive in its insistence on modular construction - to the point that the editor only lets you work with one subroutine at a time!
Algol spawned many a dialect and version, with catchy titles such as Algol 68 and Algol W. It's not unreasonable to suppose that one of the main reasons why no single Algol derivative ever caught on was that there were so many of them - a clear case of 'divide and fall'. Mind you, Algol did eventually give rise to two success stories, Pascal and C. Pascal is best described as a cut-down and simplified version of Algol. It was designed as a compact teaching language, and that is still where it excels. But once you have learned to program using Pascal, you will probably want to go on using it for real work, and for this you need the 'real world' Pascal systems such as Turbo Pascal. These supplement the basic Pascal language with a collection of libraries that extend it to make it easy to tackle real problems. It is arguable that real-world Pascals have moved so far away from the original idea that they aren't really Pascal in spirit.
C, on the other hand, is more like a fusion of a simplified Algol and assembler-level constructs. I have previously described C in print as a high-level assembler, and I know just how much this irritates C enthusiasts. But, sorry, folks, that really is what it is - and what makes it good at the jobs it tends to be used for.
Forth was successful because the hardware it was aimed at wasn't very powerful, so there was a choice to be made between languages that were easy to use but slow and languages that were difficult to use but fast. Forth was a sort of compromise, a language that was moderately difficult to use but moderately fast. As hardware has grown increasingly powerful, Forth has become less and less useful. This argument is confirmed by the fact that the one remaining Forth stronghold is in the programming of dedicated controllers - ie not-so-powerful microprocessors where the alternatives to Forth are still 'difficult but fast' assembler and 'easy but slow' high-level languages. Forth's explicit use of a stack may be dying out, but it isn't a principle that is being lost. For example, the stack is also at the heart of the Algol family's nested block structure, and all nested control and data structures. The difference is that the stack remains hidden under the language rather than being a central feature of it.
The only language that I have difficulty placing in the scheme of things is the notorious APL. This is an operator language that is more like a formal mathematical notation than a language. It's possible to write amazingly complex programs in a single APL line, and many of its enthusiasts like it for just this reason. In its defence, it is often pointed out that you don't have to write one-line programs in APL. Whatever its inherent merits, the principles of APL don't seem to lead onto a family of languages or to any generalisation. Like many mathematical notations, its conventions seem arbitrary. APL may be the best sort of language of its type, but it's also the only one!
Modula 2, a development of Pascal, was really designed with a stricter form of modularity in mind, but now that looks more or less identical to a weak form of the object- orientated philosophy. Of course, there are many new languages that are purpose-built vehicles for the object-orientated method - Smalltalk and Actor, to name but two - but none has a user base as large as a traditional language, or even the object-orientated extension of a traditional language.
Logic programming is exemplified by the language Prolog, but there are others. A logic programming language aims to do away with the procedural ('what to do') aspect of programming. In a logic programming language, you state the facts and what is required, and expect the language to sort out the details of how the result is to be obtained.
At the moment there are no good examples of functional languages in general use - the closest is Lisp, which isn't a pure functional language and is only just in general use. The reason for the lack of impact of the functional languages is twofold. Firstly, it is difficult to add a functional extension to a traditional language, and secondly, functional languages don't offer anything other than the promise of more reliable programs.
My final comment is Ada. Just when you thought it was safe to assume that mega-languages were dead, along with PL/1, along comes Ada - the most mega of all languages. It is a large language that includes Algol, Fortran and Cobol-like elements all mixed up together. Personally I like it, but there are a lot of programmers who think it should join PL/1 as quickly as possible.
The above article first appeared in Computer Shopper, November 1991, and was written by Mike James. Their kind permission to reproduce this article is gratfully acknowledged.
1954 1955 FORTRAN (1954-57) 1956 1957 1958 ALGOL 60 (1958-60) 1959 COBOL (1959-60) 1960 1961 1962 1963 PL/1 (1963-64) ALGOL 68 (1963-68) 1964 BASIC (1964) 1965 1966 1967 1968 PASCAL (1968-71) 1969 BCPL (1969) 1970 1971 1972 1973 1974 C (1974-78) 1975 CONCURRENT PASCAL (1975) 1976 1977 MODULA 2 (1977-80) 1978 ADA (1978-82) 1979 1980 1981 OCCAM (1981)