CSE 341: Programming Languages
This document describes the material generally covered in CSE341 at
the University of Washington. While individual offerings vary
significantly, they all meet this high-level description. This
document is reviewed anually by past and future instructors to ensure
it is a reasonable reflection of reality.
Last updated: Winter 2012.
Textbook(s) and/or other required material:
Varies depending on instructor, but typically:
Jeff Ullman, Elements of ML Programming
Dave Thomas, Programming Ruby
(In addition, significant on-line materials, tutorials, and resources
are provided.)
Course objectives:
- To understand fundamental programming-language concepts
- To become fluent in non-imperative programming paradigms
- To become able to learn new programming languages efficiently
Topics covered:
The following topics are always covered:
- Functional programming (avoiding mutation; exploiting recursion and higher-order functions; closures; anonymous functions)
- algebraic datatypes and pattern-matching
- essential object-oriented programming (late-binding / dynamic dispatch, subtyping vs. subclassing)
- language support for abstraction, such as modules, abstract types, and dynamic type-creation
- syntax vs. semantics
- static vs. dynamic typing, and type safety
- parametric polymorphism / generics
- object-oriented extensibility vs. functional extensibility
In any particular offering, most of the following are covered:
- tail recursion
- currying
- equality vs. identity
- macros
- type inference
- lazy evaluation and related idioms such as streams and memoization
- code-as-data concepts, such as reflection and eval/apply
- lexical vs. dynamic scope
- subtyping issues such as structural vs. named subtyping and sumpsumption vs. coercion
- object-oriented concepts such as multiple inheritance, multimethods, and metaclasses
- bounded parametric polymorphism
- forms of parameter passing
- subtype polymorphism and bounded polymorphism
- logic programming
A small number of these topics might also be covered:
- language-design principles
- history of programming languages
- programming environments
- debugging support
- compilers vs. interpreters
- continuations
- continuation-passing style
- coroutines
- iterators
- language support for concurrency