Brian McNamara
Today's lecture will be a quick
history of programming languages. Since 1957 when the first Fortran was
introduced for the IBM 704, literally hundreds of new programming languages
have come and gone--well, some of them have gone, and others--like Fortran,
have managed to stay around. The sheer number of languages makes it impossible
to cover them all in any depth--indeed, even the most important languages we
will only have time to discuss in shallow detail today. As a result, we talk
about only the most important languages--those that had historical significance
either for their new ideas or their influences on the languages that followed
them.
Let me admit, up front, that I am
not a history buff. So why, you might ask, do we waste a day on a "history
lecture" at all, then? Well, there are two major reasons. First, this
lecture will give you a brief introduction to the handful of languages we'll
talk about in this course. Thus the short exposure to these languages you get
today will serve as the scaffolding onto which we'll learn about language
constructs and the languages to which they belong. Second, I hope that in this
discussion, especially of early languages, you'll gain an appreciation for the
historical contexts in which languages have been developed. Things we take for
granted today--like interactive machines, standard keyboards and characters
sets, etc., were (of course) not always around, and it is interesting to see
how issues that no longer matter today played important roles back then. By
understanding the differences between the historical contexts in which
different languages were created, only then can we appreciate that we are,
today, right now, framed in a computing context that, when viewed from 20 or 30
years from now, will probably seem like we are focusing on issues of perhaps
trivial importance, and missing some big issues.
So, those goals in mind, let's
talk about history. On page 39 of your book, there's a beautiful picture
showing a timeline of languages, with a dot for each major language, and lines
connecting languages that influenced other ones. Had I made any overheads for
today, this would have been the primary one. (As I mentioned; I'm a little
disorganized this week; by next I'll have some slides prepared before lecture.)
I'm going to talk about a few of these languages and draw part of that diagram
on the board; you needn't copy it as it's right from your textbook.
FORTRAN
Computing
in 1957 was largely scientific number crunching. Much hardware supported either
integer operations, which floating point could be simulated on, or only
floating point operations. IBM introduced its new IBM 704, which supported both
integer and floating point operations, and this is the language on which the
first successful programming language, Fortran, was built.
The
idea for FORTRAN had been in the works for some time. The language compiler was
advertised as one that would generate object code that was as efficient as
hand-coded machine code, but the ease of the existing
interpretive
pseudo-code systems. Amazingly, FORTRAN did just that, and a new era of
programming was born.
What
was the language like? FORTRAN could use variables whose names were up to six
characters long. It had both integers and floating point variables (based on
the name: I-N integers). It had formatted input and output statements, to read
and write data. It had an arithmetic IF statement, which compares two numbers
and then branches to one of three locations depending on less than, greater
than, or equal to. And it had an iterative DO loop which would count from one
number to another.
All
of the control statements in the language mapped directly into single
instructions in the hardware of the IBM 704.
Largely
due to support from IBM, FORTRAN was the most used language in computing for
the next 25 years or so. It was revised in 1977 and again in 1990, adding lots
of modern features to the language (like type declarations and if-then-else).
LISP
A
couple years later, on the complete other end of the spectrum came LISP. LISP
was a dynamic, interpreted language. It features data stored in linked lists
(that was garbage collected) and programs that were represented just as
data--in lists. A list like (A B C) could be treated as data, or as a function
call A(B,C). LISP was functional-there were no variables or destructive
assignment. Scheme and Common LISP are the main dialects that survive today.
Algol
In
the late fifties, the computing world was interested in creating a
"universal language" for programming. FORTRAN was the only existing
contender, but it was IBM property. The ACM in the US, and GAMM in Germany both
decided to form committees to create a machine-independent, universal language.
The committees got together in 1958 and drafted the first version of Algol. Two
years later after some experimentation and suggestions, another meeting was
held, and Algol 60 was born.
Algol
60 is arguably the most influential language of all time. Among the
contributions of Algol to the computing world:
variable
:= expression
blocks
(begin-end pairs which are modules and scopes)
two
different parameter passing mechanisms (value and name)
stack-dynamic
arrays
type
declarations
if-then-else
with compound statements (no labels)
the
FOR loop (without labels)
context-free
grammars as a method for describing a language
Algol
was never used as much as Fortran, but for about 25 years it was the language
to communicate algorithms. Pick up Communications of the ACM (show magazine) in
the 1960s and you'd see Algol everywhere.
COBOL
Most
computing in FORTRAN or Algol was scientific in nature. COBOL was designed for
business. It was to be a simple enough language for managers to
read
and write, and capable of producing printed reports and doing decimal number
processing. It read very much like English, with long keywords and identifiers.
Perhaps COBOL's most important contribution was that of the record for
organizing data that belonged together. COBOL has some government backing,
which helped it gain popularity.
PL/I
The
kitchen sink, PL/I combined the features of Algol, Fortran, and COBOL, as well
as some new features, like concurrency and exception handling. It failed,
showing that a large feature set doesn't necessarily make a good language.
BASIC
BASIC
was the first language to be designed for use on timesharing, interactive
terminals. It was the first language which considered programmer time more
valuable than computer time. This was revolutionary for that time.
Simula
67
Simula
was for the most part a superset of Algol, and contributed the class, the first
step towards data abstraction. Simula was used for simulations, and the
class-as-data-abstraction concept wasn't recognized and appreciated until years
later.
Algol
68
Algol
68 is orthogonal--almost any feature can be combined with any other feature in
a meaningful way. For example, an if-then-else statement could appear on either
side of an assignment statement. For the most part, this flexibility made things
too complicated; few used the language.
Pascal
Pascal
was an Algol descendant designed as a language for teaching algorithms.
Meaningful contributions included in Pascal were the case (switch) statement,
and value-result (in/out) parameters. Pascal was used in education everywhere
for about 20 years, and it replaced Algol as the language for the communication
of algorithms in journals. Its simplicity (part of its design) made it not
powerful/useful enough to use in practice much.
C
C
evolved from a series of prior language into a portable systems language. C has
strong influences from Algol 68; C is very orthogonal. C was strongly coupled
to the UNIX operating system, which helped its growth.
Smalltalk
80
Smalltalk,
based on Simula, is the first truly object-oriented language. Classes have
instances, and all computation is expressed as messages sent to an object.
Smalltalk is remarkable not only for OO, but also for its programming
environment. Smalltalk relies on a windowed interface and a pointing device.
Ada
Ada
is the result of the largest language design ever. It was contracted by the US
Department of Defense as a language which embedded systems could be reliably
and efficiently programmed. A long series of requirements docs were made for
Ada, and then four companies designed languages, and the best was chosen. The
first Ada compiler took years to develop--it was written in Ada.
Ada
contributed packages as a way to encapsulate data objects and specify data
types. Ada provides good exception handling facilities, for detecting and
recovering from software and hardware exceptions. Ada has generics, which allow
code to be reused with many different data types. Ada also provides a decent
concurrency mechanism. Ada was heavily influenced by Pascal. A recent revision,
Ada 95, has OO.
C++
C++
was created as an extension to C to support OO. It was designed to be
compatible with C and as efficient as it. It was also designed with the intent
to provide a transition path for programmers moving from traditional structured
programming to OO programming. C++ included public/private access, multiple
inheritance, constructors and destructors, and operator overloading. Leveraging
off the success of C, C++ became a popular commercial language.
Eiffel
Eiffel
was designed as a language with expressivity and power equal to C++, but with
much greater readability and write ability due to simplicity and single-minded
design in the language. Eiffel also includes the idea of enforcing assertions
via interface contracts. Commercial issues have prevented Eiffel from becoming
a major success.
FORTRAN
(1957)
|
\ LISP (1959)
|
\
|
Algol (1960) COBOL (1960)
\
| | \ /
\|
| \ /
______|
\ | /\
|
| PL/I (1964) \----------------
|
| \ |
|
BASIC (1965) SIMULA (1967) |
|
/ | \ |
0 comments:
Post a Comment