Schedule

Below is a preview of the week-by-week plan for the quarter. There may be adjustments and rearrangements as we go.

Lecture Code

Any code examples worked in class will be posted after lecture into `/afs/ir/class/cs107/lecture-code/lect[N]` where you replace `[N]` with the lecture number (with leading `0` if `N < 10`). You can make a copy to compile or modify by doing the following, which will make a folder in the current location called `lect[N]` that is a copy of the `lect[N]` code.

``````cp -r /afs/ir/class/cs107/lecture-code/lect[N] lect[N]
``````

Week 1
Lecture 1 (Mon 1/11): Welcome to CS107!
We'll go through course logistics, learning goals, and a tour of C programs.
Lecture 1 Slides
Lecture 1 Code
Handouts: Syllabus, Honor Code
B&O Ch 1 - skim this chapter for a quick overview of what is meant by systems, and for a preview of topics to come.
Out: assign0
No labs this week.
Lecture 2 (Fri 1/15): Integers
Topic 1: How can a computer represent integer numbers?
We'll learn more about the representation of the integer types: `char`, `short`, `int`, and `long`, in both unsigned and two's complement signed. We'll also discuss integer arithmetic, overflow, truncation and sign extension, and how mixed signed and unsigned comparison operations work.
Lecture 2 Slides
Lecture 2 Code
B&O Ch 2.2-2.3 - skim the formal proofs, but it's important to take away a solid working knowledge of two's complement and behaviors of integer operations.
Week 2
Lecture 3 (Mon 1/18 - MLK HOLIDAY): Bits and Bitwise Operators
Check-in quiz due Tue 1/19, Zoom Concept Hours on Tue 1/19 (see Canvas)
We'll dive further into bits and bytes and how to manipulate them using bitwise operators.
Lecture 3 Slides
Lecture 3 Code
B&O Ch 2.1
In: assign0
Out: assign1
Lab 1: Bits and `ints` Be sure to check out our guide to gdb.
Lecture 4 (Fri 1/22): Chars and C-Strings
Topic 2: How can a computer represent and manipulate more complex data like text?
We'll explore how strings and characters are manipulated in C using the `char` and `char *` types, discuss null termination, and become familiar with the `string.h` functions.
Lecture 4 Slides
Lecture 4 Code
K&R (1.9, 5.5, Appendix B3) or Essential C section 3 for C-strings and `string.h` library functions. C-strings are primitive compared to Java/C++ strings, so take note of the manual efforts required for correct use and pitfalls to avoid.
Week 3
Lecture 5 (Mon 1/25): More C-Strings
Now it's time to start digging into the use of `*` and `&`, pointer operations/arithmetic, and memory diagrams. In lecture, we will trace through code, draw lots of pictures, and poke around in gdb.
Lecture 5 Slides
Lecture 5 Code
K&R Ch 1.6, 5.5 or Essential C section 3 on the mechanics of pointers and arrays. Pay special attention to the relationship between arrays and pointers and how pointers/arrays are passed as parameters.
Lab 2: C-Strings Be sure to check out our guide to Valgrind. In (Wed): assign1
Out: assign2
Lecture 6 (Fri 1/29): Arrays and Pointers
Topic 3: How can we effectively manage all types of memory in our programs?
We'll answer questions like: how are arrays and pointers the same? How are they different? How is an array/pointer passed/returned in a function call? After this lecture, you'll understand how arrays and pointers allow two syntaxes for accessing sequential memory locations, but the underlying reality of the memory is the same.
K&R 5.2-5.5 or Essential C section 6 on advanced pointers
Week 4
Lecture 7 (Mon 2/1): Stack and Heap
We'll learn about stack allocation, stack frames, and parameter passing. Then, we'll introduce dynamic allocation on the heap (`malloc`/`realloc`/`free`), heap contractual guarantees and undefined behavior.
K&R 5.6-5.9 or Essential C section 6 on the heap. The key concept is comparing and contrasting stack and heap allocation.
Lab 3: Arrays/Pointers In (Wed): assign2
Out: assign3
Lecture 8 (Fri 2/5): `void *`, Generics
Topic 4: How can we use our knowledge of memory and data representation to write code that works with any data type?
We'll continue comparing and contrasting stack and heap allocation. Then, we'll move on to untyped `void *` pointers and motivate C generics.
still working through K&R 5.6-5.9 or Essential C section 6 on the heap.
Week 5
Lecture 9 (Mon 2/8): More Generics
We'll talk about function pointers, which allow us to implement generic operations using client callbacks.
K&R 5.11, review man pages or your C reference to be introduced to generic functions in the C library (`qsort`, `lfind`, `bsearch`)
Lab 4: `void *`/Function Pointers In (Wed): assign3
Out: assign4
Lecture 10 (Fri 2/12): Intro to x86-64, Data Movement
Topic 5: How does a computer interpret and execute C programs?
We'll introduce assembly/machine language and find out what's happening underneath the hood of the C compiler, including a discussion of the x86-64 instruction set architecture and its powerful `mov` instruction. Then, we'll talk about addressing modes, data layout, and access to variables of various types.
B&O 3.1-3.3 for background info on x86-64 assembly. Very carefully read B&O 3.4 on addressing modes and data transfer. The multitude of addressing modes is one of the things that puts the first "C" in CISC.
Be sure to check out our x86-64 guide.
Week 6
Lecture 11 (Mon 2/15 - PRESIDENTS' DAY HOLIDAY): x86-64 ALU
Check-in quiz due Tue 2/16
We'll talk about arithmetic and logical instructions.
B&O 3.5-3.6
Be sure to check out our x86-64 guide.
Lab 5: Assembly
x86-64 in all its glory
Be sure to check out our x86-64 guide. In (Wed): assign4
Out: assign5
Lecture 12 (Fri 2/19): x86-64 Condition Codes and Control Flow
We'll see how to implement C `if`/`else` and loops in assembly and discuss other uses of condition codes (`setx`/`cmov`).
B&O 3.6
Be sure to check out our x86-64 guide.
Week 7
Lecture 13 (Mon 2/22): x86-64 Runtime Stack
We'll talk about procedures and the runtime stack and introduce instructions for call/return, parameter passing, local stack storage, and register use.
B&O 3.7, 5.1-5.6
Lab 6: Runtime Stack
Fun explorations with the stack!
Out: Mid-quarter assessment
Fri 2/26 - No Lecture In: Mid-quarter assessment
Week 8
Lecture 14 (Mon 3/1): Managing the Heap
Topic 6: How do core memory-allocation operations like `malloc` and `free` work?
We'll see how the heap fits into the address space. We'll introduce design decisions for implementing `malloc`/`realloc`/`free`, as well as performance tradeoffs (throughput, utilization). Then, we'll compare and contrast stack and heap allocation.
B&O Ch. 9.9 and 9.11 cover heap allocation implementation and memory misuses. There's lots of very useful detail in 9.9 for your heap allocator!
No labs this week.
Lecture 15 (Fri 3/5): More Heap Management, Optimization
We'll take a look at the compilation process and the various optimizations gcc does on our behalf. We'll also learn of some tools we can use to profile our own code so we know where to optimize ourselves. This could be helpful for final tuning of your heap allocator!
Optimally skim B&O Ch. 5 In (Fri): assign5
Out: final project
Week 9
Lecture 16 (Mon 3/8) - [Optional] Floats
No pre-recordings nor check-in quizzes! Just in-class optional content about how floating point works.
We'll learn about manipulating real-value data types (float/double) using the IEEE floating point representation. We'll also explore features and limitations of the floating point number line.
Lab 7: Code and Memory Optimization
Experiments in optimization and profiling
Be sure to check out our CS107 guide to callgrind.
Fri 3/12 - No Lecture
Week 10
Lecture 17 (Mon 3/15): Wrap-up and Q&A
We'll wrap up the course themes, preview courses and opportunities post-107, and say some final words. Bring questions if you have them!
No labs this week. In (Wed): final project
Fri 3/19 - No Lecture