These projects are designed to minimize boilerplate programming, and focus on understanding conceptually difficult problems at a deep level.
You must use C or C++ for your projects, with the exception of Project 3.
These projects must be completed individually. You can discuss the algorithmic aspects of the projects with your fellow students, but code must be written alone.
As a heuristic, if you are working on paper or a whiteboard, you are good. If you are looking at code, you are not.
Some projects will have an associated lab report.
Start early and pace yourself. Many programming tasks are more difficult to complete in a single stretch than over days or weeks. Some of these projects are impossible to complete in a single stretch. Expect to spend significant time analyzing the problem throughout the implementation.
Some projects will contain a checkpoint, where you are expected to have working code for a simplified version of the problem. These checkpoints count towards the project grade.
In this project, you will write a C++ program, calesco, that has a main file, code in a separate file with both a header and body file, and a Makefile that compiles the program. What the program does is irrelevant, as long as it meets the functional and structural specifications.
In this project, you will construct an lexer and parser for a subset of the ILOC assembly language. You will take as input an ILOC file, and print either the stream of tokens, an intermediate representation, or ILOC code. A significant part of the project is the hand-written, character by character, lexer.
In this project, you will construct an allocator that takes a block of ILOC code that uses an unbounded number of registers, and returns an equivalent block of code that uses only a fixed number of registers.
In this project, you will construct an LL(1) parser generator that will take a language specification, and returns both human-readable information, and LL(1) tables suitable for parsing.
In this project, you will construct an instruction scheduler for straight-line code, targeting a virtual machine with heterogeneous functional units.