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