Also have a look at the diagram of programming languages history.
Abstract data types | Simula 67 |
Algebraic data types | Hope (giving ML) |
Assignment operator overloading | C++ |
BNF (Backus-Naur Form) | used to describe Algol 60's syntax |
Block nesting with scope | Algol 60 |
Chained comparisons | BCPL |
Class | Simula 67 |
Closure | Lisp |
Comments | Cobol |
Compound statements (group statements into one) | Algol 58 |
Continuations | ?? (1972) |
Encapsulation | |
Exception handling | PL/I |
Explicit typing | Algol 58 |
Garbage collection | Lisp |
Heap allocation | Lisp |
Higher order | Algol 60 or maybe Lisp? |
Hygienic macros | Scheme R4RS |
Inheritance | Simula 67 |
Lazy evaluation | ISWIM (giving Haskell) |
List comprehension | KRC (giving Haskell) |
Macros | Cobol |
Modules | Modula-2 |
Monads | Haskell |
Multiple selection ("case" statement) | Algol W |
Object-oriented Programming | Simula 67 |
Operator overloading | Algol 68 |
Orthogonality | Algol 68 |
Parametric Polymorphism | ML |
Pass by name | Algol 60 |
Pass by value | Fortran |
Pass by value/result | Algol W |
Pattern matching | Hope (giving ML) |
Pointer datatype | PL/I |
References | Algol 68 |
Separate compilation | Fortran II (interest: hardware failures were very frequent => length of a program could not exceed 300/400 lines) |
Stack allocation | Algol 58 |
Stack dynamic variables | Algol 60 |
Static allocation | Fortran |
Structures (records) | Cobol |
Type classes | Haskell |
Type inference | ML |
User-defined data types | Algol 68 |
Using C as portable assembler | C++ (Cfront) |
Variable declaration anywhere in a block | Algol 68 |
Vertical layout (Indentation to show block structure) | CPL, ISWIM (giving Haskell) |