It’s not actually clear. For example I’m an email dev. I’ve had the following titles in this position: specialist, dev, manager, engineer…it’s all the same job.
Titles are often decided on for marketing purposes and can often not follow what you actually do.
A programmer is anyone who codes things. It can be specific code: Java Programmer should be a programmer in Java.
A software engineer is anyone who makes or develops software. This can be applications on your desktop or phone, or in house software companies use. It has grown to mean cloud software as well, and I have seen it used for straight web developers, usually in companies with a very old rigid hierarchy.
A full-stack developer is some one who can build a website from back to front. Set up the hosting , create databases, connect them to the website, design and code the front end website. The stack part is the stack you are familiar with, the technologies you know. I could say I’m a full stack dev for AMP - Apache, MySQL, PHP, I don’t usually. I’m trying to learn other stacks such as MERN and MEAN. Employer’s generally will list the stack they want in the job description.