I've taken a compilers course, at Stanford no less.
I've written a couple of compilers and some near-compilers. (A very fast simulator can be a lot like a compiler.)
I don't think that null pointers are evil. In fact, I like null pointers.
My beef with null pointers is that very few languages support multiple null pointers. (No, mocked objects or sentinels are NOT a good substitute.)
Yes, I want multiple isNull values that can be distinguished but can't be used. (Python's "lots of things are false and you can create more" is arguably the closest.)