|This course emphasizes controlling the complexity of software systems through general techniques common to all engineering design:
- building abstractions to hide details and to separate specification from implementation
- establishing conventional interfaces to allow the creation of standard, "mix & match " modules
- establishing new languages for describing a certain class of designs, emphasizing some things and downplaying others
The primary purpose of this course is to give you a high-level picture of the possibilities of programming, i.e. an introduction to programming paradigms. With this knowledge, you will be able to consider the best way to tackle a problem without necessarily thinking about the language (and its abilities and limitations) first.
Topics include data abstraction, procedural abstraction, symbolic computation, object-oriented programming, functional programming, data-directed programming, embedded languages, data streams, and more. Students are encouraged to regard themselves as computer language designers and implementors rather than only language users.