Beyond COMP 211
COMP 211 does not cover all elements of systems fundamentals. Rather, it only scratches the surface. If you are interested in more, this page has a list of classes that expand upon COMP 211, as well as interesting tools and concepts that you can learn over the break.
Classes beyond COMP 211
- COMP 311: Computer Organization. Computer Organization leaps into the deeper systems that make computers work, starting at the lowest level of the computer. Simple circuits build up to components like registers and the arithmetic logic unit, and then are combined to create simple computers. Specifically, the SAP computer design is studied, and you will leave the class with enough knowledge to create such a computer on breadboards using parts you can buy online. COMP 311 also studies the MIPS architecture/Assembly language, as well as a MIPS computer, which is comparable to modern commercial computers.
- COMP 431: Internet Services and Protocols. Internet Services and Protocols studies many "little languages" that make our interconnected world possible such as HTTP. COMP 431 also concerns itself with data representation.
- COMP 455: Models of Languages and Computation. Models of Languages and Computation is an introduction to the most theoretical elements of computer science. Specifically to systems, COMP 455 dives deeper into grammars, explains the mathematical foundations of regular expressions, and provides as a strong theoretical foundation for parsing.
- COMP 520: Compilers. Compilers is exactly what it sounds like. Lab 4 of this course is a good preview of what kind of content is taught in this class, except instead of scanning, parsing, and then executing a shell command, you will be scanning, parsing, and then generating JVM bytecode based on a subset of Java for your class project.
- COMP 524: Programming Language Concepts. Programming Language Concepts compliments COMP 520 in that it examines the properties of programming languages (iterating through the various paradigms) and discusses how to implement them. A handful of different languages are used in assignments, including C. In spring 2021, Professor Terrell plans to have students implement a small Lisp-like interpreter.
- COMP 530: Operating Systems. Operating Systems is perhaps the most direct continuation of Systems Fundamentals. Our last lab, creating a basic shell, is actually also the first Operating Systems lab. Topics taught include concepts like concurrency and virtual memory, as well as how functions like
malloc
,realloc
, andfree
are implemented. Strong knowledge of C will guide you well in this course. - COMP 590: The Design of Design. The Design of Design is a special topics course planned to be taught by Professor Jordan in 2021 as a summer study abroad experience in Copenhagen, Denmark. This is currently planned to occur May 25th to June 11th. Because of COVID and because it's a long way's off, the details are a bit fuzzy right now, and it could be cancelled. The course is meant to cover the design process and effective designs, to have students gaining experience collaborating, and to improve technical communications.
Concepts beyond COMP 211
- Makefile/make. A Makefile is a file with a list of rules on how to interface a project. Each time you've done
make run
ormake test
, you are using make to skip having to compile and then link each component of a project by yourself. This was originally supposed to be covered in this class, but there was not enough time. Professor Jordan plans to upload material for this after the semester, but in the meantime, you can look at the slides for last semester here. - Bash/shell scripting. You've been using Bash every day in this class with every command you run! Bash has more features than you've been taught, however. It is a programming language in its own right, with variables, conditionals, functions, loops, and more. This was originally supposed to be covered in this class, but there was not enough time. However, Professor Jordan added four videos on the topic to the class playlist here. The slides can be found here.
- The rest of The C Programming Language. Professor Jordan did not assign us the entire book, and as such, further C knowledge can be developed through reading the rest of it.
- C input and output. This is chapter 7 of The C Programming Language. It goes into detail about how functions like
printf
,fgets
andscanf
work, file manipulation, error handling, string functions, memory management, and mathematical functions. - The UNIX System Interface. This is chapter 8 of The C Programming Language. It goes over functions specific to Unix (although often implemented in other operating systems), mainly system calls like
open
andlseek
and how memory allocation works. - Reference Manual. This is Appendix A of The C Programming Language. It is the specification of the C language submitting to ANSI in 1988, and it goes over all parts of the language, and includes a grammar to describe the entire C language.
- Standard Library. This is Appendix B of The C Programming Language. It has a list of every header file and function as defined by ANSI when this book was released.
- Summary of Changes. This is Appendix C of The C Programming Language. It goes through some of the changes made since the first edition of the book. This however does not go through all changes of C, as there have been many more since the second edition of the book has been released (although almost all updates are perfectly backwards compatible).
- C input and output. This is chapter 7 of The C Programming Language. It goes into detail about how functions like
- CMake. CMake is a tool used to generate complex Makefiles. It is used internally in the Vector/Str and Tar Hell Shell labs, and is a good tool to use for large systems projects.
- C++. C++ is a systems programming language that was originally creates as an extension to C, introducing object-oriented and functional paradigms while still maintaining the direct memory manipulation and runtime performance that C programmers know and love. C++ is often used for low-level and application development (especially for performance-dependent applications) as well as video game development through the Unreal Engine.
- Rust. Rust is another systems programming language, designed to be much more modern and memory safe than C/C++. This video (part 1) and this video (part 2) introduce the basics of Rust in about ten minutes in a brief but informative and fun way. Rust is considered to be cutting-edge technology and as such is not nearly as used as C/C++, but even if it doesn't become the systems language of the 21st century, its memory management concepts are likely to reflect future languages. Currently, Rust is being used to help develop Firefox, web backends like Discord's, and is being considered to help develop Linux.
- Docker. We've been using Docker all semester, but have never gone into how it works and what it can be used for. Docker allows us to create a Linux "container" to safely produce and use our code. Containers are frequently used for large scale systems in the real world.