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 Design2 History2.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: New Directions and the Rise of Object-Orientation 2.6 The 1990s: Consolidation, the Internet, Libraries,
and Scripting 2.7 The Future3 Language Design Principles3.1 History and Design Criteria 3.2 Efficiency 3.3 Regularity 3.4 Further Language Design Principles 3.5 C++: A Case Study in Language Design4 Syntax4.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 Semantics5 Basic Semantics5.1 Attributes, Binding, and Semantic Functions 5.2 Declarations, Blocks, and Scope 5.3 The Symbol Table 5.4 Name Resolution and Overloading 5.5 Allocation, Lifetimes, and the Environment 5.6 Variables and Constants 5.7 Aliases, Dangling References, and Garbage6 Data Types6.1 Data Types and Type Information 6.2 Simple Types 6.3 Type Constructors 6.4 Type Nomenclature in Sample Languages 6.5 Type Equivalence 6.6 Type Checking 6.7 Type Conversion 6.8 Polymophic Type Checking 6.9 Explicit Polymorphism7 Control I—Expressions and
Statements7.1 Expressions 7.2 Conditional Statements and Guards 7.3 Loops and Variation on WHILE 7.4 The GOTO Controversy 7.5 Exception Handling8 Control II—Procedures and
Environments8.1 Procedure Definition and Activation 8.2 Procedure Semantics 8.3 Parameter Passing Mechanisms 8.4 Procedure Environments, Activations, and Allocation 8.5 Dynamic Memory Management 8.6 Exception Handling and Environments9 Abstract Data Types and Modules9.1 The Algebraic Specification of Abstract Data
Types 9.2 Abstract Data Type Mechanisms and Modules 9.3 Separate Compilation, C++ Namespaces, and Java
Packages 9.4 Ada Packages 9.5 Modules in ML 9.6 Modules in Earlier Languages 9.7 Problems with Abstract Data Type Mechanisms 9.8 The Mathematics of Abstract Data Types10 Object-Oriented Programming10.1 Software Reuse and Independence 10.2 Java: Objects, Classes, and Methods 10.3 Inheritance 10.4 Dynamic Binding 10.5 C++ 10.6 Smalltalk 10.7 Design Issues in Object-Oriented Languages 10.8 Implementation Issues in Object-Oriented Languages11 Functional Programming11.1 Programs as Functions 11.2 Functional Programming in an Imperative Language 11.3 Scheme: A Dialect of LISP 11.4 ML: Functional Programming with Static Typing 11.5 Delayed Evaluation 11.6 Haskell – A Fully-Curried Lazy Language with
Overloading 11.7 The Mathematics of Functional Programming I:
Recursive Functions 11.8 The Mathematics of Functional Programming II:
Lambda Calculus12 Logic Programming12.1 Logic and Logic Programs 12.2 Horn Clauses 12.3 Resolution and Unification 12.4 The Language Prolog 12.5 Problems with Logic Programming 12.6 Extending Logic Programming: Constraint Logic
Programming and Equational Systems13 Formal Semantics13.1 A Sample Small Language 13.2 Operational Semantics 13.3 Denotational Semantics 13.4 Axiomatic Semantics 13.5 Proofs of Program Correctness14 Parallel Programming14.1 Introduction of Parallel Processing 14.2 Parallel Processing and Programming Languages 14.3 Threads 14.4 Semaphores 14.5 Monitors 14.6 Message Passing 14.7 Parallelism in Non-imperative Languages