Linked e-resources
Details
Table of Contents
Intro
Preface
Do We Need New Programming Languages?
Weak Languages
General Design Principles
To the Reader
Contents
List of Figures
1 A Brief History of Programming Languages
1.1 Before Computers: Turing Machines and Lambda Calculus
1.2 Programmable Electronic Computers
1.3 Early and Influential Programming Languages
1.3.1 Plankalkül
1.3.2 FORTRAN
1.3.3 LISP
1.3.4 COBOL
1.3.5 ALGOL 60
1.3.6 APL
1.3.7 PL/I
1.3.8 BASIC
1.3.9 Simula
1.3.10 Pascal
1.3.11 C
1.3.12 Prolog
1.3.13 ISWIM and ML
1.4 Further Reading
1.5 Exercises
2 Implementation Strategies
2.1 Compilation and Interpretation
2.2 REPLs and IDEs
2.3 Intermediate Code and Virtual Machines
2.4 Hybrid Methods
2.5 Cross Compilers, Reverse Compilers, and Obfuscation
2.6 Bootstrapping
2.6.1 Notation
2.6.2 Compiling Compilers
2.6.3 Full Bootstrap
2.6.4 Choosing the Language in Which to Write a Compiler
2.7 How Implementation Techniques can Influence Language Design
2.8 Further Reading
2.9 Exercises
3 Syntax
3.1 Lexical Elements
3.1.1 Character Sets
3.1.2 Case Sensitivity
3.1.3 Identifiers
3.1.4 Whitespace
3.1.5 Comments
3.1.6 Reserved Symbols
3.1.7 Separation of Tokens
3.1.8 Summary
3.2 Grammatical Elements
3.2.1 Line-Based Syntax
3.2.2 Multi-line Syntax
3.2.3 Syntax that Looks Like a Natural Language
3.2.4 Bracketed Syntax
3.2.5 Prefix, Post Fix and Operator-Precedence Syntax
3.2.6 Context-Free Syntax
3.2.7 Stronger Grammar Formalisms
3.2.8 Other Syntactic Considerations
3.2.9 Bracketing Symbols
3.3 Concerns that Span Both Lexing and Grammar
3.3.1 Macros
3.3.2 Visual Languages
3.4 Considerations When Designing Syntax
3.5 Further Reading
3.6 Exercises
4 Memory Management
4.1 Introduction
4.2 Static Allocation
4.2.1 Limitations
4.3 Stack Allocation
4.4 Heap Allocation
4.5 Manual Memory Management
4.5.1 A Simple Implementation of malloc() and free()
4.5.2 Joining Freed Blocks
4.5.3 Sorting by Block Size
4.5.4 Large Objects
4.5.5 Summary of Manual Memory Management
4.6 Automatic Memory Management
4.7 Reference Counting
4.8 Tracing Garbage Collectors
4.8.1 Mark-Sweep Collection
4.8.2 Two-Space Collection
4.8.3 Generational and Concurrent Collectors
4.9 Summary of Automatic Memory Management
4.10 Memory Management and Language Design
4.11 Further Reading
4.12 Exercises
5 Scopes, Functions, and Parameter Passing
5.1 Scope Rules
5.1.1 Global Scoping
5.1.2 Local Variables Only
5.1.3 Block Structure
5.1.4 Nested Function Declarations
5.1.5 Recursion
5.1.6 Macros
5.1.7 Parameter-Passing Methods
5.2 Implementing Functions and Function Calls
5.2.1 Summary of Implementing Function Calls
5.2.2 C-Style Functions
5.2.3 Nested Function Declarations
5.3 Functions as Parameters
Preface
Do We Need New Programming Languages?
Weak Languages
General Design Principles
To the Reader
Contents
List of Figures
1 A Brief History of Programming Languages
1.1 Before Computers: Turing Machines and Lambda Calculus
1.2 Programmable Electronic Computers
1.3 Early and Influential Programming Languages
1.3.1 Plankalkül
1.3.2 FORTRAN
1.3.3 LISP
1.3.4 COBOL
1.3.5 ALGOL 60
1.3.6 APL
1.3.7 PL/I
1.3.8 BASIC
1.3.9 Simula
1.3.10 Pascal
1.3.11 C
1.3.12 Prolog
1.3.13 ISWIM and ML
1.4 Further Reading
1.5 Exercises
2 Implementation Strategies
2.1 Compilation and Interpretation
2.2 REPLs and IDEs
2.3 Intermediate Code and Virtual Machines
2.4 Hybrid Methods
2.5 Cross Compilers, Reverse Compilers, and Obfuscation
2.6 Bootstrapping
2.6.1 Notation
2.6.2 Compiling Compilers
2.6.3 Full Bootstrap
2.6.4 Choosing the Language in Which to Write a Compiler
2.7 How Implementation Techniques can Influence Language Design
2.8 Further Reading
2.9 Exercises
3 Syntax
3.1 Lexical Elements
3.1.1 Character Sets
3.1.2 Case Sensitivity
3.1.3 Identifiers
3.1.4 Whitespace
3.1.5 Comments
3.1.6 Reserved Symbols
3.1.7 Separation of Tokens
3.1.8 Summary
3.2 Grammatical Elements
3.2.1 Line-Based Syntax
3.2.2 Multi-line Syntax
3.2.3 Syntax that Looks Like a Natural Language
3.2.4 Bracketed Syntax
3.2.5 Prefix, Post Fix and Operator-Precedence Syntax
3.2.6 Context-Free Syntax
3.2.7 Stronger Grammar Formalisms
3.2.8 Other Syntactic Considerations
3.2.9 Bracketing Symbols
3.3 Concerns that Span Both Lexing and Grammar
3.3.1 Macros
3.3.2 Visual Languages
3.4 Considerations When Designing Syntax
3.5 Further Reading
3.6 Exercises
4 Memory Management
4.1 Introduction
4.2 Static Allocation
4.2.1 Limitations
4.3 Stack Allocation
4.4 Heap Allocation
4.5 Manual Memory Management
4.5.1 A Simple Implementation of malloc() and free()
4.5.2 Joining Freed Blocks
4.5.3 Sorting by Block Size
4.5.4 Large Objects
4.5.5 Summary of Manual Memory Management
4.6 Automatic Memory Management
4.7 Reference Counting
4.8 Tracing Garbage Collectors
4.8.1 Mark-Sweep Collection
4.8.2 Two-Space Collection
4.8.3 Generational and Concurrent Collectors
4.9 Summary of Automatic Memory Management
4.10 Memory Management and Language Design
4.11 Further Reading
4.12 Exercises
5 Scopes, Functions, and Parameter Passing
5.1 Scope Rules
5.1.1 Global Scoping
5.1.2 Local Variables Only
5.1.3 Block Structure
5.1.4 Nested Function Declarations
5.1.5 Recursion
5.1.6 Macros
5.1.7 Parameter-Passing Methods
5.2 Implementing Functions and Function Calls
5.2.1 Summary of Implementing Function Calls
5.2.2 C-Style Functions
5.2.3 Nested Function Declarations
5.3 Functions as Parameters