Course Information


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.

Time and Location

Lectures: Monday, Wednesday at 10:00-11:10 (SOS B07)
Labs: Friday at 16:00-17:40 (Lab A), 12:00-13:40 (Lab B)
Office Hours Tuesday 11:00-12:00 (Aykut)

Reference Books

  • Randal E. Bryant and David R. O’Hallaron, Computer Systems: A Programmer’s Perspective, Third Edition, Pearson, 2016
  • The C Programming Language, Kernighan and Ritchie
  • Nick Parlante, Essential C, Stanford CS Library, 2003
  • Nick Parlante, Julie Zelenski and others, Unix Programming Tools, Stanford CS Library, 2001
  • Anish Athalye, Jon Gjengset and Jose Javier Gonzalez Ortiz, The Missing Semester of Your CS Education, MIT, 2020

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.


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.


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

  • 10 labs (your lowest 2 scores dropped, no make-up) (28%),
  • 6 programming assignments (32%) (Assignment0 2%, the others 6% each),
  • Midterm exam (20%), and
  • Final exam (20%)


Date Topic Notes
Oct 3 Introduction. Course logistics, A tour of C programs ! (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 5 Bits and Bytes, Representing and Operating on Integers (code)
Assg0 out: Getting Started with Unix and C
B&O 2.2-2.3

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

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

Additional reading:
Nov 25 Lab 6: Working with multiple files, writing your own Makefiles
Nov 28 Arithmetic and Logic Operations B&O 3.5-3.6
Nov 30 x86-64 Control Flow B&O 3.6.1-3.6.2
Dec 2 No lab this week
TBA Midterm Exam
Dec 5 More Control Flow B&O 3.6.3-3.6.8
Dec 7 x86-64 Procedures (code)
Assg3 in, Assg4 out: Defusing a Binary Bomb
B&O 3.7
Dec 9 Lab 7: Machine Programming with Assembly
Dec 12 Data and Stack Frames B&O 3.8-3.9
Dec 14 Security Vulnerabilities (code) B&O 3.10
Additional Reading: Smashing the Stack for Fun and Profit, Aleph One
Dec 16 Lab 8: Runtime Stack
Dec 19 The Memory Hierarchy B&O 6.1-6.3
Dec 21 Cache Memories
Assg4 in, Assg5 out: Buffer Overflow Attacks
B&O 6.4-6.7
Cache Simulator
Dec 23 No labs this week
Dec 26 More Cache Memories B&O 6.4-6.7
Dec 28 Optimization (code) B&O 5
Dec 30 Lab 9: Memory organization
Jan 2 Linking B&O 7
Jan 4 Managing The Heap
Assg5 in
B&O 9.9
Jan 6 Lab 10: Code Optimization
Jan 9 More Heap Allocators B&O 9.10
Jan 11 Wrapping Up
Jan 13 No labs this week
TBA Final Exam