Let us research and trace back the origins of language constructs.
开发者_开发技巧For example:
Constructs Introduced from LISP
If-Else Block :"The ubiquitous if-then-else structure, now taken for granted as an essential element of any programming language, was invented by McCarthy for use in Lisp, where it saw its first appearance in a more general form (the cond structure). It was inherited by Algol, which popularized it. " - WikiPedia
Function Type : Functions as first class citizens.
Garbage Collection
Here is a comprehensive history of major programming language constructs that I've been able to identify so far. I've undoubtedly missed something, but I'm sure the SO community will help identify these omissions.
Plankalkül (1943-45) - Developed by Konrad Zuse, this was the first high-level, non-von Neumann programming language, according to Wikipedia and Communications of the ACM paper "The "Plankalkül" of Konrad Zuse: A Forerunner of Today's Programming Languages" by F.L. Bauer and H. Wossner. The language was originally developed for the mechanical Zuse Z1 computer, but a compiler implementation by a team at the Free University of Berlin was not developed until 2000. The language introduced the following:
- "Assignment statements, subroutines, conditional statements, iteration, floating point arithmetic, arrays, hierarchical record structures, assertions, and exception handling" (Wikipedia:Plankalkül).
Fortran:
- Do-loop (really the equivalent of the modern for-loop in languages like C, C++, etc) (Wikipedia: For_loop)
- Three-way arithmetic IF statement (Backus)
- computed GOTO (predecessor of switch statement in Algol 58 and Algol 60) -- from (Backus), (Wikipedia: Fortran), and (Wikipedia: ALGOL 58)
IPL (Information Processing Language) - recursion (later included in LISP) -- (Newell and Simon)
LISP - garbage collection, lambda expressions, and dynamic typing -- (McCarthy, 1960), (McCarthy, 1978), (Wikipedia: Garbage collection), and (Wikipedia: LISP)
ALGOL 58 - introduced code blocks (but only for control flow, not variable scope) (Backus, 1959)
ALGOL 60 - added lexical scope to code blocks, nested function definitions with lexical scope (Backus et al 1963)
ALGOL 68 - operator overloading (A. van Wijngaarden et al)
Simula - objects, classes, subclasses, virtual methods, coroutines (Dahl et al)
ML - parametric polymorphism (Cardelli and Wegner)
ISBL (Information Systems Base Language) - relational algebra (was introduced earlier here than in SQL) -- (Hall et al), (Wikipedia: Relational algebra)
Scheme - first fully-supported closures (Sussman and Steele, 1975), (Sussman and Steele, 1998)
Oddly, for four of the most commonly used modern programming languages, C, C++, Java, and C#, I was unable to identify any verifiable, fundamentally new programming language constructs. The templates in C++ are an adhoc version of polymorphism introduced in ML. The closest thing to a new language feature in Java was inclusion of support for threads. Mostly, all four languages are a combination of desirable features and concepts invented elsewhere.
Other notes: Although Prolog was one of the first logic programming languages, I could not identify any significant features not introduced previously in other languages.
Although there are some Wikipedia references, most of the features listed above have been attributed to solid sources that are referenced below. Where I've delved down to find authoritative references, the Wikipedia-based details have held up well.
The ACM paper I referenced for Plankalkül confirms most of its features. Konrad Zuse was a far-sighted genius.
REFERENCES
F.L. Bauer and H. Wössner (1972). The “Plankalkül” of Konrad Zuse: A Forerunner of Today’s Programming Languages. Communications of the ACM, 15(7):678–685.
Raúl Rojas et al. (2000). "Plankalkül: The First High-Level Programming Language and its Implementation". Institut für Informatik, Freie Universität Berlin, Technical Report B-3/2000.
J. W. Backus (1956). The Fortran Automatic Coding System for the IBM 704 EDPM. International Business Machines Corporation.
Allen Newell and Herbert A. Simon (1956). The logic theory machine: a complex information processing system. IRE Transactions on Information Theory IT-2, no. 3: 61-79.
John McCarthy (1960). Recursive functions of symbolic expressions and their computation by machine, Part I, Communications of the ACM, v.3 n.4, p.184-195, April.
John McCarthy (1978). History of LISP. In Richard L. Wexelblat, editor, History of Programming Languages: Proceedings of the ACM SIGPLAN Conference, pages 173-197. Academic Press, June 1-3.
J.W. Backus (1959). "The Syntax and Semantics of the Proposed International Algebraic Language of Zürich ACM-GAMM Conference". Proceedings of the International Conference on Information Processing. UNESCO. pp. 125–132.
J.W. Backus, F. L. Bauer, J. Green, C. Katz, J. McCarthy, P. Naur, A .J. Perlis, H. Rutishauser, K. Samelson, B. Vauquois, J. H. Wegstein, A. van Wijngaarden, M. Woodger; edited by Peter Naur (1963). Revised Report on the Algorithmic Language ALGOL 60. Communications of the ACM, Volume 6, Number 1 (January), pages 1-17.
A. van Wijngaarden, A. (Editor), Mailloux, B. J., Peck, J. E. L., Koster, C. H. A. (1969). "Report on the algorithmic language ALGOL 68", Section 10.2.2. Numer. Math. 14, 79--218.
Ole-Johan Dahl, Bjørm Myhrhaug, and Kristen Nygaard (1970). SIMULA, Common Base Language. (2nd. Edition) Oslo, Norwegian Computing Center.
Luca Cardelli and Peter Wegner (1985). On Understanding Types, Data Abstraction, and Polymorphism. Computing Surveys, Vol 17 n. 4, pp 471-522, December.
Patrick A.V. Hall, Peter Hitchcock, Stephen Todd (1975). "An algebra of relations for machine computation". Conference record of the second ACM Symposium on the Principles of Programming Languages, Palo Alto, California: ACM, pp. 225–232, January.
Gerald Jay Sussman and Guy L. Steele, Jr (1975). Scheme: An Interpreter for the Extended Lambda Calculus. AI Memo 349, December.
Gerald Jay Sussman and Guy L. Steele, Jr (1998). "Scheme: A Interpreter for Extended Lambda Calculus". Higher-Order and Symbolic Computation 11 (4): 399–404, December, Kluwer Academic Publishers, Boston.
SWITCH statement - 1965 - ALGOL W
According to: http://ojs.pythonpapers.org/index.php/tpp/article/viewFile/49/45
ALGOL, the father of all procedural languages, did not have a case statement as the concept of case had not been invented yet in high level languages. Then in 1965 a rarely used language ALGOL W was released that contained switch...case statement invented by C. A. R. Hoare which allowed for non-ordered non-overlapping values and ranges.
C and Pascal both derived from this parent language, and both had a form of case : C the familiar switch (variable) case ... and Pascal using case variable begin value1: .... C++, PHP, C#, and Java syntax are derived from the C version.
I think SNOBOL introduced pattern-matching before regular expressions appeared in UNIX tools.
APL introduced the idea of a culture-free programming language that mirrored culture-free algebraic notation. There were no words from English or other languages in the syntax.
APL was evaluated right-to-left, without operator precedence. Which language introduced operator precedence - Fortran?
精彩评论