Course Information

About

This course gives a solid understanding of the principles and abstractions used in computer systems and machine programs using C. Towards this aim, it covers a broad range of topics, providing students with an in-depth perspective and programming experience regarding the basic topics of C language and how programs are formed and executed at the microprocessor-level.

Upon the completion of COMP201, student will be able to (1) demonstrate proficiency in writing C programs that require effective memory management, (2) gain a deep knowledge of the compilation flow and runtime behavior of C programs, (3) have a clear understanding of computer arithmetic in a modern computing system, (4) recognize the relationship between a C program and its assembly translation, and (5) gain a general sense of working in a Unix environment as a power user, getting familiar with shell tools, version control systems, compilers, debuggers, profilers.

The course is taught by Aykut Erdem, Ali Kerem Bozkurt, Burak Kizil, Deniz Bilge Akkoc, Enes Sanli, Ahmet Ertuğrul Sevinç, Aykhan Ahmadzada, Bedirhan Sakaoglu, Bera Nazli, Emre Efe, Enes Talha Gunay.

                         
                                                       

Time and Location

Lectures: Tuesday, Thursday at 16:00-17:10 (SNAB172)
Labs: Friday at 13:00-14:40 (Lab A) (SNAB242), 10:00-11:40 (Lab B) (SNAB242)

Reference Books

Policies: All work on assignments must be done individually unless stated otherwise. You are encouraged to discuss with your classmates about the given assignments, but these discussions should be carried out in an abstract way. That is, discussions related to a particular solution to a specific problem (either in actual code or in the pseudocode) will not be tolerated.

In short, turning in someone else’s work, in whole or in part, as your own will be considered as a violation of academic integrity. Please note that the former condition also holds for the material found on the web as everything on the web has been written by someone else.

Communication

The course webpage will be updated regularly throughout the semester with lecture notes, presentations, assignments and important deadlines. All other course related communications will be carried out through Blackboard.

Pre-requisites

COMP201 is open to second-year undergraduate students. Non-COMP students should ask the course instructor for approval before the add/drop period. The prerequisites for this course is COMP 132 - Advanced Programming.

Course Requirements and Grading

Grading will be based on

Schedule

Date Topic Notes
Oct 7 Introduction. Course logistics, A tour of C programs (slides) (code) B&O 1

Additional Reading:
The Strange Birth and Long Life of Unix, Warren Toomey, IEEE Spectrum, 28 Nov 2011
“A damn stupid thing to do”—the origins of C, Arstechnica
Oct 9 Bits and Bytes, Representing and Operating on Integers (slides) (code) B&O 2.2-2.3

Additional Readings:
Oct 10 Bootcamp: Programming with C and Git basics (slides)
Oct 14 Bits and Bitwise Operators (slides) (code) B&O 2.1
Oct 16 Floating point (slides) (code)
Assg0 out: Getting Started with Unix and C
B&O 2.4
Additional Reading: What Every Computer Scientist Should Know About Floating-Point Arithmetic, David Goldberg, ACM Computing Surveys, 23(1), 1991

Demos:
Oct 17 Lab 1: The Linux Shell (slides) MIT MS The Shell
Stanford CS107 Unix videos 1-15, 24, 25
Oct 21 Chars and Strings in C (slides) (code) K&R 1.9, 5.5, Appx B3
Oct 23 More Strings, Pointers (slides) (code)
Assg0 in, Assg1 out: Strings in C
K&R 1.6, 5.5, Essential C 3 (strings and string.h library functions, The mechanics of pointers and arrays)
Oct 24 Lab 2: Bits, Ints and Floats, Vim (slides MIT MS Editors (Vim)
Stanford CS107 Unix videos 28
Oct 28 No classes - Republic Day
Oct 30 Arrays and Pointers (slides) (code) K&R 5.2-5.5, Essential C 6 (Advanced pointers)
Oct 31 Lab 3: C-Strings and GDB (slides) Stanford CS107 Unix videos 26
Nov 4 The Stack and The Heap (slides) K&R 5.6-5.9, Essential C 6 (The heap)
Nov 6 Realloc, Memory Bugs (slides) (code)
Assg1 in
K&R 5.6-5.9, Essential C 6 (The Heap)
Nov 7 Lab 4: Arrays, Pointers and Valgrind (slides) Stanford CS107 Unix videos 27
Harvard CS50 short on GDB
Nov 11 void *, Generics (slides) (code) K&R 5.6-5.9, Essential C 6 (The Heap)
Nov 13 Function Pointers (slides) (code) K&R 5.11
Nov 14 No labs this week
Nov 18 const, Structures (slides) (code) K&R 6.1-6.7
Nov 20 Midterm Review
Nov 20 Midterm Exam (Midterm Exam Guide)
Nov 21 No lab this week
Nov 25 Compiling C programs (slides) (code)
Assg2 out: Heap Management
Stanford Unix Programming Tools 1
Nov 27 Introduction to x86-64, Data Movement (slides) (code) B&O 3.1-3.4

Additional reading:
Nov 28 Lab 5: Structs, Working with multiple files, writing your own Makefiles (slides)
Dec 2 Arithmetic and Logic Operations (slides) B&O 3.5-3.6
Dec 4 x86-64 Control Flow (slides) B&O 3.6.1-3.6.2
Dec 5 No labs this week
Dec 9 More Control Flow (slides)
Assg2 in, Assg3 out: Defusing a Binary Bomb
B&O 3.6.3-3.6.8 B&O 3.7
Dec 11 x86-64 Procedures (slides) (code)
Dec 12 Lab 6: Machine Programming with Assembly (slides)
Dec 16 Data and Stack Frames (slides) B&O 3.8-3.9
Dec 18 Security Vulnerabilities (slides) (code) B&O 3.10
Additional Reading: Smashing the Stack for Fun and Profit, Aleph One
Dec 19 Lab 7: Runtime Stack (slides)
Dec 23 Cache Memories (slides)
Assg3 in, Assg4 out: Buffer Overflow Attacks
B&O 6.1-6.4.2
Dec 25 More Cache Memories (slides) B&O 6.4-6.7
Demos:
Cache Simulator
Dec 26 Lab 8: Memory organization (slides
Dec 30 Optimization (slides) (code) B&O 5
Jan 1 No classes - New Year's Day
Assg4 in
B&O 9.9
Jan 2 No labs this week
Jan 6 Linking (slides) B&O 7
Jan 8 Wrapping Up (slides)
Jan 9 Lab 9: Code Optimization
Jan 15 Final Exam (Final Exam Guide)