Syllabus for Spring 2014

Course Description

This course is a survey of programming languages and paradigms. We will focus on the design of programming languages and compare and contrast different language familes including imperative, object-oriented, functional, and logic paradigms. Topics include syntax, context-free grammars, parsing, semantics, abstract representations of programming processes and structures, memory management, and exceptions. Students will undertake small programming projects in various languages and more extensive projects in two languages of their choice. Students will present the characteristics of their chosen languages to their peers at the end of the term.

Learning Goals

  1. Students demonstrate an understanding of different language paradigms and implement algorithms in each paradigm.
  2. Students demonstrate an ability to independently learn programming languages.
  3. Students demonstrate an ability to describe the syntax, semantics and functionality of different languages in a common, rigorous manner.
  4. Students demonstrate an understanding of the relationship between language and design.
  5. Students work with partners to learn one or more languages and present them to the class.
  6. Students present algorithms, languages, and their characteristics in an organized and competently written manner.

See more information about how this course fits into the department's curriculum here.


The course grade will be determined as follows:

Projects and homeworks will account for over half of your grade, with quizzes and class participation accounting for the remainder. The grading policy on projects is that the tasks specified explicitly in the project description will constitute about 85% of the assignment. If you complete the specified parts of the project properly, and produce a high-quality writeup, it's worth up to a B+ grade. In addition, the project description will include a variety of extensions to the assignment, or you can come up with your own. Completing one or more extensions, in addition to the specified parts of the assignment, will earn you some flavor of A.

In the second half of the course, you'll divide into pairs and learn two languges of different types in depth. You'll be responsible for presenting your languages to the rest of the class, describing how the language deals with various issues and going over syntax, semantics, and example programs.

Deadlines and Collaboration

Weekly homeworks will mostly be small programming assignments or problem sets, which are expected to take less than two hours to complete. Homeworks are due by class time on the given due date. The homework deadline is a hard deadline, since we will usually discuss them in class. Homeworks should be your own work. You are encouraged to discuss the homework concepts among yourselves, but your code and your answers should be your own.

Projects will require significantly more time. You may work in pairs, but expectations will be higher. For full credit, assignments need to be submitted prior to midnight on the due date. Projects submitted late will be penalized 20%.

Collaboration on assignment concepts and ideas between groups is acceptable, but you need to understand everything you do, and your code should be your own group's code. If you use ideas from another group, be sure to indicate that within your code or writeup. Err on the side of caution. The worst thing that can happen is the professor noticing disturbing similarities in homeworks or projects with no attribution of credit.

Project Handin

For the projects, you will need to put together a writeup on a wiki page or web page (you are free to do either). The writeup should describe the assignment, explain any required theory, and present the results. Your audience for the writeup is your fellow students who might be interested in what you're doing. To hand in your code, create a single zip file, give the file a name that clearly indicates the names of both partners, and email it to me. Please do not link code to your wiki/web page.

Class Participation

You are expected to attend every class. Discussion is a vital part of the learning experience and we cannot have good discussion without you!

Academic Honesty

Honesty is at the heart of the academic enterprise. I do not expect to encounter any dishonesty among mature computer science students, but if the unexpected happens, I will not hesitate to follow the procedures in the Colby College catalogue. If you have any questions, please ask me!

Office Hours

Please visit me in my office! During office hours, I will of course be available. Outside of office ours, I will often be in my office with the door open. Please come in! If you want to be sure I will be there, just ask me in person or send me an email. I will do my best to be there.

Preliminary Schedule of Topics

Weekly Topics and Readings

  • Introduction, course concept, background
  • History of Programming Languages
T. & N. Chapter 1
  • Syntax
  • Grammars, Backus Naur Form
  • Concrete syntax
T. & N. Chapters 2-3
  • Abstract syntax
  • Names
  • Variables
T. & N. Chapters 2-4
  • Scope
  • Symbol tables and lifetime
  • Basic types
T. & N. Chapters 4-6
  • Conversions
  • Pointers, arrays, and strings
  • Functions
T. & N. Chapters 5-6
  • Structures and Variants
  • Polymorphism
T. & N. Chapters 5-6
  • Fall Break
  • Practical expression semantics
  • Conditional and Loop semantics
  • Blocks and for loop semantics
T. & N. Chapters 7-8
  • Assignment and expression semantics
  • I/O semantics
  • Exception semantics
T. & N. Chapter 7-8
  • Function semantics
  • Function optimization
T. & N. Chapter 9-10
  • Memory management
  • Concurrent programming
T. & N. Chapter 11
  • Concurrent programming with threads in C
  • Threads in Java/Python
T. & N. Chapter 17
  • VHDL: explicitly parallel
  • Functional programming
T. & N. Chapter 14
  • Logic programming
  • Thanksgiving Break
T. & N. Chapter 15
  • Student Presentations