Kenneth C. Louden

Programming Languages – Principles and Practice, 2nd Edition

Thomson – Course Technology © 2003

Contents

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
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: New Directions and the Rise of Object-Orientation
2.6 The 1990s: Consolidation, the Internet, Libraries, and Scripting
2.7 The Future
3 Language Design Principles 3.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 Design
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
5 Basic Semantics 5.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 Garbage
6 Data Types 6.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 Polymorphism
7 Control I—Expressions and Statements 7.1 Expressions
7.2 Conditional Statements and Guards
7.3 Loops and Variation on WHILE
7.4 The GOTO Controversy
7.5 Exception Handling
8 Control II—Procedures and Environments 8.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 Environments
9 Abstract Data Types and Modules 9.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 Types
10 Object-Oriented Programming 10.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 Languages
11 Functional Programming 11.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 Calculus
12 Logic Programming 12.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 Systems
13 Formal Semantics 13.1 A Sample Small Language
13.2 Operational Semantics
13.3 Denotational Semantics
13.4 Axiomatic Semantics
13.5 Proofs of Program Correctness
14 Parallel Programming 14.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