Instructor : Keith Muller - muller at eng.ucsd.edu
You’ve been writing programs for the past year (or more), you have become more capable of analyzing the efficiency of programs (CSE 12 and 21), working in the Linux environment (CSE 15L), and designing more advanced programs (CSE 12). However, the computer likely remains nearly a black box for you.
This is the first course in a series of courses in our program that aims to demystify computing, so you become more capable and knowledgeable computer scientists. In CSE 30, you’ll learn about how high-level programming language semantics translate into low-level programming (assembly language). Explore the basics of the underlying hardware (gates, memory) and how high-level programming language semantics are implemented and how they influence the basic architecture of a CPU and the design of an operating system.
The goal is to give you some insight into and prepare you for later courses in our curriculum that heavily leverage this knowledge, including CSE 100, CSE 120, CSE 131, CSE 140, CSE 141, and CSE 142. Ultimately, the ideas you’ll learn in this class are critical for your success as a computer scientist and we hope you look forward to diving deeper into systems this quarter.
This course is designed to convey three critical ideas in computing to you. First, you’ve spent most of your time programming in Java or Python. While Java (or Python) makes programming easier for you, it hides away important details of how programs really work, how they are implemented and how they interact with the operating system (Linux specifically). We’ll learn these ideas in depth in the programming language C.
Second, even statements in C can’t run directly on actual hardware. They need to be compiled into instructions that can run on a processor/computer system. We’ll be learning one of the most widespread assembly programming languages in use today, ARM (Aarch32). Variations of ARM assembly are used in most mobile processors today as well as some computers (latest Apple M1 chip). ARM assembly is a good start to learning how assembly language works as it is a relatively simple design. Although you will likely not program a lot of assembly in your career, you will almost certainly need to know how to read it when debugging programs and understanding how certain high-level programming language semantics impact program execution performance and memory use. Moreover, if you have any interest in more advanced topics in computer systems, such as operating systems, computer architecture, or computer security, you’ll need to know assembly very well.
Third, assembly instructions translate nearly directly into machine instructions that are executed by computer processors. As a computer scientist or computer engineer you should have a basic understanding of how these instructions execute. This course will give you a preview of digital logic and processor design to set you up for success in CSE 140, CSE 141, and CSE 142.
In lecture, you will learn about the concepts underlying computer systems. You will have opportunities to practice and cement this understanding by programming in C and assembly and by practice with conceptual homework. The course will focus on C and ARM (32-bit) assembly languages implementations using the Linux operating system running on the Raspberry PI4.
link to Syllabus