As very much a non-expert in compiler design, I found two books to be helpful introductory reads (neither are free though). I'm not sure whether someone proficient in the field would recommend them as my knowledge in the area is small, but I enjoyed them.
- Writing An Interpreter In Go by Thorsten Ball (https://interpreterbook.com)
- Compiling to Assembly from Scratch by Vladimir Keleshev (https://keleshev.com/compiling-to-assembly-from-scratch)
The first produces an interpreter in Go for a custom language, but as simscitizen says there's a lot of crossover with compilers.
The second creates a compiler written in Typescript that compiles from a minimal form of Typescript into ARM assembly. It's not cheap but is good.