The nand2tetris course (https://www.nand2tetris.org/) is a course about building the computer from the first principles of a simple nand gate all the way up to a fully implemented computer. //The general course outline starts with building elementary logic gates of increasing complexity and eventually a CPU, then an assembler to convert Machine code to binary, then a VM translator similar to Java, then a Compiler and OS and voila, a fully functional computer. This course was really challenging and I learned a great deal especially in the later projects where I wrote an assembler, VMtranslator, compiler, and an OS. I would highly recommend it to anyone.
The course was organized into two parts. Part 1 focuses on the hardward and ends when the computer including a CPU is fully implemented. In part two the rest of the computer was implemented. I chose to implement the assembler, VMtranslator and Compiler in python as this is the language I am most comfortable in. These were projects 7, 8, 10 and 11. In project 9 a program was written in the computer language JACK specific to the course which we developed a compiler for. This was to ensure understanding of the language before we started to develop a compiler. I made a basic helicopter game which could be extended into a fully fledged game.
The OS for the computer was developed in the JACK language in project 12 which included making a basic memory class, math class, keyboard and screen, and graphics and textual output. Once these programs were finished the computer was a fully implemented 16 bit platform which could be extended to include greater functionality.
Ultimately most of the algorithms and software design for the later projects was provided by the book and course information. Our job was to implement the solutions from a generic suggested API in whatever way we saw fit. Primarily I learned a lot about the underlying function of assemblers, VMtranslators, and compilers and the unique challenges in programming these. While this was a compiler for a very basic language it still challenged me greatly. I learned a lot about how to use Python specifically and how compilers, assemblers and VMtranslators work. I would highly recommend this course.