Preface.- Acknowledgements.- 1. Introduction.- 1.1 The Building of the Tower of Babel.- 1.2 What Is a Programming Language?.- 1.3 Why Study Programming Languages?.- 1.4 What Should We Look for in a Language?.- 1.5 Language Design Issues.- 1.6 The Study of Programming Languages.- Further Reading.- 2. Elements of a Programming Language.- 2.1 Informal Description of Mini-language Core.- 2.2 Informal Semantics of Mini-language Core.- 2.3 Language Design and the Programming Process.- 2.4 The Definition of Programming Languages.- 2.5 The Formal Description of Syntax.- 2.6 Other Context-free Syntax Definitions.- Further Reading.- 3. Names, Locations, and Values.- 3.1 Mini-language Ref.- 3.2 Declarations.- 3.3 Assignment.- 3.4 Statements as Expressions.- 3.5 Where to Look: Algol 68, Smalltalk.- Further Reading.- 4. Control Structures.- 4.1 Mini-language Control.- 4.2 Basic Control Structures and Flowgraphs.- 4.3 Theorems on Control Structures.- 4.4 Other One-in, One-out Control Structures.- 4.5 The Goto Statement and Label Values.- 4.6 Conclusions.- 4.7 Where to Look: Pascal, Ada.- Further Reading.- 5. Data Types.- 5.1 Mini-language Type.- 5.2 The Meaning of Type.- 5.3 Primitive Types.- 5.4 Array Types.- 5.5 Record Types.- 5.6 Type Checking.- 5.7 Where to Look: Fortran, PL/I.- Further Reading.- 6. Input and Output.- 6.1 Mini-language Format.- 6.2 Varieties of Input-output Specifications.- 6.3 Communication with the Outside World.- 6.4 Where to Look: Fortran, Cobol, Ada.- Further Reading.- 7. Procedures and Parameters.- 7.1 Mini-language Procedures.- 7.2 Procedures as Abstractions.- 7.3 Arguments and Parameters.- 7.4 Value-returning Procedures.- 7.5 Coroutines.- 7.6 Where to Look: PL/I, Ada.- Further Reading.- 8. Nesting and Scope.- 8.1 Mini-language Scope.- 8.2 The Idea of Scope.- 8.3 Storage Allocation.- 8.4 Dynamic Scope.- 8.5 Where to Look: Pascal, PL/I, APL.- Further Reading.- 9. Definition of New Data Types.- 9.1 Mini-language Typedef.- 9.2 Type Definitions.- 9.3 Definition of Structured Types.- 9.4 User Defined Operators.- 9.5 Where to Look: Pascal, Algol 68.- Further Reading.- 10. Dynamically Varying Structures.- 10.1 Mini-language Structures.- 10.2 Dynamically Varying Data Structures.- 10.3 Pointers.- 10.4 Design Criteria for Data Structures.- 10.5 Dynamic Allocation of Storage.- 10.6 Where to Look: PL/I, Pascal, Ada.- Further Reading.- 11. Exception Handling.- 11.1 Mini-language Exceptions.- 11.2 Exceptions.- 11.3 Issues in Exception Handling.- 11.4 Where to Look: PL/I, Ada.- Further Reading.- 12. Parallel Processing.- 12.1 Mini-language Parallel.- 12.2 A First Solution to the Decoding Problem.- 12.3 Putting a Buffer in a Task.- 12.4 Interrupting.- 12.5 Issues in Parallel Processing.- 12.6 Where to Look: Concurrent Pascal, Modula-2, Ada.- Further Reading.- 13. Separately Compiled Modules.- 13.1 Mini-language Modules.- 13.2 Packaging Subprograms.- 13.3 Abstract Data Types.- 13.4 Where to Look: PL/I, Modula 2, Ada, Smalltalk.- Further Reading.- 14. The Swamp of Complexity.- 14.1 The Forms of Complexity.- 14.2 Escaping from the Swamp.- References.