Precisely made for "creating a new language, interpreter, and compiler from scratch": http://craftinginterpreters.com
Simple machine code generation with basic register allocation and evaluation which eagerly spills to the stack is not super hard. Producing fast code instead is a bottomless well.