I'm taking several classes this fall for my masters and one of them is Compiler Design and Construction. I am pretty well versed in most things related to computer technology, but I have not had much experience with how compilers do the dirty, I just use them when I need to. I am not usually nervous about classes, but I kind of feel like I am walking into this one naked. If anyone can recommend some good reading or provide a short list of basic principles that I can research to bring me up to speed quickly I would be most grateful.
Compilers are a bit of a head-spinning exercise. However, if you have solid grasp of data structures, algorithms, and assembly code, and a penchant for thinking through the details, you'll probabaly find the class fascinating because it is so different than most of conventional business data processing and/or embedded computing.
I'd make sure you had the assembly code background down pretty well. Most procedural coders aren't used to machine instructions, registers, address modes and pointers. If you get those, the instructor will likely explain the rest pretty well.
If you aren't used to pointers, then run don't walk, to your nearest C compiler and write a bunch of programs that use them.
For some background on what compilers are not, see http://stackoverflow.com/questions/1685148/writing-compilers-whats-right-and-whats-wrong
If you want a really interesting exercise, you can learn about MetaII, which is how to build a compiler that builds a compiler with an insanely small amount of effort. There is a 10 page paper on how to do this that has a mind-blowing moment in the middle where you suddenly see how the compiler can compile itself. There's a MetaII tutorial (with the paper) at:
The first time someone explained compilation to me, I was surprised how rooted in convention it all was. There were always the same high-level stages in compilation, with the same divisions in sub-tasks.
Looking back, some of it is a little arbitrary. Writing a compiler is difficult and re-applying techniques that have worked for countless others in the past is indeed a good idea. But depending on your background, you may at first be surprised that everything does not flow naturally from basic principles as much as in other areas of Computer Science.