HISTORY OF COMPUTERS AND PROGRAMMING LANGUAGES
A web site with
good information about the discussed topics is: http://en.wikipedia.org
Milestones in the
30’s
1936
Konard Zuse, German engineer, built the first computer called the Z1 using metals strips and pins.
This computer was programmable. The programs were stored on punched tapes. The tapes that were punched were discarded films. Key points of the Z1 were that it was binary, programmable and used floating point numbers. Zuse improved his design and created improved versions of it called the Z2, Z3 and Z4.
Zuse had to flee to Bavaria b/c of the war and his designs never became commercially implemented.
Milestones in the
40’s
1946
Conrad Zuse invented the first programming language called Plankalkul. This language had many features that are found in today’s high level programming languages. Examples of these are assignment statements, loops, conditionals, subroutines, and user defined types. His language allowed algorithms to be described that were completely independent of machine architecture.
(See Picture 1)
Zuse wrote a large number of algorithms in Plankalkul, from sorting to chess playing.
There was no way to implement the algorithms above as they were well beyond the capacity of the Z4 hardware.
Zuse’s work largely went unnoticed and unpublished. Other computer hardware designers and language creators used his ideas, but they just happened to create them independently after Zuse did.
(Interesting side note: Zuse died
in 1995. In 1967 Zuse also suggested
that the universe itself is running on a grid of computers (digital physics).
His ideas are in a book called Calculating
Space published in 1970. A web site with good information about Zuse
is: http://en.wikipedia.org/wiki/Konrad_Zuse
1944
The first commercially viable computer the Harvard Mark I, developed by
IBM, was built. Progammers ( at that time they were called “coders”) , typed their programs in using
machine language. These programs were written in octal. These programs used
absolute memory references. As a consequence, generic subroutines had to be
rewritten every time the code was reused. This code was rewritten to reflect
the absolute memory addresses that the application required.. A famous woman
programmer,Grace Murray Hopper, was one of the “coders” for the Mark I (See
Picture 2)
Milestones in the 50’s
Early
50’s
Assemblers were invented. Speeded up programming greatly. Mnemonics like
ADD and MUL were substituted for octal codes, symbolic address(i.e. varaible
names) were referenced instead of absolute addresses.
Grace Murray Hopper invented subroutine libraries (Named A-0 and A-2). With
these libraries, an assembler programmer could call a subroutine in their code,
and using macro expansion, the subroutine call would be replaced by the code in
the library when it was translated into machine code. She also suggested that
computers could also be used for data processing as well as mathematical
calculations. She suggested that a language
to do data processing be very English like so that non-mathematical
people could program in the language. However, she found it difficult to
convince others to explore this idea further.
People started to see the importance of saving coding time. Machines were
getting faster, but the human “coders” were not. In response to that, John
Backus invented speedcoding. With speedcoding, the programmer could write
their code for a “virtual machine”. Such languages had more features than
assembler language andn this allowed coding
to go faster. However ,these languages were interpreted, and ran 5 to 10
times slower than their machine language counterparts.
Late 50’s
John Backus invents Fortran (Formula Translating System)(1955). This
language had variable names, assignments, array subscripting, procedures, the
Do while loop, and procedures that could be compiled seperatly (thus saving
tons of compile time on a large program that had a change in only one
procedure).The early versions of
Fortran did not have recurssion, by reference parameter passing, arrays
larger than three elements b/c of implementation difficulties.
(See Picture 3)
John Backus and his development group, not only created the language
Fortran, but they created the methodlogies that are in use today to write
compilers.
It was said that Plankalkul was designed and never implemented, and Fortran was implemented and not designed.
Some commands in the early versions of the Fortran language were very
machine specific, thus producing many dialects of the language. Recent versions
of Fortran, which are very much in use today, still have dialects to exploit
features associated with specific machine architectures This exploitation
results in even higher speed numerical computations.
Fortan was in heavy commercial use by the late 1950s.
(Interesting side note: John Backus also aided in the development of BNF notation, which is still used to describe language syntax.)
See http://en.wikipedia.org/wiki/Fortran#Sample_program for an example
Fortran program.
In Darmouth, an organized workshop on artifical intelligence(1956) was conducted and many of the “heavy hitters” in the computing field attended that workshop. At the workshop, a noncommercial language was presented called IPL which could automatically prove theoroms of prepositional logic. This language supported the concept of a linked list, but was heavily tied to a specific machine architecture.
(See Picture 4)
This demonstration caught the eye
of John McCarthy who used the linked
list ideas from IPL,the conditional idea from Fortran, and his own version of
recurrsion to create the first AI programming language Lisp.(1958).
Lisp still remains the most popular language for AI programming.
See: http://en.wikipedia.org/wiki/Lisp_programming_language#Example_programs
for examples of Lisp.
Grace Murray Hopper’s idea of using a computer for data processing took off
and a language called FLOW-MATIC was invented by UNIVAC for their
computers. At that time it was said that such a language would be “The
electronic mechanization of accounting”.
In the late 50’s lots of programming languages were being invented both in
America and in Europe. Europe came up with the idea of developing one universal
international machine independent language for expressing scientific
algorithms. A group in America followed suit right after that, and in 1958 the
two groups came together to create the internationally developed Algol
58 (followed by Algol 60 and Algol 68).
Even though Algol is not in use today and did not catch on commercially, it
was still not a wasted efforts. All languages created after 1958 seemed to use
some of Algol’s features. Also, Algol was the universal language used to
express algorithms in scholarly scientific journals for more than 20 years.
Some of the innovative features that Algol first presented were:
The use of keywords to bracket
a statement: begin…end
Arrays whose size
could be determined and modified at runtime
Format free syntax where
there wasn’t rigid columns that held certain
parts of commands.
Static typing
The elimination of the GO TO to change flow of control. A huge controversy arose from this at the time. However, the GO TO lost. Nowadays it is not even debatable that a program is more structured and readable if it does not use a GO TO.
No arbitrary limits that amount to tons of special cases that a programmer has to remember. Algol is very orthogonal and allows every meaningful combination of primitive concepts.
IBM began an implementation of Algol 58 but abandoned it to concentrate on Fortran. . However, Algol was used as the basis for Jovial which was the scientific programming language for the airforce for many years.
The reasons why Algol did not catch on were many. One, it never obtained big corporate backing. Two, it was perhaps too new and strange to programmers who prefered to stick with a language they knew. Three, there were implementation difficulties (ie.verifying that the machine code produced by the compiler was indeed what the programmer had in mind.)
See: http://en.wikipedia.org/wiki/ALGOL for examples of Algol.
Milestones in the 60’s
Algol influenced the development of the Simula languages in the 60’s. Simula I and Simula 67. These languages were developed by Norwegians Kristen Nygaard and Ole-Johan Dahl. (See Picture 5)
Simula I was a language that was used to describe simulations (ex. Airplanes landing and taking off at an airport. Customers arriving and being served at a bank…etc…)
Simula I showed the beginings of an object orientation. (Example a simulated object like a customer could be created (instantiated) . A customer would have instance varaibles that would describe them, and methods that would service them)
Simula 67 became even more object oriented (introducing the terms class and object, and having an organized scheme for inheritance). Simula 67 also added constructs to make it a more general purpose language.
See: http://en.wikipedia.org/wiki/Simula for examples of Simula.
COBOL’s development was initiated by the DOD. It’s original name was CBL but then it was changed to COBOL ’60.
When COBOL was designed, it was designed to be very English-like and easy to use so that non-computer people could program in this language. The language design was done quickly to beat other companies that also recognized that computers could be use for data processing. Up until the 90’s, COBOL was hands-down the dominant language in the data processing field.
See: http://en.wikipedia.org/wiki/Cobol for examples of COBOL code.
BASIC was invented in the 60’s. It is the first language of many older programmers today. It was designed in Darmouth to teach liberal arts students how to program. Key feature was that it should be very easy to learn, and easy to debug (clear error messages, fast turnaround everytime a program was executed).
This was one of those languages that considered programmer’s time as valuable. People saw that computers were becoming faster, so they needed to start thinking about how they can make it faster for programmers to write code. The design of BASIC was influenced by Fortran and Algol.
See: http://en.wikipedia.org/wiki/BASIC_programming_language for examples of BASIC code.
LANGUAGE CLASSIFICATIONS and
IMPLEMENTATION METHODS
(See Handout for Language Classifications and Implementation Methods)
Language
Classifications
Languages can be put into different families. However, some languages straddle families while others are so unique it is pointless to assign them to a family. The four major families that a language can be in are:
Imperative
Functional
Logical
Object Oriented
The language one chooses for an application determines the particular style of programming that one will use to solve a problem. For example, is one chooses an object oriented language to solve a problem, the programmers will make heavy use of the object concept when designing the solution. If one chooses a logic language, the application solution will be thought of in terms of searches.
A language will favor a particular programming style. However, it is possible to program in a style not favored by the language but it is not a good idea. For example you can use object oriented techniques in an imperative language, but they have to be simulated.
Imperative languages
Assignment
Iteration
Order of operations is critical
Functional Languages
Single values variables
Heavy use of recursion
Logic Languages
Program expressed as rules in formal logic
Object-Oriented
Languages
Imperative Languages + more
Constructs to help programmers use “objects” – little bundles of data that
know how to so things to themselves.
Computer Architecture
Most languages have been designed around the VonNeuman architecture
The languages that run most efficiently on this architecture are imperative languages. Logic and functional languages do not run as efficiently.
Implementation
Methods
Machine Language is the language that most hardware systems understand.
The operating system of a computer supplies higher primitive than those of machine language.
Compilation
When a language is compiled, the code produced will be machine language instructions plus calls to OS routines.
A compiler turns the computer into a “virtual computer”. This means the computer appears to understand the language being used. However, it is the compiler that creates this illusion.
The compiler produces machine code by going through the phases as described in the handout. However, once a program is compiled, it must go thorough the linker and the loader before it can be executed.
Once the machine code program is loaded into memory, it goes through the execution cycle: fetch decode execute.
Pure Interpretation
This is different than compilation. No machine code is produced. The interpreter program reads and deciphers each line of source code, then calls appropriate routines within the interpreter software to carry out the instruction. Programs that are interpreted run 10 to 100 times slower than compiled programs.
For example one could have an interpreter written in C++ that is interpreting instructions in a language will call X. The interpreter (i.e. the C++ code) will read a line of code in the language X, then the interpreter (i.e. C++ code ) will figure out what the line of X code means. After that, C++ code will execute to carry out the instruction in line X. If the instruction in line X is within a loop, that instruction must be “re-interpreted” (i.e. deciphered) every time the loop goes around. This creates slow execution times!!!!
Hybrid Implementation
Systems
In a system like this, it starts out like a compiler. However. once it gets to the intermediate code stage, it stops there and machine code is not produced. This intermediate code is then interpreted. This results in programs running faster than in pure interpreted programs. This system independent generic “machine-like” code called intermediate code is named byte code in Java.
For example, one could have a hybrid implementation written in C++ that hybrid-interprets instructions in a language will call X. This interpreter (i.e. the C++ code) reads the lines of code in the language X and produces their equivalents in intermediate code. Once all the intermediate code has been produced, the hybrid-interpreter (i.e. the C++ code), then goes through each line of the intermediate code, figures out it’s meaning* ,then calls a C++ routine to execute the intermediate code instruction.
* A much simpler task than in a pure interpreted language b/c a line of intermediate code has only one action per line.