The “HTML Is Not a Programming Language” Argument Is Flawed

“HTML is not a programming language.” If you’ve spent any time in web development circles, you’ve heard this sentence — usually delivered with the finality of a judge’s gavel. The follow-up arguments typically include “it doesn’t have logic” or “it’s not Turing complete,” as if those statements alone settle the matter.

But do they? Let’s examine the three most common claims used to dismiss HTML and see whether they actually hold up under scrutiny. The goal isn’t to declare HTML a programming language or not, but to test whether the reasoning behind the dismissal is sound.

“It’s a Markup Language, Not a Programming Language”

This statement sounds definitive, but it’s built on a false dichotomy. Markup languages and programming languages are not mutually exclusive categories. In a Venn diagram, they’d be two circles with a meaningful overlap, not two separate shapes.

If a markup language supports variables, control structures, and loops, it can also be a programming language. TeX and LaTeX are the classic examples: markup languages with full programming capabilities. It may be impractical to write complex software in them, but it’s been done. A BASIC interpreter exists in TeX, and a Mars Rover controller written in TeX won the Judges’ prize at the ICFP 2008 programming contest.

This doesn’t mean HTML is one of these languages. It means the claim that “markup languages can’t be programming languages” is false on its face. Any conclusion drawn from that premise is logically invalid from the start.

“HTML Doesn’t Have Logic”

This argument depends entirely on what you mean by “logic.” If you’re talking about programming logic — variables, conditions, control flow — the claim is still not accurate.

HTML does have variables in the form of attributes. And it includes control structures that work with those attributes to determine what gets displayed. Take the <details>/<summary> pair or the <dialog> element. When a user clicks, the element checks whether the open attribute is present. If it is, the element closes; if it isn’t, it opens. This is conditional behavior based on user input and state — and it requires no JavaScript or CSS to function.

Elements like <link> and <noscript> offer even more rudimentary control structures that have been part of the standard for decades. So the blanket statement that HTML lacks logic is misleading. HTML doesn’t have the same data-manipulation logic as general-purpose programming languages, but dismissing it as completely logic-free ignores the capabilities baked into the standard.

“HTML Isn’t Turing Complete”

Strictly speaking, this one is correct — but it’s also beside the point. Turing completeness measures whether a system can simulate a Turing machine and perform universal computation. It’s a classification tool, not a definition of what a programming language is.

It doesn’t apply exclusively to programming languages either. Minecraft is Turing complete. The card game Magic: The Gathering is Turing complete. Few people would call either a programming language. Conversely, there are programming languages that are not Turing complete, yet we still recognize them as such.

The fashion for Turing completeness recalls earlier eras when developers dismissed JavaScript and PHP as “not real programming” because they were interpreted rather than compiled. That distinction faded, and this one will too. Definitions of what counts as programming shift with context. A programmer sorting punched cards likely scoffed at assembly language in its day.

Choosing Turing completeness as the threshold for “real programming language” is a subjective call. It’s an excuse for ranking some languages and, by extension, the people who use them. And many who repeat the mantra don’t fully grasp what Turing completeness entails. It isn’t a badge of honor or a seal of quality. It’s just one of many ways to categorize languages, alongside compiled versus interpreted, imperative versus declarative, procedural versus object-oriented.

So What’s the Real Issue?

None of this proves HTML is a programming language. But it does reveal that the standard arguments against it are built on shaky ground. The debate persists because neither side has a definitive answer — and it will keep going until the HTML standard or the popular definition of “programming language” changes.

As developers, it’s worth asking why the question keeps coming up. Often it’s not about fostering serious technical discussion but about drawing lines between “real developers” and everyone else. Ashley Kolodziej made the point well in her ode to HTML: JavaScript was once dismissed as a scripting language, not a “real” language. These distinctions can feel less like technical categories and more like walls built to hold certain people and their work back.

Whatever side of the debate you land on, HTML deserves recognition for what it is: the backbone of the Internet, a language with extensive documentation and syntax that’s simple enough to learn in an afternoon yet deep enough to take years to master. Whether it’s called a programming language or not has little bearing on its importance — what matters is that it exists.