HTML是不是编程语言? - css-tricks


人们认为HTML没有逻辑,或者,它不是图灵完备的,所以它不是一种编程语言。本文的目标不是证明 HTML 是或不是编程语言,而是证明用于声明它不是编程语言的三个主要论点是有缺陷或不正确的,从而从逻辑的角度使“HTML不是编程语言”的结论无效。
 
“HTML 是一种标记语言,而不是一种编程语言”
这句话本身听起来不错……但它是错误的:标记语言可以是编程语言。并非所有这些都是(大多数不是),但它们可以。如果我们画一个编程语言和标记语言的维恩图,它不会是两个独立的圆,而是两个稍微相交的圆。
使用变量操作、具有控制结构、循环等的标记语言也将是一种编程语言。它们不是相互排斥的概念。
TeXLaTeX是标记语言的例子,它们也被认为是编程语言。我们可以在网上找到示例,例如BASIC 解释器Mars Rover 控制器(在ICFP 2008 编程竞赛中获得评委奖)。
虽然某些标记语言可能被视为编程语言,但我并不是说 HTML 是其中之一。重点是原来的说法是错误的:标记语言 可以 是编程语言。因此,说 HTML 不是一种编程语言,因为它是一种标记语言,这是基于错误的陈述,无论您从该前提得出的任何结论都将是绝对错误的。
 
“HTML 没有逻辑”
这种说法要求我们澄清“逻辑”的含义,因为该定义可能会让您感到惊讶。
与图灵完备性(我们肯定会谈到)一样,提出这个论点的人似乎误解了它到底是什么。我让人们告诉我他们所说的“逻辑”是什么意思,并得到了一些有趣的答案,例如:
逻辑是一种合理的理由或思维方式。
如果我们正在寻找的是逻辑的字典定义,那就太好了。但我们谈论的是编程逻辑,而不仅仅是作为一个通用术语的逻辑。我也收到了类似的回答:
编程语言有变量、条件、循环等。HTML 不是编程语言,因为你不能使用变量或条件。它没有逻辑。
这很好,但也不正确。HTML 确实有变量——以属性的形式——并且有一些控制结构可以与这些变量/属性一起使用来确定显示的内容。
但是你如何控制这些变量呢?你需要 JavaScript!
又错了。有一些 HTML 元素具有内部控制逻辑,不需要 JavaScript 或 CSS 即可工作。我不是在谈论诸如<link>或之类的东西<noscript>——它们是基本的控制结构,几十年来一直是标准的一部分。我指的是将响应用户输入并根据元素的当前状态和变量的值执行条件操作的元素。以<details>/<summary>元组或<dialog>元素为例:当用户点击它们时,如果该open属性存在则关闭,如果不存在则打开。不需要 JavaScript。
所以仅仅说 HTML 不是一种编程语言,因为它缺乏逻辑是一种误导。我们知道 HTML 确实能够根据用户输入做出决定。HTML 具有逻辑,但它与其他旨在操作数据的语言的逻辑本质上是不同的。我们需要一个比这更强有力的论据来证明 HTML 不是一种编程形式。
 
HTML 不是‘图灵完备’
好的,这是我们在这场辩论中最常看到的。说 HTML 不是图灵完备在技术上是正确的(最好的正确),但它应该引发更大的争论,而不仅仅是将其用作案例结束声明。
我不会深入探讨图灵完备意味着什么,因为有很多关于这个主题的资源。事实上,Lara Schenck 在一篇文章中很好地总结了它,她认为 CSS 正在变得完整
用最简单的术语来说,对于图灵完备的语言或机器,这意味着它能够做图灵机可以做的事情:执行任何计算,也就是通用计算。毕竟,编程是为了数学而发明的,当然,我们现在用它做了更多的事情!
因为大多数现代编程语言都是图灵完备的,所以人们将其用作编程语言的定义。
但图灵完备性并非如此。它是识别系统(或其规则集)是否可以模拟图灵机的标准。可用于对编程语言进行分类;它没有定义它们。它甚至不适用于编程语言。例如,游戏 Minecraft(符合该标准)或纸牌游戏 Magic: The Gathering(也符合该标准)。两者都是图灵完备的,但我怀疑有人会将它们归类为编程语言。
图灵完备性现在很流行,当开发人员(主要是后端)将前端编程(包括 JavaScript 和 PHP)轻描淡写为不是“真正的编程”时,我们不必费很大的精力去记住。有时你仍然会听到它,尽管现在已经消失了,喃喃自语,喃喃自语。
什么是(或不是)编程的定义随着时间而变化。我敢打赌,有人在整理打孔卡时会抱怨在汇编中键入代码不是真正的编程。没有什么是普遍的或一成不变的。没有实际定义。
我必须说,图灵完备性是一个公平的标准,但它是有偏见和主观的——不是在形式上,而是在选择的方式上。为什么一种能够生成图灵完备机的语言被称为“编程语言”,而另一种能够生成有限状态机的语言却不是?这是主观的。与其他任何人一样,这是区分“真正的开发人员”和比他们差的人的借口。
雪上加霜的是,很明显,许多重复“HTML 不是图灵完备”的口号的人甚至不知道或理解图灵完备的含义。它不是奖项或质量印章。这不是荣誉徽章。这只是对编程语言进行分类的一种方式——将它们分组,而不是定义它们。编程语言可以是图灵完备的,也可以不是图灵完备的,就像它可以被解释或编译、命令式或声明式、过程式或面向对象的一样。
 
那么,HTML 是一种编程语言吗?
如果我们反驳了 HTML 不是编程语言的主要论点,这是否真的意味着 HTML 是一种编程语言?也不是!因此,在 HTML 标准发展或编程语言的“当前定义”发生变化之前,争论将一直存在。
抛开我们对“HTML 是/不是编程语言”讨论的立场,HTML 是 Internet 的支柱。这是一门美丽的语言,拥有大量的文档和丰富的语法,但又简单到一个下午就可以学会,又复杂到需要数年才能掌握。编程语言与否,真正重要的是我们首先拥有 HTML。