Crafting Interpreters [1] is also really good, it's often recommended on here when compilers are mentioned. It does spoon-feed you the code (Java in the first part, C in the second), but it's descriptive enough to follow along in a different language/paradigm if that's what you'd rather do.