Welcome to the honors track COMP 151H, which takes over where COMP 104H
left off. This course is designed to give you the solid software engineering
experience necessary to build, extend, and maintain a realistically sized
non-toy program, using both traditional and up-to-date techniques that you
will need on the job. Most students find that C++ and other modern languages
offer a huge, confusing variety of different and often-contradictory
complexities. In this sequence you will untangle the confusion by gaining an
enhanced holistic theoretical perspective, comparing and contrasting the most
important paradigms of programming languages.

Understand by doing. The only way to learn languages is
through serious practice. The only way to appreciate software engineering is
to engineer some serious software. And by far the best way to understand
programming languages is to implement one.

So, through an integrated series of programming assignments, you will use
C++ to gradually implement your own complete interpreter for a real
programming language that is a small but fully operational version of Scheme
(or Lisp).

You will learn the most important procedural, static and dynamic
object-oriented, and generic programming paradigms of C++ programming,
through hands-on practice with building the basic pieces of your Scheme
interpreter. The Scheme programming project will help deepen the C++ concepts
you have learned, by giving you a better understanding of the functional and
generic programming roots and foundations that underlie the design and
effective use of STL in the C++ Standard Library. If we progress sufficiently
rapidly, then we will also learn about the syntactic description and analysis
of programming languages, and their runtime environments. Throughout the
entire series, you will focus on developing adequate software engineering
habits, so that you can continue to build, extend, and maintain the code you
have built so far.

Reference Books

The C++ Programming Language (3rd Edition), by Bjarne
STROUSTRUP. Addison-Wesley, 1997. ISBN: 0-201-88954-4. This classic
reference (by the designer of C++) is a must-have for every serious C++
programmer, covering details often omitted in textbooks.

C++ Primer (4th Edition), by Stanley B. LIPPMAN and Josee
LaJOIE. Addison-Wesley, 2005. ISBN: 978-0201721485. This traditional
text can be used as a first book for learning C++ but assumes that the
reader is familiar with programming, and more insightful textbooks have
now appeared since it was first written.

C++: Effective Object-Oriented Software Construction: Concepts,
Principles, Industrial Strategies, and Practices (2nd Edition), by
Kayshav DATTATRI. Prentice Hall, 1999. ISBN: 978-0130867698. This
book is good provided that you are fluent with C++ and it emphasizes more
on the design, programming techniques, and why C++ is designed as it is
now.

To receive a passing grade, you are required to sign an honor statement acknowledging that you understand and
will uphold all policies on plagiarism and collaboration.

Plagiarism

All materials submitted for grading must be your own work. You are advised
against being involved in any form of copying (either copying other people's
work or allowing others to copy yours). If you are found to be
involved in an incident of plagiarism, you will receive a failing grade
for the course and the incident will be reported for appropriate disciplinary
actions.

Collaboration

You are encouraged to collaborate in study groups. However, you must write up
solutions on your own. You must also acknowledge your collaborators in the
write-up for each problem, whether or not they are classmates. Other
cases will be dealt with as plagiarism.

The course will be graded on a curve, but no matter what the curve is, I
guarantee you the following.

If you achieve

85%

you will receive at least a

A

grade.

75%

B

65%

C

55%

D

Your grade will be determined by a combination of factors:

Midterm exam

~20%

Final exam

~25%

Participation

~5%

Homework

~40%

Labs

~10%

Examinations

No reading material is allowed during the examinations. No make-ups will be
given unless prior approval is granted by the instructor, or you are in
unfavorable medical condition with physician's documentation on the day of
the examination. In addition, being absent at the final examination results
in automatic failure of the course according to university regulations,
unless prior approval is obtained from the department head.

There will be one midterm worth approximately 20%, and one final exam
worth approximately 25%.

Participation

Software engineering is about communication between people. Good
participation in class and/or the online forum will count for approximately
5%.

Homework

All programming assignments must be submitted by 23:00 on the due
date. C++ programming assignments must be compiled using g++ on
Unix and will be collected electronically using the automated CASS
assignment collection system. Late assignments cannot be accepted. Sorry, in
the interest of fairness, exceptions cannot be made.

Programming assignments will account for a total of approximately 40%.

Labs

Laboratory/tutorial assignments will be due Wednesday of the week after
they are announced at 23:00. Laboratory/tutorial assignments must be in
C++ on Unix and will be collected electronically using the
automated CASS assignment collection system. Late assignments cannot be
accepted. Sorry, in the interest of fairness, exceptions cannot be made.

You will also have the option to turn in your laboratory/tutorial
assignments in lab by demonstrating to the TA. This will
also give you an opportunity to get an early indication of whether your
assignment is correct. If not, you may still decide to fix it, and then wait
until the Wednesday 23:00 CASS collection to turn in your assignment.

There will be up to 10 laboratory/tutorial assignments, which in total
will count for approximately 10%.