Long disclaimer, actual answer below
If you really need information on how to create a compiler from scratch, and you need to be aware of all the related practical methods of parsing, compiling, generating and optimizing, then a dragon book would be the best option.
If you want to build a clean programming language from scratch using an interpreter, I would recommend the Friedman EPL book.
If what you do after your undergraduate work is a deeper understanding of all the basic questions in both previous books, then read my answer below. SICP is an educational work, it tries to convey the basic concepts in a clear language, as far as possible. He will not go into details about left-recursive parsers, general exclusion of sub-expression, SSE x86 extensions, etc.
SICP CH4-5
The technique used to explain complex concepts is to create a series of computer languages โโfrom scratch before your eyes.
Chapter 4 begins with the creation of a metacircular interpreter of the Scheme: a small interpreter of the Scheme written on the Scheme itself. This will give you the basics of a recursive interpreter and serve as the basis for building a series of mini-languages โโin the rest of ch4-5. It answers the question of how to present your analyzed code, what data objects are involved, how to separate the host from the base language, etc. The important thing is that it shows you that the language translator itself is just another computer program. The rest of chapter 4 shows how you can change your language by changing the previous interpreter. Two big ones are lazy evaluation and logical programming.
Chapter 5 introduces a rough model of โregistration machines,โ representing your current-day computer at an abstract level. They build a small machine register language that acts as an assembly language for all purposes. They introduce all the data structures and flow control constructs needed for the next bit: building a schema interpreter in this machine language. Somehow it still looks like a metacircular translator. Subsequently, they jump from the deep end and build a circuit compiler in their machine translation language; complete with assembly step, tail recursion optimization, garbage collection, lexical addressing, tracing, etc.
Although SICP creates toy interpreters and compilers, they are conceptually complete so that you can quickly move on to current practices. The GCC middleware is very similar to the SICP register machine code, for example, and these guys implemented a SICP interpreter for ARM microcontrollers directly in the assembly.