Course Description

Scope and Topics Covered

The course will teach essential aspects of the design and implementation of programming languages. One goal of the course is to demonstrate both the advantages and disadvantages, depending on the application, of different programming paradigms (functional, imperative, declarative). Some general topics to be covered in the course (not necessarily in this order):
The course will be a brief introduction to each, rather than an in-depth study. Several of these topics are encountered or examined in more depth in several later courses in the CS curriculum.

Programming: The course requires a substantial amount of programming, mostly in Python and Haskell. Some of the assignments will include exercises that involve assembling programs in a declarative style (e.g. mathematical proofs). If your earlier programming experience is entirely within the imperative paradigm (C, C++, Java, etc.), you may find it unnatural or counter-intuitive at the beginning to program in a functional or declarative style. If you complete your programming assignments by their deadlines, you should be able to make the transition from imperative to functional and/or declarative programming rather smoothly.


Tue, Thu 12:30 pm - 2:00 pm, in Room SCI 113 (Metcalf Science Building).

Laboratory Sections


According to the BU catalog and the BU CS course map (click here), CS 112 and CS 131 (or equivalent) are prerequisite courses and CS 210 (or equivalent) is a corequisite course. CS 112 gives you the necessary programming background and CS 131 the necessary theoretical background. Although these two courses are the formal requirement, students are normally expected to have completed 200-level courses in the BU CS curriculum successfully. If you think you miss some of this background, please consult with the teaching staff.


Midterm Exam: Tuesday, October 25, 12:30 pm - 2:00 pm.    Solutions
Final Exam: Saturday, December 17, 12:30 pm - 2:30 pm.    Solutions

The exams are closed book. You may, however, bring one 8.5 by 11 sheet of paper (i.e. one regular-size sheet of paper) as a crib sheet. Preparing a crib sheet can be a useful study aid, so take time in selecting material for it. You may use both sides of the paper and write as small as you like, but in any case, you are allowed only one sheet. No mechanical or electronic reproductions are allowed; the crib sheet must be hand written. If you hand in your crib sheet with your exam, you will get credit for it in your total grade for the exam.

Teaching Staff

Instructor -- Assaf Kfoury
       Office Hours: Tue 2:00 - 3:00 pm, Thu 3:00 - 5:00 pm
       Location: MCS 201 C, e-mail:

Teaching Assistant -- Hanwen Wu
       Office Hours: Tue 3:00 - 4:00 , Wed 2:00 - 3:00, Thu 2:00 - 3:00
       Location: MCS204 (Masters’ Lounge), e-mail:

Discussion Beyond Lectures

For online discussions, we will use Piazza. Click here to sign up (or to login, if you already have a Piazza account). Use Piazza for queries, from enrolled students to instructors, as well as for queries between enrolled students.

Reading Material

All Reading Assignments Will Be From:

Recommended Reading for Python:

Recommended Reading for Haskell:


Maintained by Assaf Kfoury
Created: 2016.08.01    Last modified: 2016.09.06