HTML 不是编程语言?

Avatar of Alvaro Montoro
Alvaro Montoro

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 $200 免费信用额度!

HTML 不是编程语言。

我已经无数次听到这句话,简直令人厌烦。 通常,它后面会跟着类似于 它没有逻辑它不图灵完备 的话,所以…… 很明显它不是编程语言。 就好像盖棺定论,谈话就应该结束了。

但是,真的应该这样吗?

我想看看人们用来贬低 HTML 的典型论据,并提供我自己的反驳,来展示这些说法并不完全正确。

我的目标不是证明 HTML 是或不是编程语言,而是展示用来声称它不是的三个主要论据存在缺陷或错误,从而从逻辑角度上使结论无效。

“HTML 是标记语言,而不是编程语言”

这个说法本身听起来不错…… 但是它错了:标记语言可以是编程语言。 并不是所有的标记语言都是编程语言(大多数都不是),但它们可以是。 如果我们画一个编程语言和标记语言的韦恩图,它不会是两个独立的圆圈,而是两个略微相交的圆圈。

使用变量、控制结构、循环等操作的标记语言,也应该算是编程语言。 它们不是相互排斥的概念。

TeXLaTeX 是被视为编程语言的标记语言的示例。 虽然可能不太适合用它们进行开发,但它是可行的。 并且我们可以在网上找到一些示例,比如 BASIC 解释器火星探测器控制器(它赢得了 ICFP 2008 编程比赛 的评委奖)。

虽然一些标记语言可能被视为编程语言,但我并不是说 HTML 就是其中之一。 关键在于,最初的说法是错误的:标记语言 可以 是编程语言。 因此,说 HTML 不是编程语言,因为它是标记语言,是基于一个错误的说法,而从这个前提得出的任何结论都会是错误的。

“HTML 没有逻辑”

这个说法要求我们澄清“逻辑”的含义,因为定义可能会让你感到惊讶。

就像图灵完备性(我们一定会谈到它)一样,提出这个论据的人似乎误解了它的真正含义。 我曾要求人们告诉我他们所说的“逻辑”是什么,然后得到了有趣的结果,比如

逻辑是合理的理由或思维方式。

如果我们正在寻找逻辑的字典定义,这很好。 但我们谈论的是编程逻辑,而不仅仅是作为通用术语的逻辑。 我也收到过这样的答案

编程语言有变量、条件、循环等。 HTML 不是编程语言,因为你不能使用变量或条件。 它没有逻辑。

这很好(而且肯定比陷入true/false/AND/OR/等等要好),但也是错误的。 HTML 确实有变量——以属性的形式——并且可以使用控制结构与这些变量/属性一起使用来确定显示的内容。

但是你如何控制这些变量呢? 你需要 JavaScript!

又一次错误。 有些 HTML 元素具有内部控制逻辑,不需要 JavaScript 或 CSS 才能工作。 我指的不是像<link><noscript> 这样的东西——它们是基本的控制结构,并且几十年来一直是标准的一部分。 我指的是会响应用户输入并根据元素的当前状态和变量的值执行条件操作的元素。 以<details>/<summary> 元组或<dialog> 元素为例:当用户点击它们时,如果存在open 属性,它们将关闭,而如果不存在,它们将打开。 不需要 JavaScript。

因此,仅仅说 HTML 不是编程语言,因为它缺乏逻辑,是误导性的。 我们知道 HTML 确实能够根据用户输入做出决策。 HTML 有逻辑,但它与其他旨在操作数据的语言的逻辑本质上有所不同。 我们需要比这更有力的论据来证明 HTML 不是编程的形式。

“HTML 不是‘图灵完备’”

好吧,这是我们在这场辩论中经常见到的观点。 说 HTML 不是图灵完备,从技术上来说是正确的(最棒的正确),但它应该引发一场比仅仅用它来盖棺定论更大的辩论。

我不会深入探讨图灵完备性的含义,因为关于这个话题有很多资源。 事实上,Lara Schenck 在一篇 她认为 CSS 是图灵完备的帖子 中很好地总结了它。

