CSC 131
Principles of Programming Languages

A programming language is a programmer's principal interface with the computer. As such, the choice of an appropriate language can make a large difference in a programmer's productivity. A major goal of this course is to present a comprehensive introduction to the principal features and overall design of both traditional and modern programming languages. As such you will be examining language features both in isolation and in the context of a more complete language description.

While we will examine features of older imperative programming languages like Pascal and C, we will also examine features and programming paradigms introduced in more recent programming languages in response to problems in writing programs in these earlier languages. We will also investigate and practice writing interpreters and/or compilers for simple programming languages. This hands-on experience will provide a firm grounding in both the run-time characteristics of programming languages and the formal specification of programming language semantics.

At the end of this course you should have a more thorough understanding of why certain programming language features provide more support for the production of reliable programs, while others are fraught with ambiguity or other problems. Since programming languages mediate between the programmer and the raw machine, we will also gain a deeper understanding of how programming languages are compiled, what actually happens when a program is executed on a computer, and how the programming language design affects these. As an example, by the end of the course, you should be able to understand why Java is generally considered a more reliable language than C or C++, while it will also generally execute a bit slower.

An important feature of this course is the discussion of programming language paradigms (in particular, languages which support new ways of thinking about implementing algorithms). We will investigate both the new features themselves and the software engineering problems which spawned these developments.

This course will involve extensive reading on your part, both in the text and in outside sources. The segments of the course which introduce new programming language paradigms will also feature some relatively simple programming in languages representative of the functional and object-oriented paradigms (Scheme, ML, and Java or others).

To simplify printing of the information about CSC 131 found on these pages, a single page on which all the information about CSC 131 is grouped together is also available.