This course studies the issues that control the design of programming languages, the techniques that help to implement them, and the consequences of various design and implementation decisions for the programmer. Although much of the course material is presented in the form of case studies of various programming languages, the purpose of these case studies is not to learn to write code in a number of different languages. Rather, each language is used to illustrate some principles of design and implementation that are key to that language.
The design and implementation of a programming language each involves an immense number of separate but inter-related decisions. In order to think about a programming language, we must make many simplifying assumptions to limit the range of possibilities considered. Of course, the most important advances in programming languages result from changing the basic assumptions on which previous designs were based. One of the key intellectual challenges in this course is to assimilate a number of substantially different ideas of what a programming language is for, and to see the consequences of these different ideas for the designer, the implementer, and the user of the language.
At the end of the course, you should be able to assimilate rapidly information about any new programming language that you encounter (especially one that hasn't been invented yet), and make reasonable judgments about its tractability for implementation and its suitability for various tasks. You will not necessarily be ready to design your own programming languages, nor to implement interpreters and compilers, but you should be very well prepared for advanced courses on those tasks.
You must have learned the essential skills of computer programming in Com Sci 106 (dead link) or 116 (dead link). The language in which you learned to program (106 uses C, and 116 uses Scheme) is not important. What is crucially important is that you have acquired the skills of inventing algorithms to solve modest computational problems, and working rapidly from a manual for a new programming language to express algorithms in that language. About half a dozen different programming languages are discussed in the text, with programming assignments in several of them. No lecture time can be allotted to coaching on the details of writing code, so you must be able to pick that up independently.
Part I of the text is a motivational survey, and I skim it. We will focus attention on Parts II and IV, plus Chapter 11 of Part V, with material from Part VI drawn in from time to time. Lectures are complementary to, rather than a review of, the text. You are responsible for understanding the presentation in the text, as well as my different discussion of the same topics in class.
Homework is assigned approximately weekly, and the homeworks are essential coursework, constituting approximately 45% of the grade calculation. Homework involves independent problem solving, as well as assimilation of material. Homework is due to be handed in by email before class on the due date. I am very unfriendly to the practice of working on homeworks instead of coming to class. I am also very unfriendly to repeated lateness in handing in homework, other than for serious reasons such as illness. In particular, problems with the computer systems are not excuses for lateness on homeworks. There are always unanticipated problems with computer systems; part of your job is to schedule your work so as to allow for those problems. As long as lateness is very infrequent (less than one instance per person), I have no particular policy. If I sense that lateness is annoyingly frequent, I will declare a very draconian policy, or perhaps a draconic one.
There is a midterm exam sometime around the 6th week, and a two-hour final exam at the end of the course. The midterm will probably be a self-timed take-home. Exam questions are shorter than homework questions, but they also require independent problem solving, as well as explanation of facts learned in the course. All exams allow open book and open notes.
In all of your work, strive for clarity and good signal-to-noise ratio, rather than writing a mass of material only some of which is relevant. Work is graded on its total value as a communication of technical ideas, not just on whether or not it contains correct information. In particular, programming assignments are judged for the insight that they yield to a human reader. Correct execution on examples is necessary, but far from sufficient, for a good grade. Intelligent selection of test cases is part of your responsibility in performing a programming assignment. If the clarity of your ideas is obscured by a sloppy layout, that will affect your grade.
I will evaluate your written participation in the online discussion described below. I will award some points for asking valuable questions, more for contributing interesting ideas or answering questions.
Exams | 40% |
Homeworks | 45% |
Participation | 15% |
We make crucial use of three forms of electronic communication in CS221: the World Wide Web (WWW), online discussion with HyperNews, and electronic mail.
http://www.classes.cs.uchicago.edu/classes/archive/2000/fall/CS221-01/index.html
.
The recommended tools for viewing this material are Network
Explorer and NetScape from graphics terminals and
Lynx from character terminals.odonnell@cs
. Homework is also turned in by email. These
will normally be the only types of correspondence that should be
made by electronic mail.