Course Outline

Systems 2: Software Architecture and Design-From virtual machines to compilers

Professor Dr K Darcy Otto
Title Systems 2: Software Architecture and Design
Code CS 4xxx
Credits 4
Term Spring 2025
Times TBD
Location TBD
Delivery Fully in-person
Contact Email
Office Hours TBD

Description

Have you ever wondered what a computer is and how it actually works? In this course, we’ll answer the software half of this question. We will start with virtual machines and develop a high-level language, write a compiler, and an operating system. By the end, we will have developed a software hierarchy that makes the hardware we designed in Systems 1 useable.

We will begin by developing a virtual machine, an important layer that allows software to operate without considering the specifics of the underlying hardware. Then, we will develop a high-level programming language, designed to be both powerful and user-friendly (reminiscent of Java). And finally we will design and implement a compiler that translates human-readable code into a structured format that the virtual machine understands.

Our exploration of the software hierarchy will culminate in developing a simple operating system, the ultimate orchestrator of hardware and software resources. Our operating system will manage tasks such as executing programs, memory access, and input/output operations, making the computer you have developed effective for a wide variety of tasks.

By the end of the course, you will have a comprehensive understanding of the software stack that powers modern computer systems. You will also gain hands-on experience in developing the components that enable computers to perform complex tasks, from running applications to managing system resources. This course will also equip you with the knowledge and skills to bridge the gap between raw hardware and the high-level applications that we interact with daily, completing your journey from circuits to a fully operational modern computer.

Learning Objectives

  1. Design and implement a virtual machine, and understand its role in abstracting hardware complexity and facilitating software execution.
  2. Develop a high-level language, and gain insight into language design principles and their impact on software development.
  3. Understand the fundamentals of compiler design, focussing on syntax analysis and translating high-level programs into machine-readable code.
  4. Develop a simple operating system, and understand its core function in managing hardware resources and in application execution.
  5. Enhance the ability to translate abstract concepts into concrete design, bridging the gap between theoretical understanding and practical application.

Topics include: virtual machines, operating systems, high-level language design, operating systems, assembly language.

Evaluation will be based on active engagement, projects, and a comprehensive final examination.