The phrase "I know it when I see it" is a colloquial expression by
which a speaker attempts to categorize an observable fact or event,
although the category is subjective or lacks clearly defined
parameters. The phrase was famously used by United States Supreme
Court Justice Potter Stewart to describe his threshold test for
obscenity in Jacobellis v. Ohio (1964).
-- "I know it when I see it" Wikipedia article
Like obscenity, I think we all know a programming language when we see one. Clearly the OP does, since you've already judged C++ to be a programming language, and HTML not to be one.
So what exactly is the goal of pursuing a formal definition? Yannis has already given a great rundown of why the most popular definition, Turing completeness, is flawed: it leads to categorization which defy the "I know it when I see it" test.
I put it to you that any definition you can come up with will lead to some languages which we all feel are not "programming" languages will be categorized as being so; or to some languages which we all feel are "programming" languages will be categorized as not being so.
Why not just go with your gut? I use a simple heuristic: a programming language is a language whose primary purpose, in my opinion and according to my observations, is to write programs. Not to mark up content. Not to transform XML. To write general purpose programs. I'd rather just know it when I see it than try to nail down a formal definition, and I don't see any genuine value that can come from attempting such a definition.