HTML 不是编程语言。
我已经无数次听到这句话,简直令人厌烦。 通常,它后面会跟着类似于 它没有逻辑
或 它不图灵完备
的话,所以…… 很明显它不是编程语言。 就好像盖棺定论,谈话就应该结束了。
但是,真的应该这样吗?
我想看看人们用来贬低 HTML 的典型论据,并提供我自己的反驳,来展示这些说法并不完全正确。
我的目标不是证明 HTML 是或不是编程语言,而是展示用来声称它不是的三个主要论据存在缺陷或错误,从而从逻辑角度上使结论无效。
“HTML 是标记语言,而不是编程语言”
这个说法本身听起来不错…… 但是它错了:标记语言可以是编程语言。 并不是所有的标记语言都是编程语言(大多数都不是),但它们可以是。 如果我们画一个编程语言和标记语言的韦恩图,它不会是两个独立的圆圈,而是两个略微相交的圆圈。
使用变量、控制结构、循环等操作的标记语言,也应该算是编程语言。 它们不是相互排斥的概念。
TeX 和 LaTeX 是被视为编程语言的标记语言的示例。 虽然可能不太适合用它们进行开发,但它是可行的。 并且我们可以在网上找到一些示例,比如 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。
我对这件事有一些看法,我本来打算写一篇博客文章,但这个评论区可能在我写完之前就关闭了,所以就说出来吧。
当我称 HTML 不是编程语言时,我的意思是赞扬塑造它的人们的远见和克制,以及用它创造出惊人事物的人们的技能和创造力。
是有效的,
不是。后者意味着它是一种假编程语言。
我觉得关于这个话题的讨论都被以下两种观点所主导:“编程语言”作为一个严格定义的科学术语,以及“编程语言”作为一个任意分配的社会地位。实际上,它是一个模糊的分类,就像人类语言中的大多数词语一样。
尝试为什么是编程语言找到严格的标准可能是一件有趣的事情,如果我们不再执着于工具的社会地位。我将从以下方面开始
编程语言拥有(正式或非正式)定义的运行时语义。
真的很迂腐。
我认为这里真正需要问的问题是,为什么这很重要?我毫不怀疑,许多说出“HTML 不是编程语言”这句话的人都是出于恶意。然而,我认为,HTML 是否是编程语言根本无关紧要。归根结底,“编程语言”只是一个我们赋予事物的任意标签。是人类创造的,也是人类赋予其价值的。
这个主题与我们熟悉的“后端 vs 前端”争论类似,老实说,这种争论通常只引起那些职业生涯处于早期阶段的人的共鸣。坦率地说,不同的领域需要不同的技能,而且,不同的技能需要不同程度的背景知识和细节学习。
人类语言是不精确的,所以你总是可以从“编程语言”这个词的边缘入手。
当人们说 HTML 不是编程语言时,他们真正想要表达的是,你无法用它做其他公认编程语言可以做的事情。
我不赞成 HTML 不是编程语言的观点,因为缺乏逻辑。我承认 HTML 有变量,但我没有看到任何逻辑的证据。是的,当 open 属性存在/移除时,事情会发生变化,但这真的是逻辑的结果,还是由于默认样式,换句话说,是 CSS 的功劳?因为如果交互性是 CSS 的功劳,那么 HTML 就离不开它,也无法单独归因于逻辑。
details
/summary
的交互性不需要 CSS。检查开发者工具,当open
属性存在/缺失时,浏览器不会应用任何额外的原生样式。不,它不是编程语言,而仅仅是一个 f***** 标记语言。就此结束任何进一步的讨论。
这就是后端开发人员总是说的话。
它是一种文本编码形式?当然,也许有些人会贬低 Web 开发人员,这很荒谬。然而,这并不能改变 HTML 与 JSON 或 XML 相同的事实。它只是被编码的文本,旨在被程序解析。
这就是 文章反驳的第一个论点:标记语言和编程语言并不相互排斥。有许多计算机语言同时兼具两种属性。例如,TeX 既是编程语言又是标记语言,它已经存在了 40 多年。
我是一个多年的开发者,为了好玩,我给高中开了一门课,叫做“编程入门”,我希望没有人会把它误认为是医疗编码之类的东西。我反复思考了这个问题,为什么我把它叫做“编码”,而不是“编程入门”。
HTML 是代码
HTML 不是编程
JavaScript 是代码
JavaScript 是编程
如果 HTML 发展成某种编程,而不仅仅是编码,那么它可能已经发展得太远了。
我不明白为什么这会是一个问题。就像一个纸牌游戏可以图灵完备,但并不打算成为编程语言一样,HTML 从来没有打算成为编程语言,即使它图灵完备,也不会改变这个事实。
这里,我使用“编程语言”这个词是指它几十年来一直被使用的方式,即如果你想编写一个计算机程序,你必须选择一种语言来编写这个程序。我怀疑任何理智的人都会认为编写一个计算机程序与设计一个网页意味着相同的事情。很明显,这并不是那个意思!
当人们选择一种语言来编写程序时,这通常只是一种偏好或便利的问题,因为所有编程语言从某种意义上来说都是等效的。
图灵完备性在这里很重要,并且不是“流行”的。在我大学学习期间,即 25 年前,就已经确立了任何(通用)编程语言都必须图灵完备。
现在一直存在一些专用编程语言,这些语言不是人们在提到未限定的术语“编程语言”时所指的。这些语言适用于特定设备,这些设备有自己特殊的编程方式。这种语言在这些特定设备之外就没有什么用处了。
无论如何,我仍然不明白为什么有人会想给这种已经使用很长时间的术语带来这样的混乱。它确实有其目的,因为你不想让人们专门学习 HTML 这样的语言来编写计算机程序,结果却发现它不是这种语言的设计目的,仅仅是因为有人决定“编程语言”这个词需要更“包容”一些。
这篇文章比它试图反驳的关于 HTML 的说法还要迂腐。说 HTML 是一种标记语言,而不是编程语言,并没有什么错,也没有什么害处。
在我看来,HTML 只是一个数据格式,与 JSON 或 CSV 没有什么不同。
HTML 可以被“编码”,因为它可以在文本编辑器中手动构建——就像 CSV、JSON 等一样——但最终的结果就是它本身。
如果一个给定的文档在一个给定的浏览器中打开两次,那么第二次的行为不会(也不可能)有任何不同。
但话说回来,我喜欢把“编程”看作是“与机器达成共识”的行为。考虑到 HTML 规范的复杂性,让页面“看起来正确”有时确实感觉像是编程。;)
我通常会这样回答这个问题:HTML 是一种数据封装和呈现格式,它是从 SGML 的一个子集派生出来的,许多人不知道或已经忘记了。它可能不像 JSON 或 [CT]SV 那样“优雅”或简洁地封装数据,这是因为它具有呈现方面的特点(此外还与主题无关)。就像 TeX、Postscript 等。
毫无疑问,Minecraft 比 HTML 更像一种编程语言。
一个作为名词的程序定义:一组相关的措施或活动,具有特定的长期目标。
一个作为动词的程序定义:为(计算机或其他机器)提供编码指令,以自动执行
我的生计是 C++,但根据这些定义,我认为称 HTML 为编程语言是完全合理的。同样,称 C++ 为标记语言也是合理的,因为创建的是可以由 C++ 编译器处理的标记,就像 HTML 是由 Web 浏览器处理的标记一样。
你可能不知道,你所使用的“程序”一词的定义与计算机程序几乎没有关系,除非是指“计算机”类别的学校课程。这只是一个“计算机程序”一词与当前语境中所指含义完全不同的例子。请谨慎使用词典中的词语定义。很多时候,仅仅通过分解词语的构成来推断词语的正确含义是不可能的!
如果是这样,我想看看 HTML 文本是如何被编译成机器语言的……。
图灵完备性不像你描述的那样随意。它在某种程度上是随意的,因为我们也可以测试等效的 lambda 演算或寄存器机,但图灵机之所以有用,是因为如果一个问题不能被图灵机解决,那么它就根本不能被解决。
所以,如果我们使用图灵完备语言,我们可以实现所有可能的算法。
现实世界中有很多算法需要图灵机的无限状态。
我也认为图灵完备性是必要的,但不是充分的条件。正如你已经指出的那样,有很多东西是图灵完备的,但绝对不是编程语言。
除此之外,我认为将编程语言视为对语言使用方法的描述,而不是语言本身的固有属性,会更有用。所以从技术上讲,你可以用 CSS 表达所有算法,所以你可以用 CSS 作为编程语言,但大多数情况下大多数人不会这样做。他们用它作为样式表语言。
因此,即使我们放弃图灵完备性要求,HTML 仍然不常用作编程语言。这也解释了为什么“前端不是真正的编程”的观点逐渐消失。如今的前端开发,包括其复杂的 UI 交互、客户端渲染等等,与早期静态、文档化的网页相比,已经有了很大的不同,也更加复杂。
那么,这为什么重要呢?“编程语言”这个标签会产生预期。在比技术上必要更严格的程度上使用这个词,对于那些在无尽的正式语言海洋中航行的初学者来说尤其有用。
我听到的最常用来将 HTML 分类为编程语言的论点是,不这样做会贬低其开发人员,并被用来为他们提供比那些使用传统编程语言进行编程的人更低的工资。
所以,我的问题是,是否真的有人仅仅依靠编写 HTML 为生?我认为人们要么使用网站构建器,要么是前端开发人员,他们还必须编写 CSS 和 JavaScript。
我认为你说的很对。像这样的语言分类是基于它们的设计意图和用途。从理论上讲,我可以用套筒扳手钉钉子,但如果我有选择,谁会愿意这么做呢?当然,这并不意味着工具应该被归类为锤子,仅仅因为它可以用这种方式使用!
谈到图灵完备性,你也说对了(至少假设丘奇-图灵论题),这使得语言成为通用语言。任何用任何形式语言编写的有限代码都可以被翻译成图灵完备语言中的有限代码。反之则不然。
当然,这并不意味着所有图灵完备语言都应该被视为通用编程语言。但是,任何对通用编程语言的合理定义至少意味着这种语言是图灵完备的,否则将存在不能用该语言编写的程序,这是一个重大缺陷。
这篇文章中呈现方式的问题在于,作者似乎假设,如果所有编程语言都是图灵完备的,那么所有图灵完备语言也一定是编程语言,这显然是一个谬论。
好文章!!
有一点需要指出的是,如今你可以用 HTML 做一些过去用 CSS 甚至 js 才能做到的事情。
这是一门很棒的语言!!
取决于你的看法,你可以说它是或不是编程语言。
如果我说 HTML 是为 *机器*(即布局引擎)编写的机器代码,它控制着机器的行为,你会怎么想?
另一方面,你可以说布局引擎代码位于 *固件* 中,而 HTML 输入仅仅是配置,而不是代码。
但这重要吗?当然不,它按照预期(大多数情况下)做它应该做的事情。
虚拟机可以有自己的机器代码。但是 IMHO,HTML 不是机器代码,这会使“机器代码”的定义过于宽泛。但我绝对反对使用“固件”一词来指代除存储在硬件本身而非通用存储设备上的代码之外的任何东西。计算机的 BIOS 是固件。它的操作系统,而不是真正意义上的操作系统。
一个更好的方法不是问“为什么 HTML 不是编程语言?”而是问“为什么 HTML 首先会是编程语言?”
你不能用 HTML 编写程序。就这么简单。如果在屏幕上显示某些东西算作程序,那么画图软件就是编程语言,因为我可以画一个火柴人并将“.png”程序发送给你,你可以用你选择的图片阅读器打开它。现在,制作幻灯片演示也是编程吗?
图灵完备是一个好的开始,但这并不能使它成为编程语言。Minecraft 本身就不是语言。这显然使它不符合“编程语言”的定义。
你也可以声称自行车是机动车。如果有人说它没有发动机,你回答说:“好吧,搅拌机有发动机,但它不是机动车”。是的,因为它根本就不是车辆。就像 HTML 不是编程,Minecraft 不是语言一样。它们都不是编程语言。
我认为 HTML 不能被认为是编程语言,因为它没有提供 Flotte 控制,而控制逻辑和将逻辑串联起来实现流的可能性。
但 ISO 2382 并不那么严格,因为它不要求任何逻辑。
http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/begriff_programmiersprache_de
编辑:Flow 不是 Flotte
如果 Logo 是编程语言,那么 HTML 也是。正如 Zed Shaw 曾经说过的那样(这是关于 CSS 的):如果你在指示计算机做某些事情,那么它就是编程语言。
如何让开发者发笑
“Html 是一种编程语言”
不,HTML 不是编程语言!!不要再争论了,如果是的话,我们就不会使用 JS 了。
这很容易理解。
当我称 HTML 不是编程语言时,我的推理并不总是基于它能做什么,而是基于它的用途。它的用途不是为了构建逻辑,而是为了以人类能够理解的方式呈现数据。它基本上是一种浏览器可以解释和显示的 XML。CSS 也具有同样的目的,因此我不会将其称为编程语言。
SQL 是一个比较棘手的问题。PLSQL 肯定有逻辑,但同样,数据库的目的是存储数据。不应该在那里存在业务逻辑,所以除非万不得已,我通常倾向于把它当作没有过程和函数一样。
这篇文章似乎证实了 HTML 不是编程语言。
所以,如果我们对编程语言有一个严格的定义,我们就可以结束这场讨论。
虽然许多常见定义将 HTML 排除在编程语言类别之外,但这篇文章关注的是那些不将 HTML 排除在编程语言类别之外的定义。许多人说 HTML 不是编程语言,这并不奇怪,但如果没有一个共同的定义,这意味着它毫无意义,也无关紧要。现在,我们为什么要再次争论这个话题呢?
好吧,伙计们,你们显然是新一代人。所以听听老一辈人的观点。
编程语言意味着与机器对话。就像 basic、c++、c#、python、delphi、java、php 等等。
Html 与网页浏览器对话,而不是与机器对话。
Java 与解释器对话,而不是与机器本身对话。这意味着 Java 不是编程语言吗?
不,Java 与虚拟机对话,虚拟机也是一台机器,它使用 JIT 来生成机器代码。
但是,你会把一个 HTML 页面称为程序吗?
真的很喜欢这篇文章。
还有更多需要补充的观点。
1) **不可或缺**
HTML 是你唯一无法跳过的语言,才能构建网页。你可以不使用 js 或 css 创建网页,但不能不使用 html。
2) 人们通过攻击 HTML 来掩盖自己的无知。没有语义标记,可访问性和实用程序,它响应式图像(图片有逻辑 btw)。
我认为问题在于有些人将 HTML 解释为标记语言而不是编程语言,从而在某种程度上贬低了它。
编写 HTML 与编写 JavaScript/PHP/Python 等内容非常不同。我认为这一点很难反驳。
它更容易吗?在某些方面是的,在其他方面则否。
正如文章最后所述,HTML 的美妙之处在于基本原理可以比较容易地学习,但精通它实际上是一个漫长而艰难的过程。
我认为,与其争论 HTML 是否是编程语言(我认为——从科学的角度来看——很难说它是),不如探讨这些言论背后的真正含义,即 HTML 很简单或很容易(它既不简单也不容易)。
在我看来,HTML 技能应该像 JavaScript/CSS/PHP 技能一样受到重视。它可能不是编程语言,但这并不意味着它不重要或难以精通。
我们可以整天争论超文本标记语言是否是一种编程语言(以及为什么不是),但这并不是真正的问题。
真正的问题是 HTML9 BoilerStrap JS* 是否是一种编程语言。
https://html9responsiveboilerstrapjs.com/
而且这是来自 2012 年的。难道你不应该现在使用更新的东西吗?
这篇文章让我困惑的是,认为说 HTML 不是编程语言是一种贬低的说法。我一直把它描述为标记语言,但我认为这并不贬低。它非常容易学习和使用,这很棒。
在我看来,HTML 是一系列指示计算机遵循的指令,以向用户传达数据的语法或结构意义。
“一系列计算机遵循的指令”——从最基本的角度来看,这使得它成为一种编程语言。也许如果我们开始把它当作一种编程语言来对待,而不是用这种“它不是编程语言”的愚蠢言论来嘲笑和贬低它,也许我们会让更多人学会使用适当的语义,并分离关注点以及完全/适当的可访问性,而不是用像 HTML/CSS 框架这样的令人麻木的愚蠢的半智力垃圾来糟蹋互联网。
Html 是一种标记语言,不能像你所说的那样评估或读取属性,是浏览器引擎来处理 HTML 文本并进行评估。它是一种声明性语言,是的,它为使用你提到的数据属性的软件提供了语义结构,但它本身只是一段字符串文本。