The real significant productivity advance we've had in programming has been from languages which manage memory for you automatically. It can be with reference counting or garbage collection; it can be Java, Lisp, Visual Basic (even 1.0), Smalltalk, or any of a number of scripting languages.
Incredibly, there's more:
Whenever you hear someone bragging about how productive their language is, they're probably getting most of that productivity from the automated memory management, even if they misattribute it.
Wow! I haven't been in the mainstream developer community since, well, never, so I've always just kind of put up with the fact that I'm different; I don't understand them, they don't understand me, but, wow!, the chasm just seems to be getting wider and deeper.
Along the same lines, I'd direct you (and Joel) over here. Have a look at what kinds of things Smalltalk enables, and then see whether you still think that GC is all there is to the productivity gap. And heck, I haven't even gotten into the quagmire of primitive data types