PL. Programming Languages (5 core hours)
PL1. History and overview of programming languages (core -- 2 hours)
Early languages (FORTRAN, ALGOL, COBOL, LISP, BASIC)
The evolution of procedural languages
Object-oriented paradigm and languages
Mostly-functional, algorithmic, higher-order languages with eager
evaluation
Purely-functional, algorithmic paradigm
Declarative (non-algorithmic) languages
Parallel programming paradigms
Scripting paradigm
PL2. Virtual machines (core -- 1 hour)
What is a virtual machine?
Hierarchy of virtual machines presented to the user
PL3. Introduction to language translation (core -- 2 hours)
Comparison of pure interpreters vs. compilers
Language translation phases (lexical analysis, parsing, code generation,
optimization)
PL4. Language translation systems
Application of regular expressions in lexical scanners
Parsing (concrete and abstract syntax, abstract syntax trees)
Code generation by tree walking
Optimization techniques
Application of CFGs in table-driven and recursive descent parsing
PL5. Type systems
Data type as set of values with set of operations
Data types (elementary, product, coproduct, algebraic, recursive, arrow,
parameterized)
Type checking models
Semantic models of user-defined types (type abbreviations, ADTs, type
equality)
Parametric polymorphism
Subtype polymorphism
Type-checking algorithms
PL6. Models of execution control
Order of evaluation of sub-expressions
Exceptions and exception handling
Parallel composition (S1||S2)
Functions with delayed evaluation (closures, lazy evaluation)
PL7. Declaration, modularity, and storage management
Declaration models (binding, visibility, scope, and lifetime)
Parameterization mechanisms
Type parameterization
Mechanisms for sharing and restricting visibility of declarations
Garbage collection
PL8. Programming language semantics
Informal semantics
Overview of formal semantics
Denotational Semantics.
Axiomatic Semantics
PL9. Functional programming paradigms
Overview and motivation
Recursion over lists, natural numbers, trees, and other recursively-defined
data
Pragmatics (debugging by divide and conquer; persistency of data
structures)
Amortized efficiency for functional data structures
Closures, and uses of functions as data (infinite sets, streams)
PL10. Object-oriented programming paradigms
Mechanisms for defining classes and instances
Object creation and initialization
Inheritance and dynamic dispatch
Sketch of run-time representation of objects and method tables
Distinction between subtyping and inheritance
Advanced OO type problems
PL11. Language-based constructs for parallelism
Communication primitives for tasking models with explicit
communication
Communication primitives for tasking models with shared memory
Programming primitives for data-parallel models
Comparison of language features for parallel and distributed
programming
Optimistic concurrency control vs. locking and transactions
Coordination languages (Linda)
Asynchronous remote procedure calls (pipes)
Other approaches (functional, nondeterministic)