CSS 是编程语言吗?

Avatar of Chris Coyier
Chris Coyier

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

我对这个问题真的感到反感。表面上,它似乎是一个有趣的可以深入探讨的问题,但它出现在公众话语中的方式很少是出于善意。其中涉及到尊重、保护情绪以及希望打破维持现状的 ulterior motives(隐藏动机)。

如果有人能够以某种方式证明 CSS 不是一种编程语言(这是一个如此模糊的领域,如果这是你的目标,做起来并不难),那么他们就可以继续在自己的“真正”编程技能方面感到优越,并为他们(可能)比专注于 CSS 的前端开发人员获得更高的报酬这一事实进行合理化。这是维持现状。

反之亦然。如果你能证明 CSS一种编程语言,也许你可以将你自己的公司或整个行业转向对前端开发人员给予平等的尊重和报酬。这是打破现状。

假设我们都能就 CSS 是否是编程语言达成 truefalse 的共识。然后呢?如果为 true,所有 Web 工作者的薪酬是否都标准化了?如果为 false,CSS 专家是否应该降薪?如果为 true,每个人是否都开始以现在没有的方式互相尊重?如果为 false,CSS 人员是否必须在锅炉房吃午饭?我怀疑任何事情都会发生变化;因此,我对整个讨论都感到反感。

无论事实如何,大多数人都不会接受 CSS 可能是编程语言的可能性。我的意思是,程序会执行,不是吗?没有人怀疑 JavaScript 是一种编程语言,因为它会执行。你编写代码,然后执行该代码。也许你打开一个终端窗口并编写

> node my-program.js

当然,这个程序会执行。你可以使用 console.log("Hello, World!"); 将“Hello, World!” 打印到终端。

CSS 无法做到这一点!嗯,除非你在 style.css 文件中写入 body::after { content: "Hello, World!"; } 并打开加载该 CSS 文件的网页。所以 CSS 确实以其自身特殊的方式执行。它是一种领域特定语言(DSL),而不是一种通用语言(GPL)。在浏览器上下文中,CSS 被告知运行的方式(通常为 <link>)与 JavaScript 被告知运行的方式(通常为 <script>)并没有太大区别。

如果你正在寻找将 CSS 语法与编程概念进行比较,我认为你会找到它们。如果选择器不是在匹配项上运行循环的 if 语句的一种类型,那它是什么?如果 calc() 不是数学的直接实现,那它是什么?如果一组 媒体查询 不是 switch,那它是什么?如果 自定义属性 不是存储状态的地方,那它是什么?如果 :checked 不是布尔值,那它是什么?Eric 最近指出 CSS 是类型化的,并且在此之前,CSS 充满了 函数

无论好坏,是否将 CSS 视为编程语言都会影响人们。一位大学教授曾强调指出 CSS 不是图灵完备的,但在了解到它是图灵完备的之后,他现在正在重新考虑这一立场。无论其意图如何,我认为计算机科学教授年复一年地告诉计算机科学学生的这些内容会影响到整个行业。

Lara Schenck 深入探讨了图灵完备的角度。如果你试图解决这个问题,图灵完备性是一个很好的指标。事实证明,CSS 基本上图灵完备的(通过解决规则 110 的元胞自动机问题),但并非完全依靠自身。它涉及到选择器和 :checked 的某种复杂用法(不出所料)。Lara 提出一个精辟的观点

单独的 CSS不是图灵完备的。CSS 加上 HTML 加上用户输入是图灵完备的!

尽管如此,假设你并不认同。你理解了,甚至承认,“好吧,CSS 本质上是图灵完备的”,但你就是感觉CSS(或 HTML)对你来说不是一种编程语言。它太声明式了。太特定于应用程序了。无论是什么,我老实说不怪你。我希望,无论你得出什么结论,答案都不会影响真正重要的事情1,比如薪酬和尊重。

无论我们最终得出什么答案,尊重都是必要的。“我不认为 CSS 是一种编程语言,但这并不意味着我认为它微不足道,或者我的专家同事比我的 Python 专家同事不那么有价值。”那不是很好吗?“我认为声明式标记语言和其他类型的语言之间存在有趣的区别,但它们都是代码。”哦,别这样,你知道这种深思熟虑的答案让我脸红。

我希望在这些讨论发生时看到更多细致入微、尊重他人且没有议程的评论。


  1. 就像“网站”与“Web 应用”一样。无论你是否认为存在区别,我都希望人们不要根据你认为自己的东西属于哪个分类来做出影响用户的事情。