[Required] Randal E. Bryant and David R. O'Hallaron,
Computer Systems: A Programmer's Perspective, Addison
Wesley, Third Edition, ISBN-10:0-13-409266-X, ISBN-13:
978-0-13-409266-9
[Required] Stephen G. Kochan, Programming in C,
Fourth Edition, Stephen G. Kochan, ISBN-13: 978-0321776419,
ISBN-10: 0321776410
[Recommended] Bryan W. Kernighan and Dennis M.
Ritchie, The C Programming Language (ANSI C), Second
Edition, Pearson, 1988, ISBN-10:0131103628,
ISBN-13:9780131103627
All books are available from the BU bookstore. You can also
check the publisher's site or sites like Amazon for cheaper
options (rental, electronic, or kindle versions). A copy of
each of the books will be placed on reserve in the Science and
Engineering Library. You can access these copies from the
circulation desk for 2-hour in-library loans.
NOTE: The last day to drop a course without a 'W' grade is October
7. The last day to drop a course with a 'W' grade is November 8. The
Registrar's website provides further information about important dates.
Course Summary:
This course takes a programmer's perspective to learn about
the inner structure of computer systems, the design and
implementation of abstractions that enable humans to use
computers efficiently, the basics of C and assembly programming,
the mapping between C and assembly, and between assembly and
machine language, and the role of operating system
software.
Our goal is to learn what a "beautiful" computer system is and
how it works. Quoting an Italian painter named Elio Carletti:
Beauty is the summation of the parts working together in such a
way that nothing is needed to be added, taken away or
altered.
We will also learn how to become strong ("brilliant")
programmers who write fast and reliable programs. Quoting Albert
Einstein: Computers are
incredibly fast, accurate, and stupid; humans are incredibly
slow, inaccurate and brilliant; together they are powerful
beyond imagination.
CS 210 is a principal course for computer science majors. It
provides background for courses in the systems area such as
operating systems, compilers, and networks, not to mention more
advanced courses in computer architecture.
Prerequisites:
This course assumes that students have a solid background in
Python, Java, or C++ programming from CAS CS 111 or equivalent.
CS 112 is also
recommended, but not essential for students with strong
programming skills. A solid working knowledge of operating
systems, such as Unix/Linux and Windows, is also assumed. CS 131
or MA 293 is helpful for the material on Boolean logic and data
representation, but is not essential. We will make use of
C as an example high-level language because its syntax and
semantics are closer to assembly language concepts. C is more
suitable for exposing low-level system details and achieving
higher performance in real implementations. If you know C++,
this should not distract you since C is mostly a subset of C++.
C and C++ both share many of the same fundamental programming
constructs. C, however, lacks support for object-oriented
programming. On the other hand, if you know Java or Python,
there are aspects of C, particularly pointers, explicit dynamic
memory allocation and formatted I/O, which do not exist in Java
and Python. Fortunately, the classic K&R required text is an
excellent reference to the relatively small C language.
Discussion Sections:
The Teaching Fellows will lead the discussion sessions. The
objective is to re-enforce the concepts covered in the lectures,
and answer questions (or provide clarifications) regarding the
homework and programming/lab assignments.
The schedule for discussion sections can be found above
(please check regularly for updates).
NOTE: The purpose of the office hours of the Instructor,
Teaching Fellows and other Assistants is to answer specific
questions or clarify specific issues. Office hours are not to be
used to fill you in on a class you skipped, or to debug or write
your entire programming assignments. Please come to class and to
your discussion session.
Online Resources:
We will be using Piazza
for class discussion. The system provides an online forum for
asking questions, posting comments and helping others. Rather
than emailing questions to the teaching staff, you are
encouraged to post your questions on Piazza. Students are
encouraged to post responses to questions, but please use common
sense when giving answers. You should not post solutions to
entire problems online. If you have any problems or feedback for
the developers, email team@piazza.com.
Programming Assignments & Homeworks:
This course will involve several programming assignments, to
test your understanding of computer systems. With resources such
as github, dropbox and other cloud storage facilities, it is
tempting to post one's source code online. Please do not
share, or make publicly accessible, any source code related to
the course, unless permission is granted by the instructor. Solutions
to assignments should be your own work, unless you are permitted
to work in groups, in which case you will still be required to
demonstrate your contributions and understanding of each entire
assignment. While it is tempting to search the Internet for
solutions to problems, spend time thinking about the
problem and how it can be decomposed into logical
sub-components. Too often people cut and paste code snippets off
the Internet without proper understanding. Spend some time to
think about what you are trying to do before taking this course
of action. You might just learn more!
We will use gsubmit for submission of assignments. Unless
stated otherwise, you should submit all source code files along
with a README file explaining how to compile, run, and test your
code. Included in the README file should also be sufficient
documentation to explain the basic design of your code, along
with any sources of information you used to develop your
solution.
Every file submitted by a given student for a given assignment
should have a unique file name. If a file is submitted with a
duplicate name it will either overwrite the file or generate an
error message.
To make it easy for a grader to find the files relating to a
specific assignment, all files for each assignment should be
stored in a subdirectory
called ps1, ps2, pa1, pa2, pa3, etc. and the entire directory
should be submitted. Use 'ps#' for problem set number #, and
'pa#' for programming assignment number #.
To submit an assignment:
Create a subdirectory "pa#", where # is the assignment
number. This is done using the mkdir command: e.g., mkdir pa5
Copy all files necessary for that assignment into the new
subdirectory, using the cp command: e.g., cp prog1.c pa5
Be sure to copy only the files you need to submit into
this subdirectory.
Use gsubmit to submit the entire subdirectory: e.g.,
gsubmit cs210 -cp pa5
If submission is successful a status message will be
printed.
If you only submitted part of the assignment and would like
to add another file:
To submit a file README.txt to subdirectory pa5, type (at
the prompt):
gsubmit cs210 -cp README.txt pa5
To resubmit a file prog1.c in subdirectory pa5, first
un-submit the file:
gsubmit cs210 -rm pa5/prog1.c
Then resubmit it:
gsubmit cs210 -cp prog1.c pa5
To list all files which you have submitted:
gsubmit cs210 -ls
To look at a file which has already been submitted:
gsubmit cs210 -cat pa5/prog1.c
You can store this in a file foo.c by typing gsubmit cs210
-cat pa5/prog1.c > foo.c
Where do submitted files go?
Each student who submits an assignment has a subdirectory
created to hold his/her files, in a directory for the
specified course. This is called the student's "submission
spool directory".
How can the grader tell when a file has been submitted?
Every gsubmit command is automatically logged in a log file,
along with a time stamp. For further information, type: man
gsubmit.