Lambda Forever!

Course Syllabus

CS 3540

Programming Languages
and Paradigms

Spring Semester 2016

[ Basics | Goals | Requirements | Evaluation | Policies | Tentative Schedule ]


Instructor: Eugene Wallingford

Course resources:

Note that to send messages to the course mailing list, you must send from the mailing address from which you are subscribed. By default, that is your e-mail address. If you prefer to be subscribed from some other address, just let me know.

Required text:

On-line resources:

Course Goals

The study of programming languages and paradigms is fundamental to the discipline of computer science. As a computer scientist, regardless of your specialty, you should have a deep understanding of the principles of programming languages. They govern the design and use of every language that you will encounter. They affect the design of the applications you encounter. They even affect the architecture of the machines on which we run our programs. If you understand these design principles, then you will find it easier to be become an effective user of any language, to adapt to new paradigms as they evolve, and to design and implement new languages when necessary. You may be surprised to learn just how often you find yourself implementing small languages as a part of your applications.

This course aims to help you develop a deep, hands-on understanding of the essentials of programming languages. It does so by confronting you with the most fundamental idea in computer programming: The interpreter for any computer language is just another program. We will first lay the foundation for the analytic study of programming languages and then use those ideas to develop a sequence of increasingly detailed interpreters for a simple language.

One prerequisite to this approach is that you learn a programming style that makes it relatively easy to build language interpreters. We will learn Racket, a programming language that allows us to treat programs as data and vice versa. One of the extra benefits of learning Racket is that you will learn to program in a functional style, which will expand your programming repertiore. It will be the third "paradigm" in which you can program, in addition to procedural (Python, Ada, C) and object-oriented (Java, Python). Functional programming differs from the other two styles in a very important way: in functional programming, we compute for values, rather than for side effects.

By the end of the semester, you should feel comfortable:

Note that this course is not about any particular programming language, nor even about a smorgasbord of different languages. We will not study the syntax of new programming languages so that you can use them to write programs. Instead, we will seek develop the knowledge and skills necessary for you to be able to study other languages on your own. The course does introduce you to Scheme, a small and malleable programming language, as a tool for expressing the features of languages and writing language interpreters. It will be the microscope we use to study the broader principles of programming languages and paradigms.

Course Requirements

Course Evaluation

You will earn your grade based on your performance on homework assignments, quizzes, and the final examination. I assign final grades using the following distribution:

Item Number Weight
Homework 10-12 30%
Short exams 3-5 40%
Final exam 1 30%

Grades will be assigned using an absolute scale:

This means that there is no curve. However, I reserve the right to lower the individual grade boundaries at the end of the term if I think that produces grades that better reflect what students have achieved.

Course Policies

Tentative Schedule

The following schedule gives a rough sketch of the topics we will cover and the distinguished dates this semester. The quiz dates are tentative. If I decide to change a quiz date, I will notify you at least one week prior to the quiz date.

Week Dates Topics Special Events
1 01/12 - 01/14 Introduction to course and Racket .
2 01/19 - 01/21 Functional programming and Racket .
3 01/26 - 01/28 Functional programming and Racket .
4 02/02 - 02/04 Induction and recursion Exam 1 (Tue)
5 02/09 - 02/11 Recursive programming techniques .
6 02/16 - 02/18 Recursive programming techniques .
7 02/23 - 02/25 Recursive programming techniques .
8 03/01 - 03/03 Syntactic abstraction Exam 2 (Tue)
9 03/08 - 03/10 Syntactic abstraction .
. 03/15 - 03/17 spring break .
10 03/22 - 03/24 Syntactic abstraction .
11 03/29 - 03/31 Syntactic abstraction .
12 04/05 - 04/07 Data abstraction Exam 3 (Tue)
13 04/12 - 04/14 Data abstraction .
14 04/19 - 04/21 Interpreters .
15 04/26 - 04/28 Interpreters; course wrap-up .

The FINAL EXAM is Thursday, May 5, from 3:00 PM - 4:45 PM.

Eugene Wallingford ..... ..... January 10, 2016