| Back in university, we took the steps of: - Breadboarding some CPU components - Breadboarding a very, very minimal CPU. More like a simple Adding + Multiplication machine with 4 registers or so, with a few premade components. - Eventually moving up to microcoding a simulated CPU - Eventually writing binary code to control the microcoded CPU - At that point I kinda cheated and wrote my own assembler because I got sick of checking so many bits. - This project then stopped at an assembly level. - But then we implemented our own ML-variant interpreter and later on ML-variant compiler in OCaml - And later on we had that ML-Compiler compile itself and extended it from there. Pick your poison where to start. Just be aware that breadboarding stuff becomes very... messy very quickly[1]. And I do include Hardware in this, because you needed simpler CPUs to design more complex CPUs. In practice, you want to pick the best combination of a familiar language that is as high level as it can be. But back in the day, that would've been assembly, binary. In the case of C, it went from BCPL, in which a compiler for B was written, in which a compiler for New B (NB) was written, which then turned into C. 1: https://www.youtube.com/watch?v=l7rce6IQDWs&t=78s |