The traditional software development life cycle goes something like this:
1) requirements gathering
2) requirements analysis
3) systems analysis and design
4) implementation (programming)
6) installation and maintenance
My understanding is something like this: a "programmer" is someone who only does #4 (and maybe a bit of unit testing, so #5). A "software developer" is someone who is involved in more than just the implementation - they can be responsible for most if not all of the above.
The term "software engineer" is an American thing, I think... where I'm from (Canada), you can't call yourself an "engineer" unless you have a degree in a recognized branch of engineering, and up until very recently I don't think "software engineering" was considered a proper branch of engineering.
Having said all that, though, some companies play fast and loose with the job titles. In my career so far I've been a "software developer", a "programmer/analyst", and a "software engineer" (that last one is with an American-headquartered company). My job duties in all three places were pretty much the same (i.e. pretty much the entire software life cycle).