A programming language is a programmer's principle interface to 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 principle features and overall design of both traditional and modern programming languages. You will examine language features both in isolation and in the context of more complete language descriptions. The material will enable you to:
Quickly learn programming languages, and how to apply them to effectively solve programming problems.
Rigorously specify, analyze, and reason about the behavior of a software system using a formally defined model of the system's behavior.
Realize a precisely specified model by correctly implementing it as a program, set of program components, or a programming language.
We will examine features of a large variety of languages, though we will not study many of languages themselves extensively. Like other CS courses, we will discuss alternate ways of solving problems, looking at the pros and cons. Because programming languages are so tied up (and motivated by) programming problems, we will not only investigate language features, but also the software engineering problems that spawned them.
At the end of this course you will have a more thorough understanding of why certain programming language features provide better 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 issues. As an example, by the end of the course, you should be able to understand why Java has replaced C++ language of choice for many projects and to recognize where language design is likely to head in the future.
An important feature of this course is the discussion of programming language paradigms (in particular, languages supporting new ways of thinking about implementing algorithms). We will investigate both the new features themselves and the software engineering problems which spawned these developments.
We will be using the following text book:
Additional readings will be posted on the web site. The segments of the course that introduce new programming language paradigms will also feature some programming in languages representative of the functional and object-oriented paradigms (Lisp, ML, Scala, and possibly others).
Lectures will be Tuesday and Thuesday 9:55-11:10 in Schow 30A.
Problems involving analysis of programming language features will be assigned weekly and typically due at the beginning of class on Tuesday.
Each student may use a maximum of three late days during the course of the semester. A single late day enables you to hand in the homework up to 24 hours after the original due date. Once those late days are used up, late homework will be penalized 20% per day.
The homeworks will often include small programming assignments to reinforce conceptual ideas from lecture and expose you to different programming paradigms. For some of these you will be required to work with a partner. I will provide more details on the first homework including a programming component.
We will use the Computer Science Department's Unix computers in TCL 312 or TBL 301. for the programming problems. If you are not familiar with the Unix computing environment, talk to me or the TA as soon as possible so we can bring you up to speed on what you need to know. You will also be able to do most of the work on your own computers if you prefer, although I'll only be able to provide limited help in setting up the software tools you'll need.
TAs will have office hours in TCL 312. A schedule will be posted on the web page.
There will be midterm and a final project covering topics from lecture, readings, and homework. The midterm will be self-scheduled and taken (tentatively) between 10/27 (noon) and 10/30 (noon). The Final will be a 24-hour take home exam.
Grades will be determined roughly as follows:
Please also read the complete The CS Honor Code and Computer Usage Policy at
Discussing written problems with other students in the class is permitted. However, copying of solutions is not. The work you hand in should be your own. A good rule to follow is that you can exchange broad ideas or general approaches toward problem sets with other students, but you may not engage in any joint writing or step-by-step problem solving. One way to be sure you are not violating the honor code is to refrain from writing/typing/crafting your response to the assignment in the presence of others. Rather, save the writing until you are on your own and working independently.
Also, indicate on your submissions who you discussed the problems with. Uncredited collaborations will be considered a violation of the honor code and will be handled appropriately.
The same rules apply to programming --- feel free to discuss general ideas with others, but the design and code you submit should have been written entirely by you (or your group/partner if it is a group/partner assignment).
I will also occasionally give more detailed collaboration guidelines on some assignments.
You may refer to any course materials and the web sites listed under the Resources heading when completing your homework. You may not use other sources to look for solutions to your homework questions, and you may never copy prose or code directly from another source.
Please do not post your solutions to the CS 334 problem sets or programming problems in any public forum, including public GitHub repositories. Students taking the course should not be looking for solutions, but tempting them by making solutions available is inappropriate. This applies not just to the semester you are taking the course, but to the future as well.
If in doubt as to what is appropriate, do not hesitate to ask me. I'm happy to discuss this anytime.
Students with disabilities of any kind who may need accommodations for this course are encouraged to contact Dr. GL Wallace (Director of Accessible Education) at 597-4672. Also, students experiencing mental or physical health challenges that are significantly affecting their academic work or well-being are encouraged to contact me and to speak with a dean so we can help you find the right resources. The deans can be reached at 597-4171.
The Williams community embraces diversity of age, background, beliefs, ethnicity, gender, gender identity, gender expression, national origin, religious affiliation, sexual orientation, and other visible and non visible categories. I welcome all students in this course and expect that all students contribute to a respectful, welcoming and inclusive environment. If you have any concerns about classroom climate, please come to me to share your concern.
In an attempt to keep our classroom environment as healthy as possible, you will be required to wear a mask at all times in the classroom. If you feel ill, please do not come to class. I will be happy to work with you to make sure you can make up any missed portions of class.
Please let me know if you are unable to attend class due to COVID restrictions. I will work with you to develop a plan that allows you to continue making progress in the course during your time in isolation/quarantine.