我对这个问题真的感到反感。表面上,它似乎是一个有趣的可以深入探讨的问题,但它出现在公众话语中的方式很少是出于善意。其中涉及到尊重、保护情绪以及希望打破或维持现状的 ulterior motives(隐藏动机)。
如果有人能够以某种方式证明 CSS 不是一种编程语言(这是一个如此模糊的领域,如果这是你的目标,做起来并不难),那么他们就可以继续在自己的“真正”编程技能方面感到优越,并为他们(可能)比专注于 CSS 的前端开发人员获得更高的报酬这一事实进行合理化。这是维持现状。
反之亦然。如果你能证明 CSS是一种编程语言,也许你可以将你自己的公司或整个行业转向对前端开发人员给予平等的尊重和报酬。这是打破现状。
假设我们都能就 CSS 是否是编程语言达成 true
或 false
的共识。然后呢?如果为 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 专家同事不那么有价值。”那不是很好吗?“我认为声明式标记语言和其他类型的语言之间存在有趣的区别,但它们都是代码。”哦,别这样,你知道这种深思熟虑的答案让我脸红。
我希望在这些讨论发生时看到更多细致入微、尊重他人且没有议程的评论。
- 就像“网站”与“Web 应用”一样。无论你是否认为存在区别,我都希望人们不要根据你认为自己的东西属于哪个分类来做出影响用户的事情。⮑
我参加了 Lara 关于此的演讲。这是我听过的最令人愉快、最有趣和最有益的演讲之一。
编程语言是一种正式语言,包含一组产生各种输出的指令。在使用 CSS 时,你可以为你的网站提出各种指令以做出响应,输出基于你使用 CSS 输入的指令,字体大小、背景等等……
因此,我认为 CSS 是一种编程语言。
如果你以某种方式向计算机发出指令,从而从给定输入中产生预期输出,那么是的,从经典意义上讲,你是在“编程”。
CSS 的问题在于它只适用于一项任务,并且不遵循任何其他广泛使用的编程语言的相同范式。
从职业角度来看,CSS 的狭窄适用性意味着两件事
从长远来看,它很可能被自动化或完全抽象化。(我们基本上在网站构建器、JS 框架和编译器中看到了这一点。)
投入一小时学习 CSS 就等于投入一小时来解决一个在其他领域不适用的特定问题。
相比之下,JavaScript
与其他编程语言非常相似。例如,从 JS 转到 Python 相当容易。从 TypeScript 转到 C# 也是如此。
用途广泛,例如,在客户端 JS 中解决表单验证问题将适用于其他领域(在这种情况下是实体验证)。
CSS 开发人员确实执行一项重要任务,但经验丰富的 CSS 开发人员没有经验丰富的 JS 或后端开发人员的实用性。这就是为什么 CSS 开发人员没有其他开发人员那样的薪酬水平或职业流动性。
但归根结底,你对自己的职业负责。你仍然可以用 HTML 和 CSS 谋生,只是要注意专门从事门槛低、适用范围窄的技术所带来的风险。
快速添加说明以澄清(抱歉我的原始评论中拼写和语法错误。)
每个人都应该得到尊重。CSS 开发人员是开发人员。我们每天都有相同的 24 小时,CSS 开发人员选择将其用于该领域。
Chris 提到了 Python。Python 被认为是“通用编程语言”,这意味着它并非旨在用于任何一项任务。Java、C#、Rust 和 C 也是通用语言的示例。
HTML、CSS 和客户端 JS 广泛使用,但不是通用语言。这就是为什么专门从事它们所带来的权衡比其他技术更明显。
是的,CSS 开发人员很重要,但它没有通用的编程概念(这并不意味着 CSS 很容易),这就是为什么大多数人不会将其视为编程语言的原因。
同意职业流动性,有点像 Excel 中过于复杂的函数。
那么你的前提是水泥搅拌车司机不是真正的卡车司机,因为他的卡车只能用于一件事情?
不,因为他可以驾驶任何卡车。技能是驾照,而不是卡车。
它不是。CSS 不是编程语言,它是一种工具。
但它不必是。
这个话题经常出现,我认为有些人想称自己为“程序员”,但他们只做 CSS,并且害怕有些人会因此嘲笑他们之类的事情。¯(°_o)/¯
新闻快讯
你不需要使用“真正的”编程语言来称自己为程序员。你仍然在“编程”某些东西。
做你喜欢的事情,并称自己为你喜欢的方式。没有人真的在乎,只要你做好自己的工作。
很容易观察到编程和相关行业中大量工具的主要功能似乎是不惜一切代价保护我的屁股(仅代表个人观点)。
我个人一直很喜欢Jeff Eaton 对这个问题的看法。
我不同意——CSS 和 HTML 显然都是“语言”,因为它们都有正式的语法。在我个人看来,两者在语言谱系中都更接近于标记,但当然这并不意味着它们没有价值。
关于原文中提到的“尊重”这一点,我认为任何人都轻视那些主要工作职责是编写 CSS 的人,这都是荒谬的。样式是任何 Web 项目的重要组成部分,其重要性不亚于其他部分。我遇到过一些同事,他们对编写 CSS 的想法嗤之以鼻,因为“这不是真正的编程”,但如果让他们尝试,他们也做不到。碰巧的是,这些人通常也是糟糕的“传统”程序员。
我认为它不是一种传统的编程语言,但是我见过人们用它做的一些事情(例如 https://codepen.io/neoberg/pen/istyp)确实让我在任何“传统”语言中的任何技能都相形见绌。
没有理由不让人用 CSS 做出这样的东西发大财。
!important 存在。这自动使其具备了语言的资格。
!important 是一个令人厌恶的东西。
我认为试图证明 CSS 是一种编程语言并不能解决真正的问题。真正的问题是 CSS 开发人员的尊重度和薪酬都低于程序员,但这二者之间没有必要存在关联。
我的意思是 SQL 也不是一种编程语言(它是一种查询语言,名字里就有),但数据库管理员却是薪酬最高的技术人员之一。或者看看项目负责人和高层管理人员,他们的薪酬甚至更高,其中一些人甚至不会写一行代码!
恕我直言,说服人们编写 CSS 是一项非常复杂的任务,需要高素质的人员,即使它不是一种编程语言,也比试图证明它从某种程度上来说是一种编程语言(如果你以某种特定方式看待它的话)更容易。
我在一个非常前卫的环境中工作,全栈程序员在那里占据主导地位。我不是“CSS 开发人员”,坦率地说,在阅读这篇文章之前我从未听说过这个术语……然而,CSS 的用例是为一组功能和特性提供一个对人类友好的界面。
无论是 CSS 还是其他一些样式方法(WPF 样式模型),这真的重要吗?
CSS 为人类,甚至婴儿,提供了一种在没有任何先验理解的情况下理解和可视化代码的方式。
…
也就是说,几乎所有这些全栈程序员对 CSS 都知之甚少,这让我感觉很好,因为我可以改变一下,回答一些问题。
CSS 更像是一个 DOM 的配置文件。它有部分、指令和值。我认为 CSS 就像 YAML、XML 和 JSON 一样。它没有运行时,并且可以在许多不同的运行时由其他语言使用。
我在工作中每天都使用 Angular 11。CSS(SCSS)只是组件的样式部分。HTML 只是模板结构。TypeScript 包含组件的所有逻辑。
谁在乎 CSS 是否是编程语言。HTML、CSS 和 JavaScript 共同驱动。
我私下里有点怀念 DSSSL 甚至 XSL。对我来说,这个问题是在这个背景下提出的。如果没有 CSS 技巧、Flexbox 和 SVG,用 CSS 将想法变成现实就像用 6502 汇编语言编写高可用性 Web 应用程序一样:你可以做到,但这似乎没有任何意义。但是有了 XSLT 和 XSL-FO,它就变成了一个简单的编程问题。对于 DSSSL 来说,它甚至更容易,因为 DSSSL 没有我们在 CSS 中看到的那种信息泄漏。
程序员是编写要由计算机执行的指令的人。机器能够执行 Python 指令,就像机器执行 CSS 指令一样。
所以对我来说,CSS 是一种编程语言。只是它可能没有被明确地称为一种编程语言。
编程语言可以分为两种不同的范式:声明式和命令式。
像 C++ 和 Java 这样的传统语言属于命令式范式。你告诉计算机每个步骤。你本质上是在控制程序的流程,并专注于它“如何”执行。
声明式语言描述你想要的结果“是什么”,而无需指示每个步骤。DSL 是这些声明式语言的一个子类别。它们不需要图灵完备。
CSS 是一种声明式语言,它描述了网页的视觉方面。你没有告诉浏览器如何一步一步地将背景更改为蓝色,你只是告诉它这个东西需要是蓝色的。地狱,CSS 也有一个正式的语法来描述它的语法以及标记化和解析规则。
我个人从未听到过有人反对 CSS 是一种编程语言。
我不明白它怎么会不是一种编程语言!我绝对讨厌这个行业产生的精英主义和毒性。这并不重要——我们都是技术人员,能够用我们理解的工具解决问题。
尊重和薪酬更多地受到供求经济现实的影响,而不是工具的表观复杂性。如果你试图解决你面临的这些问题,那么你将面临一个大规模的囚徒困境问题。
让我们面对现实吧。程序员群体总体上是由偏执狂和狭隘的人组成的。这是我近 10 年在该行业工作得出的结论。傲慢和部落主义是很少有人公开谈论的事情,但它肯定存在于大多数地方。
我不明白为什么会有关于此的争论。它当然是一种编程语言。但为了清楚地说明为什么我说“当然”,我将尝试解决人们可能用来反驳的特性(本文前面的一些评论中表达了许多这样的特性)。
它没有通用性(它不是“通用”的)。许多语言都是如此。CSS 针对特定的问题域,很少用于该域之外的问题。这被称为领域特定语言(DSL)。其他 DSL 包括:正则表达式、SQL、Processing、JSX。
它(主要是)声明式的。大多数人认为编程是指示计算机“做”某事(命令式编程)或计算某个结果的公式(函数式编程)。但同样,还有许多声明式编程语言,例如:Prolog、正则表达式、SQL、JSX。正如我所说,它主要是声明式的。像 SQL 一样,它也有函数。像 SVG 一样,它可以声明性地启动自主状态更改(动画)。
它具有(主要是)静态的 API,并且添加新功能的能力有限。目前有两个例外:自定义属性允许新颖的组合,而 Houdini 允许任意的新颖功能。当然,Houdini 需要 JS 实现。但可以想象,一个子集可能会像 Shadow DOM 的一个子集即将进入 HTML 一样进入 CSS。
我想不出任何其他反对 CSS 作为编程语言的理由,这些理由不是主要基于精英主义的。对于文章中关于价值(同工同酬和尊重)提出的观点,这种精英主义是有害的。但更重要的是,它毫无根据。
即使是在 CSS 中实现简单的设计也可能非常复杂。开发人员必须考虑:不断增长的设备尺寸和功能矩阵;各种可访问性和可用性挑战;浏览器怪癖和不兼容性的不断变化;JS 开发人员处理的相同类型的工具激增。
更重要的是,对于没有前端经验的开发人员来说,一个常见的习惯用法是抱怨他们在涉足或承担前端工作时面临的挑战。
CSS 不是图灵完备的编程语言,就是这样。它是一种语言,其功能不如完整的图灵完备语言。但这并不意味着它不那么有价值,你不会用瑞士军刀来拧螺丝,但你可以,而且会很糟糕。但是你不能用螺丝刀来切奶酪。这并不意味着螺丝刀没用或低级或其他什么。
将计算能力定义为图灵完备是有用的,但它不是价值判断。
用 CSS 翻转二叉树。
Tree.rotate(180deg)
就是这样。
我知道对只了解皮毛的东西发表意见是多么诱人。并非每个人都知道如何编写良好的 CSS 代码是有原因的。它可能像所有编程语言一样变得非常复杂。你可以使用函数、变量,并创建需要数周才能正确构建的网格。所以,如果你是一位程序员,在从头开始构建 CSS 网格时遇到了问题,那么我必须问一下它是否是一种编程语言?
一旦你添加了 SASS 或 LESS 等预处理器,CSS 突然变得更加复杂,甚至必须在客户端使用之前进行编译。有了它,它听起来更像是一种编程语言了。
我不知道我是否在乎 CSS 是否被称为编程语言。
我真正关心的是那些只会写一些 HTML 并添加 Bootstrap,就自以为有资格做架构整个系统后端和前端的人。或者认为 CSS 可以应用于其他类型的语言,比如“你是程序员?太棒了,我们需要你写点东西来解析这些账单记录”。
看看我用 CSS 做了什么:https://github.com/avisek/No-JS-Noughts-And-Crosses
读得很好,我一直开玩笑地问这个问题,因为它的功能强大且可靠。
我只是不喜欢有些人让 CSS 看起来不那么重要,因为它不是一种编程语言。
这就像问病毒是否存活,因为它无法独自复制一样。
我想我们都可以同意这并不重要,因为两者都深刻地影响着我们,而可执行或自我复制实际上并不是最终重要的。
重要的是事物本身的影响以及影响的程度。
我也认为这可能是唯一一个你可以将 CSS 比作生物病毒而不觉得言过其实的时代 ;-)
不能说 CSS 不是,也不能说 CSS 不是……我认为它处于成为编程语言的中级(更接近高级)阶段。
我是一个 CSS 爱好者。我被 CSS 吸引是因为它允许我设计有吸引力的文档和 UI。至少我使用它的方式不是编程语言,因为它严格来说是表现性的。Mozilla 的某个人制作了一个关于 CSS 的视频,她在视频中说它更像是语言而不是逻辑。换句话说,它更多的是关于告诉网页或应用程序如何显示,而不是实际进行任何计算。也许我们应该称之为表现性语言?
CSS 不是编程语言。就这么简单。它并非设计用于编写程序,这样做也不容易或有用。它与任何其他具有偶然图灵完备性的语言一样,都不是编程语言。我们不要浪费时间争论如此毫无意义的事情。
就像 F.Z. 会说的那样
“它没有,你不能,我不会,它也不
它没有,它不是,它甚至不是,它也不应该
它做不到”
不错的文章。但问题是 CSS 是编程语言还是工具,它会继续存在。所以不再浪费时间在这个问题上,总的来说,我认为这篇文章很好,并且期待看到你更多博文。好的,就这样,保持安全。
这是一个有趣的讨论。我是一名前端开发者,我从未认为我在 CSS 上花费的时间价值低于(或需要技能少于)我在 JS 或 C# 上花费的时间。我确实想知道一个人如何能完全依靠 CSS/HTML 工作,但有些人在这方面的技能确实令人印象深刻。
图灵完备性当然不应该用来判断某样东西是否是编程语言。有一些非图灵完备的语言旨在保证程序终止。而且,还有像 PowerPoint 这样的软件是图灵完备的。每次我做演示文稿时都在使用编程语言吗?
图灵完备性是对语言可以计算的所有函数的定义。这不是速度/性能的衡量标准。使用它有助于理解语言的功能和缺陷。是的,有些语言不如图灵完备语言表达能力强,例如保证在有限的步骤后进入完成状态。它们有其用途,但了解它们不是图灵完备的也很有用。“x 是否是编程语言”的问题首先需要得到一个明确的定义。
无论 CSS 是否是编程语言。这不是重点。回到石器时代网络,那时你不得不嵌套表格并直接将样式标记写入 html 代码,然后你就会看到 CSS 的价值,它让我们都能轻松、漂亮地构建 html 内容。
我向 CSS 开发人员致以应有的敬意,因为他们才是编写可访问性、可用性等代码的人。
想象一下没有 CSS 的网页内容,并尝试使用它。
这是我们应该讨论的最重要的事情,即为我们编写 CSS 的人们的价值。
编程语言……存在于编程机器。
无论是提花织机还是大型机。
在电子计算机中,唯一的“真正”编程语言是(适当的)机器语言。因为,最终,只有它才会被执行。
其他一切都是抽象。即使汇编器也是一种抽象,尽管它与机器语言相去不远。
因此,判断某事物是否正在执行“编程”操作的简单测试是,它是否变成了机器指令?
“语言”的问题是一个不同的问题,我在这里不讨论它。
CSS -> 浏览器运行时 + 操作系统 -> 机器语言 = 执行
CSS 是一种“编程”语言。
我们已经远离了与物理状态的关系,以至于我们甚至无法理解我们所谈论的抽象程度。
虽然我们可以争论不同级别和类型抽象的特性,但我们设计计算机语言的大部分原因是为了指导人类。抽象有助于人类思考。对于图形编程,CSS 比 C 图形例程更容易思考。或者,至少更快。从汇编器的角度思考图形编程则需要更多工作。
这就是 DSL 有用的原因。它们帮助我们在计算机上制定特定的结果,以我们的大脑可以理解的方式。
此外,编程语言帮助我们避免处理硬件差异。这些差异由操作系统 (OS) 和我们使用的编程语言隐藏。
最后一点。如果你认为你正在使用真正的编程,因为你使用了 Javascript 或 GO,那么你错过了构建你代码下层内容的人们为你所做的所有工作。你知道如何编写编译器吗?你想花所有时间编写编译器而不是编写一些将网络调用粘合在一起的代码吗?所有函数调用都由经过多年发展而来的系统设置。
也许我们可以享受我们喜欢的流程部分,并尊重其他人享受他们喜欢的流程部分?
可悲的是,获得报酬更多地与感知到的难度相关。
Javascript 对非开发人员来说看起来很难。
CSS 只是让事物看起来是绿色或蓝色,这能有多难?
你的工作成果越明显,人们就越容易认为他们自己也能做到。
(这是我作为前端开发人员学到的一件事。任何经过我工作站的人都会觉得很舒服地“批评”我的工作。但没有人愿意与后端开发人员交谈,因为害怕显得愚蠢。)
我同意你对这个问题的不满,因为它完全是学术性的,而且像大多数学术问题一样,它只会导致对现实世界没有影响的争论。我是一个老牌的网络工程师——从 90 年代开始使用 HTML,然后学习 JavaScript。从 2000 年代初开始使用 CSS,并逐渐喜欢上它强大的功能和简洁性(以及我不需要像以前那样经常使用 Adobe 套件!)。在那些早期为客户构建网站/应用程序时,我从未想过它是否是一种编程语言,因为你如何称呼它与你如何使用它无关(让关于这一点的哲学争论开始吧)。
这种争论反映了人类天性中一个不幸的方面:渴望“正确”并被认为知道“正确”的答案。与其花时间争论这个无关紧要的问题,我鼓励人们阅读规范/文档并练习使用 CSS 以提高技能。无论人们如何对 CSS 进行分类,至少在我看来,仍然缺乏能够有效/高效地使用它的工程师。
TLDR:CSS 无法计算图灵机可以计算的所有函数,因此它不是图灵完备的编程语言。有趣的是,CSS 与 HTML 的组合是图灵完备的。
我来到这篇博文是为了找到 CSS 是否是编程语言。我最终找到了这些信息。但是,我不知道为什么它会以一种对学术界感到恼火的语气呈现。编程语言通常被认为是图灵完备的语言。CSS 不是,就是这样。这并不能否认 CSS 非常有价值并且难以掌握的事实。
对于你所说的你无法证明 CSS 不是编程语言(定义为图灵完备语言),你完全可以证明。
我不知道这种对学术界的伤害性态度从何而来,但理解编程语言的不同正式定义以及研究如何改进这一点仍然很重要。
实际上,它是一种伪语言。你需要了解编程才能理解CSS。