Principles of Programming Languages
CSCI 3155, Fall 2003

Table of contents


Administrivia

Instructor: Amer Diwan (diwan%40cs.colorado.edu)
Office: ECOT 743
Office hours:  Tu 3:00 to 4:30, Th 2:00 to 3:30, and by appointment
Class times: TuTh 12:30 to 1:45
Class location: ECCR 1B40
Class web page:  www.cs.colorado.edu/~diwan/3155-03
TA: Christoph Reichenbach (reichenb%40cs.colorado.edu)
TA office hours:   M 3:00 to 6:00, F 12:00 to 1:00; Location: CSEL
Recitations: Wed 8:00-8:50 (ECCR 151), 1:00-1:50 (MUEN E417), 4:00-4:50 (ECCR 155)

Goals

You will learn concepts that will make it easier for you to learn new programming languages.

Why? Off the top of my head I've used the following languages, for real work: Alpha Assembler, awk, bash scripting language, C, C++, FORTRAN, Hypercard, Java, Lisp, Modula-2, Modula-3, Pascal, Python, SML, and VAX Assembler.  In many of these languages I've written tens of thousands of lines of code. Over the course of your career, you too will use many, many languages, and you will need to be able to pick a new language quickly, without somebody having to teach it to you. In this course, you will learn concepts that allow you to zoom in quickly on some of the common ways languages differ, so as to be able to relate a new language to ones you already know, and speed up the learning process.

 You will learn how to evaluate a language for a particular purpose.

Why?  Different languages have different strengths and weaknesses.  A language may be very suitable for one task but too cumbersome for another.  This is the reason why I've used such a wide variety of languages in my career!  Just as you’ll be learning many languages in your career, so you’ll be making many language choices. 

 You will learn how to design a new language.

Why? You may not realize it, but the chances are pretty good that you will design one or more languages during your career. I’ve designed many small languages during my career; you will see one of them in this class (called mystery).  Programming languages are pervasive and many large applications today have little languages of their own (e.g., for writing macros).  If you work in the software industry chances are high that you will design and implement a number of small languages during your career.

One of our faculty (Evi Nemeth) asked her former students what computer science courses they found particularly invaluable in their jobs.  Many of them named the language design and implementation courses they had taken at CU.

You will improve your ability to work collaboratively.

Why? "A recent survey of employers of graduates with bachelor's degrees in engineering found that of eight employee attributes, the one which the greatest number of employers valued highly was teamwork-- and engineering graduates were less prepared in this area than in math and sciences" [Bucciarelli and Kuhn, 1997].

On a more immediate note, researchers report that students learn more effectively and efficiently when they work together on learning with their colleagues.

You will improve your ability to learn from written materials.

Why? Learning can be easy (though often slow) if someone is available who can spell out for you everything you need to know. But in real life there’s often no-one available to do this, and/or no time for the teaching to be arranged and carried out. Especially in today’s information-rich world, you need to be able to get what you need from books and from the Web. You may already be very good at this, but some of you are not. If you are not, you’ll get better in this course.

You will improve your ability to learn and use abstract ideas.

Why? You can know a lot of things without seeing the big picture. In the world of programming languages people have developed concepts and terms that are convenient for representing the big picture, or at least parts of it. These concepts save you a lot of work, once you master them. But learning the concepts, and using them, is quite different from getting to be skilled in different specific languages. For some of you, the concepts will be easy to grasp and work with. Others of you will work at this and improve.

You will learn how to focus on learning, rather than just on satisfying course requirements.

Why? The point of having homework assignments and projects in a class is that you should learn from them. But it’s an easy confusion to think that the point of an assignment is to turn in what you are asked to turn in, rather than to learn. Here’s a common example: an assignment has some reading and some exercises. You only read the parts of the reading that is necessary to do the exercises. What’s wrong with that? You didn’t read all of the material, and hence you didn’t give yourself a chance to learn from all of it.

You will increase your level of interest and enthusiasm for Computer Science.

