Course Home

Objectives

The aim of this course is to provide students with a basic understanding of programming language design. The material will emphasize fundamental decisions that arise when designing and implementing a programmingn language. We will give examples of languages that are representative of the major paradigms (logical, functional, imperative) in moderate detail. For this course, we will emphasize Scheme, Haskell, Javascript, and Prolog in addition to shallow coverage of C++, Java and perhaps F# or Perl.

Student Learning Outcomes

Students who successfully complete this course will be able to:
  1. Read and write a syntactic specification using BNF.
  2. Describe how the semantics of a language are specified, specifically addressing axiomatic and denotational semantics.
  3. Describe the core features of the functional, logical, object-oriented and imperative programming paradigms.
  4. Write and interpret programs using each of the paradigms listed above.
  5. Describe and characterize data types such as: primitives, compound types, arrays, enumerations, sets, closures, and pointers
  6. Describe language level constructs that support concurrency and contrast with mechanisms providing library support for concurrency
  7. Explain and give examples in some implemented language of the following concepts:
    1. strong and weak typing
    2. type inference
    3. static and dynamic typing
    4. generics
    5. dynamic dispatching
    6. parameter passing (by reference, by value)
    7. currying
    8. macro
    9. eager and lazy evaluation
    10. subtyping and subclassing
    11. algebraic type specification

Schedule

The table below gives an approximate schedule of topics for the semester although I anticipate moving functional programming forward to enable us more time to learn this up-and-coming powerhouse.

Date Topic Reading Due
Week 1 Introduction Chapter 1
Week 2 Syntax Chapter 2
Week 3 Syntax and Semantic Definition Chapters 2 and 3
Week 4 Types and Semantic Definition Chapters 2 and 3
Week 5 Imperative Programming (C/C++/Fortran) Chapter 4
Week 6 Memory Management Chapter 5
Week 7 Exepction Handling Chapter 6
Week 8 OOP (C++/Java/Smalltalk) Chapter 7
Week 9 Functional Programming (LISP/Scheme/ML) Chapter 8
Week 10 Functional Programming (LISP/Scheme/ML) Chapter 8
Week 11 Functional Programming (LISP/Scheme/ML) Chapter 8
Week 12 Logic Programming (Prolog/Mathematica) Chapter 9
Week 13 Logic Programming (Prolog/Mathematica) Chapter 9
Week 14 Concurrent Programming Chapter 9