简单来说,对于一种语言或机器来说,图灵完备意味着它能够做到图灵机所能做的事情:执行任何计算,也就是通用计算。 毕竟,编程的发明是为了进行数学运算,尽管现在我们用它做了更多的事情,当然!

由于大多数现代编程语言都是图灵完备的,因此人们将其用作编程语言的定义。 但图灵完备性并非如此。 它是一个标准,用于识别一个系统(或它的规则集)是否能够模拟 图灵机。 它可以用来对编程语言进行分类;它没有定义它们。 它甚至不只适用于编程语言。 举个例子,比如《我的世界》游戏(它符合这个标准)或纸牌游戏万智牌(它也 符合这个标准)。 它们都是图灵完备的,但我怀疑是否有人会将它们归类为编程语言。

图灵完备性现在很流行,就像过去有些人认为编译语言和解释语言之间的区别是好的标准一样。 是的。 我们不必费力地记住,曾经的开发人员(主要是后端开发人员)如何贬低前端编程(包括 JavaScript 和 PHP),认为它们不是“真正的编程”。 现在你仍然偶尔会听到这种说法,尽管它已经变得很淡,并且被含糊不清地低声呢喃。

编程的定义(或不是编程的定义)会随着时间的推移而改变。 我敢打赌,曾经有人在整理穿孔卡片时抱怨说在汇编语言中输入代码不是真正的编程。 没有什么东西是普遍的或刻在石头上的。 实际上并没有什么定义。

图灵完备性是一个公平的标准,我必须说,但它是有偏见的和主观的——不是在它的形式上,而是在它的选择方式上。 为什么一种能够生成图灵完备机的语言被认为是“编程语言”,而另一种能够生成有限状态机的语言却不是呢? 这是主观的。 它就像任何其他借口一样,用来区分“真正的开发人员”(提出这个主张的人)和那些比他们低等的人。

更令人恼火的是,很明显,许多重复“HTML 不是图灵完备”这句话的人甚至不知道或不理解图灵完备性的含义。 它不是一个奖项或质量印章。 它不是荣誉徽章。 它只是一种对编程语言进行分类的方式——对它们进行分组,而不是定义它们。 一种编程语言可以是图灵完备的,也可以不是图灵完备的,就像它可以是解释的,也可以是编译的,可以是命令式的,也可以是声明式的,可以是过程式的,也可以是面向对象的。


那么,HTML 是编程语言吗?

如果我们能够贬低声称 HTML 不是编程语言的主要论据,这是否真的意味着 HTML 是编程语言呢? 不,它不是。 因此,这场辩论将持续下去,直到 HTML 标准发生变化,或者“当前定义”的编程语言发生变化。

但是作为开发人员,我们必须对这个问题保持警惕,因为在很多情况下,它不是用来引发一场严肃的辩论,而是用来煽动争议,同时隐藏着不可告人的动机:从获取轻松的互联网反应,到危险地贬低一群人对开发生态系统的贡献。

或者,正如 Ashley Kolodziej 在她的 献给 HTML 的颂词 中所说

他们说你不是像其他语言一样的真正的编程语言,你只是标记语言,从技术角度来说,我想是的。 从技术角度来说,JavaScript 和 PHP 是脚本语言。 我记得曾经学 JavaScript 不酷,它也不是一种“真正的”语言。 有时候,我觉得这些区别毫无意义,就好像我们建立了一个词汇表来把你(以及延伸到我们自己作为开发人员)束缚住。 你,作为一种标记语言,拥有自己独特的价值和优势。 了解如何更好地使用你是真正的专业技能,而这常常被忽视。

无论我们是否认同“HTML 是/不是编程语言”的争论,我们都应该庆祝它的存在,并不能否认它的重要性:HTML 是互联网的支柱。它是一门美丽的语言,拥有丰富的文档和广泛的语法,却简单到可以在一个下午学会,复杂到需要数年才能精通。无论它是否被认为是编程语言,重要的是我们拥有了 HTML。