Why? While there are exceptions, few people excel at things they don’t enjoy.  There’s fun in understanding some of the bright ideas that show up in programming languages. There’s fun in the creativity of design. There’s fun in working together to learn powerful ideas that aren’t  obvious. We’ll all be working to share these experiences.

You will help improve this course and other CS courses, now and in the future.

How? My collaborators (primarily Bill Waite and Michele Jackson) and I, with funding from the National Science Foundation, have been studying new approaches to teaching and learning in a range of Computer Science courses, including this one. The methods and approaches we’ll be using this semester are based in part on this work, and studying what works and doesn’t work for you will help improve our courses in the future.

Methods and Tools

The Conversational Classroom. Sitting in a room listening to somebody talk is not the best way to learn (and much research backs this up). This course will de-emphasize listening to me talk and emphasize your learning ideas from resources out of class, and discussing problems and questions in class. We’ll try to make our classroom a place of active conversation, rather than passive listening.  You can find out more about the conversational classroom by reading this article.

The PL-Detective. The PL-Detective is a tool based on our (my collaborators and myself) experience in teaching computer science courses.  The PL-Detective aims to make learning programming language concepts fun while attempting to address many of the goals enumerated above.  Click here to get a paper describing the PL-Detective.  We will use the PL-Detective not just for assignments but also for classroom demonstrations.


Texts

The main text for this course is Concepts of Programming Languages by Robert Sebesta (6th ed).  The library has several books on reserve that you may find useful, particularly Programming Language Concepts 3rd Edition by Carlo Ghezzi and Programming Language Pragmatics by Michael Scott. 

Course requirements

Assignments 30%
Midterm exams 40%
Final exam 30%

There will be weekly assignments and several of the assignments will involve programming.  All assignments will be due at 12 noon on Tuesday (i.e., before class) unless the assignment specifies otherwise.  No extensions will be granted except in the case of emergency, in which case the student must provide appropriate documentation.

There will be two in-class midterm exams.  All exams are closed-book.

Students are responsible for the material covered in the readings, the material covered in the assignments, and the material covered in the classes.  I will expect you to have read the assigned pages before coming to class.

   


Grading

For the non-code parts of an assignment/exam we will consider the following:

For the code parts of an assignment/exam, we will consider the following:


Collaboration policy

We strongly encourage you to work together in learning the material.  As a matter of fact, most of the assignments will involve group work.  If a student outside your group helps you in your assignment, you should note it in your submission.  As a matter of fact, we encourage you to talk both to your group members and other students when learning the material or doing the assignments.  If your submission includes quotes from a book, paper, or web site, you should clearly cite the original source at the point of the quotation.  Bottom line: feel free to use whatever resources that are available to you as long as you cite them in your submission.


Mailing list

Please sign up for the mailing list by filling out this form. Feel free to post any relevant question/opinions to this mailing list by sending mail to: csci3155@cs.colorado.edu.  I often post important and time-critical announcements to this list so please make sure you get on it as soon as possible.  You can get to the archives of this mailing list by clicking on the "archives" link on http://www.cs.colorado.edu/mailman/listinfo/csci3155


Calendar

The following table gives the topics we will cover in the class and the approximate number of lectures to be spent on each topic.  The "Reading" column lists the reading material for the class. You should do the reading for a class before attending the class

How to submit assignments

All assignments should be submitted electronically.   Following are directions for submitting assignments.

Some useful things to know about online submission


Interesting links

Course page for previous years taught by me: Spring 2001, Spring 2002 (You may find the assignments and exams particularly useful)
C++ language definition

Modula-3 language definition
Using opaque types for Modula-3 I/O library
Java language definition
Full SML tutorial
Ada reference manual
Eiffel
C# language definition
Haskell programming language

Acknowledgements

This web page and course has benefited greatly from the web pages and experience from earlier versions of this class taught by Michael Main, William Waite, Martin Hirzel, and Clayton Lewis