CS 15-212: Principles of Programming
(Spring 2012)
|
|
This course has the purpose of introducing students who have had experience
with basic data structures and algorithms to more advanced skills, concepts
and techniques in programming and Computer Science in general. This will be
accomplished along three dimensions.
- The main skill you will get out of this course is a logical attitude
toward problem solving. You will learn how to decompose a problem into
manageable parts, how to compose their solutions into a complete program,
and how to reason about programs to ensure that they are correct
- As we do that, you will be exposed to some advanced but pervasive concepts
in Computer Science and programming. In particular, you will learn about
induction and recursion, program correctness, symbolic computation,
search, structuring large programs, computability, streams, concurrency,
and more
- Our vehicle for achieving these objectives will be Standard ML, one of the
most advanced experimental programming languages brewing in the labs
worldwide. SML will expose you to a programming paradigm that is totally
different from what you have seen in earlier classes, namely functional
programming. This will give you first-hand experience with a number
of high-level programming techniques such as recursion, higher-order
functions, data abstraction, polymorphism, exceptions and modularity.
Bits and pieces are found in current commercial programming language such
as Java, and more will be part of the programming languages of the future
You must have completed CS 15-251
(Great Theoretical Ideas in Computer Science).
It is my goal to make this course successful, stimulating and enjoyable. If
at any time you feel that the course is not meeting your expectations or you
want to provide feedback on how the course is progressing for you, please
. If you would like to provide
anonymous comments, please use the feedback form on the
course home page or slide a note under my door. Comments of general interest will be answered on the course discussion board.
The course relies extensively on the programming language Standard ML (SML)
and related utilities, mainly ML-Lex, ML-Yacc and Concurrent ML. The
particular implementation we will be working with is Standard ML of New Jersey (SML/NJ), version
110.73.
SML on Your Own Laptop
The most convenient way to use SML is to install a personal copy of SML/NJ on
your laptop. For Windows laptops, download this
file and follow these
instructions. If you run a different operating systems, read here.
SML at CMU-Q
A reference build has also been made available in the Unix clusters. To run
it, you need to login into your Unix account. In Windows, you do this by
firing PuTTy and specifying unix.qatar.cmu.edu as the machine
name. When the PuTTy window comes up, type sml, do your work,
and then hit CTRL-D when you are done.
You can edit your files directly under Unix (the easiest way is to run the
X-Win32 utility from Windows and then run the Emacs editor from the PuTTy
window by typing emacs - see also this tutorial).
If you want to do all this from your own laptop, you first need to install
X-Win32 from here.
PuTTy is pre-installed in Windows.
Documentation
Useful documentation can be found on the SML/NJ web site. The following files will be
particularly useful:
The 15-212 Wiki
The material for all lectures can be found on the 15-212 wiki. This is
wiki, not a textbook. The main differences are:
- It is dynamic: the content will change over time (for the better)
- It will always be work in progress
- Everybody can make updates. This means YOU!
Further References
This is a 12 unit course.
- Daily homework and Participation: 15%
- At the end of the every lecture, you will be given daily
homework, a couple of simple exercises or questions collected
during the next recitation. Each will be graded, with negative points for missing or sloppy
work.
- Participation has three components:
- Class participation: volunteer to answer questions asked to the
class
- Class preparedness: you must have done the readings before coming
to class
- Involvement with the wiki: if you see an error, correct it; if you
have a better explanation for something, change it; if you see
something missing, add it
- Assignments: 60%
- 5% for 1-week assignments and 10% for 2-week assignments, for a total
of 60%
- Due on Saturdays at 11:59pm Doha time. Submit on the Blackboard.
- After that, late homeworks will be accepted until the beginning of next recitation, but with a 25% penalty
- Graded by the following Sunday based on
- To encourage good work and integrity, the instructor may invite
students to his office to explain their solutions. Should this happen,
the students' explanations will become part of their grades for that
assignment
- No joint assignments unless explicitly instructed
- Midterm exam: 10%, in class, closed books
- Final exam: 15%, 3 hours, open books and notes (but not laptops)
- Bonus points: up to 10% for
particularly elegant solutions
- Negative
points: at least -100% if caught
cheating
Late Policy
Every student has up to 3 late days. You can use only one late day per
homework (this is so that we can discuss assignments in recitation after they
are due). No fractional late days: if you submit 1 minute late, you have used
up a full late day. You should use late days for emergencies only: if you
start early, you will not need them.
Academic Integrity
You are expected to comply with the University Policy
on Academic Integrity and Plagiarism.
Collaboration is regulated by the whiteboard policy: you can bounce
ideas about an assignment, but when it comes to typing it down for submission,
you are on your own — no notes, snapshots, etc., you can at most reconstruct
the reasoning from memory.
Course Objectives
This course seeks to develop students who:
- can leverage the mathematical structure of a problem to develop a
solution
- can use abstraction and modularity to manage complexity
- can use formal arguments to prove the correctness of a problem
solution
- master a non-declarative programming paradigm
- have gained advanced skills, concepts and techniques in programming and
Computer Science
Learning Outcomes
Upon successful completion of this course, students will be able to:
- explain and use basic programming language
concepts such as typing, evaluation, declarations, expressions,
values, and types
- explain and use advanced programming language
concepts such as data types, pattern matching, polymorphism,
higher-order functions, continuations, exceptions, streams,
memoization, modularity, concurrency
- design recursive algorithms and develop
recursive programs
- use mathematical induction to prove program
correctness
- model problems in Computer Science using
lists, trees and graphs
- program symbolic solutions to problems using
data types and pattern matching
- use polymorphism and functional arguments to
build reusable program modules
- develop abstract and parametric modules for
code reusability
- write basic concurrent programs correctly
- recognize non-computable problems and give
formal arguments to support non-computability claims