Programming Languages
Principles and Practice
by Kenneth C. Louden
Contents
Chapter 1 Introduction
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
Chapter 2 History
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
Chapter 3 Language Design Principles
3.1 History and Design Criteria
3.2 Efficiency
3.3 Generality, Orthogonality, Uniformity
3.4 Further Language Design Principles
Chapter 4 Syntax
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
Chapter 5 Basic 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
Chapter 6 Data Types
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
Chapter 7 Control
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
Chapter 8 Abstract Data Types
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
Chapter 9 Object-Oriented programming languages
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
Chapter 10 Functional Programming
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.
Chapter 11 Logic Programming
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
Chapter 12 Formal Semantics of Programming Languages
12.1 A Sample Small Language
12.2 Operational Semantics
12.3 Denotational Semantics
12.4 Axiomatic Semantics
12.5 Proofs of Program Correctness
Chapter 13 Parallel Programming
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
Bibliography
Answers to Selected Exercises