https://www.cs.swarthmore.edu/~jpolitz/cs75/s16/index.html
I think the incremental approach is terrific, because it allows you to get to a program the emits assembly and builds a working binary in week one. The first thing this does is give a concrete example of what "a compiler" is. The second is to provide a great foundation for discussing static vs. dynamic and what decisions are made at compilation time vs. runtime, without needing a full implementation. These concepts are not obvious (e.g. when can and should a check for unbound ids happen? What about divide by zero, or overflow, or type mismatch?), and deserve to be carefully taught and considered.
This lets the course build up a new feature, from front-to-back, each week or two, and consider its implications on the whole pipeline each time.