Computer Science
What actually happens when you hit "run", after writing your program? This course introduces the elements of hardware and language/OS software that executes a program, providing insights into computing efficiency that may be important to a wide range of programmers, and serving as a foundation for later work in computing systems. It includes weekly lab exercises, focused on principles covered in the lecture and details from both lecture and self-teaching (the latter according to principles presented in the course).
Our central theme focuses on reasoning across, rather than within, abstraction boundaries. High-level programming in languages like Python, Java, or C++ allows programmers to reason about the correctness of their code and, for the most part, about the asymptotic resource-use complexity. However, the "constant-factor" influences on complexity do not respect abstraction boundaries; adding computing steps to an existing program can be considerably more, or considerably less, resource-intensive than performing those steps in isolation. Low-level programming in languages like assembly language, C, or C++ can help to expose and manage these effects, but can also create situations in which we must reason about correctness across abstraction boundaries.
Understanding and controlling these cross-abstraction effects requires knowledge of computer hardware, programming language implementation, and operating system software, and CMSC 251 is designed to introduce students to these issues. Discussion of computer hardware will focus on the central processing unit (CPU) and memory system (cache, RAM, virtual memory), with labs exploring implementing these components. Operating-system discussions will focus on the memory system and discuss processes, threads, and file-system issues. Programming labs will make use of the aforementioned hardware and system features, using both high- and low-level techniques, illustrated with C++ and assembly-language code. These labs will also highlight the translation of C++ into assembly language, and, in particular, the role of type information in producing efficient code.
Due to the rule against getting credit for different courses with the same content, students cannot receive credit for this course and either Byrn Mawr CMSC 223 or Swarthmore CS 31.