1.1 What Is a Programming Language?
1.2 Abstractions in Programming Languages
1.3 Computational Paradigms
1.4 Language Definition
1.5 Language Translation
1.6 Language Design
2.1 Early History: The First Programmer
2.2 The 1950s: The First Programming Languages
2.3 The 1960s: An Explosion in Programming Languages
2.4 The 1970s: Simplicity, Abstraction, Study
2.5 The 1980s: Consolidation and New Directions
2.6 The Future
3.1 History and Design Criteria
3.2 Efficiency
3.3 Generality, Orthogonality, Uniformity
3.4 Further Language Design Principles
4.1 Lexical Structure of Programming Languages
4.2 Context-Free Grammars and BNFs
4.3 Parse Trees and Abstract Syntax Trees
4.4 Ambiguity, Associativity, and Precedence
4.5 EBNFs and Syntax Diagrams
4.6 Parsing Techniques and Tools
4.7 Lexics Versus Syntax Versus Semantics
5.1 Attributes, Binding, and Semantic Functions
5.2 Declarations, Blocks, and Scope
5.3 The Symbol Table
5.4 Allocation, Extent, and the Environment
5.5 Constants and Variables
5.6 Aliases, Dangling References, and Garbage
5.7 Expression Evaluation
6.1 Data Types and Type Information
6.2 Simple Types
6.3 Type Constructors
6.4 Type Nomenclature in Pascal-like Languages
6.5 Type Equivalence
6.6 Type Checking
6.7 Type Conversion
7.1 Guarded Commands and Conditionals
7.2 Loops and Variations on WHILE
7.3 The GOTO Controversy
7.4 Procedures and Parameters
7.5 Procedure Environments, Activations, and Allocation
7.6 Exception Handling
8.1 The Algebraic Specification of Abstract Data Types
8.2 Abstract Data Types in Modula-2
8.3 Abstract Data Types in Ada
8.4 Abstract Data Types in Other Languages
8.5 Overloading and Polymorphism
8.6 Modules and Separate Compilation
8.7 Problems with Abstract Data-Type Mechanisms
8.8 The Mathematics of Abstract Data Types
9.1 Software Reuse and Independence
9.2 Objects, Classes, and Methods
9.3 Inheritance
9.4 Dynamic Binding
9.5 C++
9.6 Eiffel
9.7 Smalltalk
9.8 Design Issues in Object-Oriented Languages
9.9 Implementation Issues in Object-Oriented Languages
10.1 Programs as Functions
10.2 Functional Programming in a Procedural Language
10.3 Scheme: A Dialect of LISP
10.4 ML and Miranda: Functional Programming with Static Typing
10.5 Delayed Evaluation
10.6 Lambda Calculus: A Mathematical View of Functional Programming
10.7 Dynamic Memory Management for Functional Languages.
11.1 Logic and Logic Programs
11.2 Horn Clauses
11.3 Resolution and Unification
11.4 The Language Prolog
11.5 Problems with Logic Programming
11.6 Extending Logic Programming: Equational Systems
12.1 A Sample Small Language
12.2 Operational Semantics
12.3 Denotational Semantics
12.4 Axiomatic Semantics
12.5 Proofs of Program Correctness
13.1 Introduction to Parallel Processing
13.2 Parallel Processing and Programming Languages
13.3 Pseudoparallelism and Coroutines
13.4 Semaphores
13.5 Monitors
13.6 Message Passing
13.7 Parallelism in Nonprocedural Languages