Architecture and Compilers

About the course

This is the homepage for CS 353: Architecture and Compilers, a course offered by Fritz Ruehr at the Computer Science Department of Willamette University.

Learning to program in Java can be fun and empowering, but it may still leave you mystified about how computers really work: what are the components of a physical computer? How does the computer "know" what to do when it runs a Java program? What connects abstract ideas like objects and methods to the silicon hardware?

This hybrid course in computer architecture and high-level language processing (compilers) will provide you with the answers to these questions. The course is a "soup-to-nuts" overview of the various levels of structure embodied in a physical computer, as well as the various stages by which high-level languages are translated into a form which the computer can directly execute. In traditional curricula, these two topics are often covered in separate courses—we have combined them into a single comprehensive overview in order to expedite Willamette's pedagogical goals.

We will start our journey with basic facts about binary encodings, how they are used to represent data and how logical operations can be used to transform these data. We will then see how basic electrical components called gates can be used to realize these operations on digital signals, and how they can be combined into circuits which will implement more complex processes. Finally, we will see how these circuits are used to build higher-level components which constitute a typical computer, and how digital data stored inside the computer can be used to control its operation. In the second phase of our studies, we will start with the strings of characters which comprise a program file, and see how it can be analyzed in successive stages until the internal structure of the program is exposed. We will then see how this internal structure can be translated into the low-level codes which a computer can execute, in a way which respects the meanings of the original program. Finally, as time permits, we will survey a few important concepts which inform the design of high-level languages both like and unlike Java.


Welcome to the Fall 2014 class!

The “news” items below (as well as assignments, etc.) are mostly from older versions of the class. I will be leaving them intact for now as convenient references. I'll try to add updates and move others into focus as they become especially relevant.

Labs (in chron. order) NB: due dates may be updated as we go!

(I have added “abstract due dates” below for each of the labs. What does this mean? Well, first of all, they are stated in terms of the weeks of the semester rather than the days and months of any specific year (this mean less bother about updating for me, but requires you to be at least somewhat aware of how far into the semester we are “currently” if you wish to gague your own progress). But the due dates are also abstract in that they are a little vague and soft: you are not required to finish the lab by the expected date, but should expect to do so, or perhaps strive to do so. As stated in lecture, if you let these things go too long, you will have a Bad Time™ at the end of the semester.)

Some useful resources, etc.

Some information about C and other miscellanea

Topical references (in chron. order)

We won't be using a formal textbook this semester, so I will be trying to gather links to relevant on-line material. A lot of good-quality articles are available on Wikipedia, the free on-line "open source" encyclopedia (you might want to consider donating some portion of your textbook savings to their efforts).