CS538 Course Overview

CS538 is an upper division computer science course that investigates the design of programming languages. It complements CS536, which covers the implementation of programming languages.

This course will study in some detail the design and evolution of eight programming languages--Scheme, ML, Java, C++, C#, Pizza, Python and Prolog. Each language has made fundamental contributions to the art and science of language design.

Scheme, a modern descent of Lisp, is a dynamically-typed functional language. Using simple notions of evaluation and binding, a rich and powerful language has been developed.

ML, another functional language, is strongly typed, and yet programmers need declare no types at all--all types are automatically inferred by the compiler. ML includes a number of novel and powerful concepts, including polymorphism, higher-order functions, abstract data types and pattern-matching.

Java is a language that is widely-known as an object-oriented successor to C and C++. It represents a simple, strongly-typed, concurrent and fully secure programming language that has had a major impact on programming practice.

C#, Microsoft's alternative to Java, seeks to extend the concepts of C++ into a safer and more modern language structure.

As young as Java is, successor languages have already been proposed. One of the most interesting of these is Pizza, a language that extends Java with polymorphism, higher-order functions and pattern matching.

An important genre of programming languages is scripting languages which allow programmers to rapidly create new applications out of existing programs and libraries. Experienced Unix programmers routinely use shell scripts to create new applications and filters out of standard Unix primitives. Many Web applications use Perl to implement the "active content" of Web pages. Python, an emerging successor to Perl, is an object-oriented scripting language that is easy to learn, powerful, and reasonably efficient. It makes prototyping new applications, and extending old ones, fast and cheap.

Finally, we will consider Prolog, a logic programming language. Unlike conventional programming languages in which a computation is defined step-by-step, Prolog supports a declarative programming style. A programmer specifies a set of facts and rules. Using these facts and rules, Prolog automatically solves queries, choosing the facts and rules needed in a particular solution.

In addition, general issues of modularization, type systems, and extensibility will be discussed.

The goals for this course are that a student:

Unlike many CS courses, this course focuses primarily on design rather than implementation. Design involves judgment and taste as well as technical knowledge, and hence is much more difficult to master. It is fairly easy to write a workable C compiler or debugger; it is much more difficult to create a viable successor to C.