CSCI 334: Syllabus

Table Of Contents

Course Objectives

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:

  1. Quickly learn programming languages, and how to apply them to effectively solve programming problems.

  2. Rigorously specify, analyze, and reason about the behavior of a software system using a formally defined model of the system’s behavior.

  3. 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.

Class Materials

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

Lectures will be posted on line, roughly every Tuesday and Thursday morning.

Homework

Problems involving analysis of programming language features will be assigned weekly and typically due at noon on Wednesday.

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.

Programming

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 (or your own) 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.

Conference Sections

We will have hour-long conference sessions on Mondays and Tuesdays. (You signed up for timeslots that meet twice weekly, but we will only use one of those slots per week.)
We can use conference time for many purposes:

You should plan to come prepared to discuss the lectures from the previous week, as well as the homework that is due at noon Wednesday. You don’t need to have completed everything, but you should have worked on the homework enough to be able to discuss either a solution or where you are stuck on each problem. It is in your best interest to come prepared with ideas and questions.

TAs

TAs will have office hours and will be available on Slack and via Zoom.
A schedule will be posted on the web page.

Midterm and Final Project

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 4/7 (noon) and 4/10 (noon). The
Final Project will be a chance for you to relate what you’ve learned to a new programming language.

Grades

Grades will be determined roughly as follows:

Midterm: 20%
Final Project: 30%
Homework and programs: 45%
Other (participation, attendance, quizzes, etc.): 5%

Honor Code

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 to work through the problems with others, taking only rough notes. You should then write your solutions independently, referring to your notes as little as possible. The idea is to understand each solution well enough that you can reconstruct it by yourself. In addition, you should write on each assignment the list of people with whom you collaborated.

The same applies 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 if it is a group assignment).

I will occasionally give more detailed collaboration guidelines on some assignments. Uncredited collaborations will be considered a violation of the honor code and will be handled appropriately.

Reference Material

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.

The CS Honor Code and Computer Usage Policy

Please also read the complete The CS Honor Code and Computer Usage Policy at

https://csci.williams.edu/the-cs-honor-code-and-computer-usage-policy/

If in doubt as to what is appropriate, do not hesitate to ask me.

After the semester

Please do not post your solutions to the CS 334 problem sets or programming problems in any public forum, including public GitHub repositories.