因为这不够有趣
由 dreamreal 撰写
更新时间:美国东部时间上午 11:54
标签:历史|语言|心理学|软件工程
Andrew Oram 为 Linux 专业协会撰写了一篇关于编程语言兴衰历程的系列文章,共两部分。他大致指出,C 语言、C++ 和 JavaScript 目前仍然非常流行;而 Java 或许会保持活跃;COBOL、FORTRAN、BASIC 和 Perl 则经历了较为平稳的发展,最终被 “送” 到偏远地区去 “退休” 了;Pascal、Objective‑C、PL/I、Ada 和 Tcl 都是昙花一现的尝试,而 Ruby 则处于一种中等水平。这是一位长期从事该领域研究的人士所给出的精彩分析。在文章的结尾,Oram 引用了 Simon Peyton Jones 的观点,他认为一种语言的流行程度与其技术优势关系不大,真正决定语言命运的是社会和经济因素。
那句话出现在文章中,不过有点令人惊讶的是,它被放置在了内容的末尾;也许是因为《工程学以顺应人性》这篇文章的宗旨决定了很难将那句话作为文章的主要论点,因为我们不想如此直白地阅读这样的内容。但事实就是如此。
语言的采用并非仅仅涉及技术层面 —— 它既包含技术因素,也包含人类因素。
在那个引文之前的两段内容中,所有提到的都是支持这一观点的证据。这些证据虽然被收集起来,但并没有被整理成系统的体系。该系列按照结果对语言进行分类:永生、值得尊敬、失败。有趣的是,语言的使用方式还取决于其死亡原因。这些原因源于一个简单的观察:Peyton Jones 将编程工作简化为简单的循环操作,而 Oram 则将其发展为一种艺术形式。语言是一种职业,也是一种艺术,同时也是一种工作手段。当一种语言让使用者同时面临这三种需求时,它才会被持续使用下去。而如果某种语言或工具让其中任何一种需求变得不必要地复杂,那么它很快就会被取代。
职业是一种由社会赋予的使命 —— 无论是否有报酬,人们都会去从事这份工作。而艺术则是一种出于热爱且凭借技能所从事的事情。而工作则是一种日常性的工作,是人们为了谋生、看电视、住在有屋顶的房子里,或者做其他无聊的事情而不得不做的事情。
音乐家们每天都在扮演着这三种身份:创作翻唱曲是他们的日常工作,原创作品则是他们的艺术追求,而每天能否获得机会演奏乐曲,则决定了他们能否继续从事音乐事业。程序员们也是如此;只不过我们不会经常公开提及这一点罢了。
把尸体那样整理起来,它们就会整齐地分开放置。
有些语言因为某些缺陷而未能成功发展:标准 Pascal 语言在发布时就没有可用的字符串类型;而 Tcl 语言也无法处理过于复杂的程序。因此,日常编程工作变得比原本更加困难。1
有些项目在开发过程中失败了:比如 Ada 和 PL/I 这类语言,它们的选择是由别人决定的,而不是由开发者自己决定的。而人们从来都不喜欢这种由他人决定的语言选择。
有些项目以失败告终:例如,Perl 的就业市场逐渐转向了 Python,而 Haskell 则试图不惜一切代价避免失败,不过它最终还是实现了这一目标。2
不同的疾病,相同的病理表现。在每一种情况下,总有人让其中一条 “坐标轴” 变得不必要地复杂化,而那些使用该语言的人群则选择了更轻松、更有趣或更可行的路径。
一种让使用它的人生活变得艰难的语言,注定无法在被更先进的语言取代之后继续存在。这句话解释了奥兰列表上所有奇怪的情况。对于大多数编写 JavaScript 的人来说,这种语言根本无法成为一种优秀的编程语言,但它仍然存在,因为 JavaScript 仍然是浏览器领域的主要通用编程语言。Objective‑C 虽然使用起来很麻烦,但它却持续了十五年,因为它曾是进入最赚钱的开发者生态系统的唯一途径;而 Swift 出现后,Objective‑C 就逐渐消失了,现在它只是作为一种遗留语言存在。COBOL 之所以仍然存在,是因为取代它太困难且成本太高 —— 一些公司已经注意到了这一点,并试图解决这个问题。如果他们成功,COBOL 可能就会消失:一种几乎总是能正常运行、但编程起来却毫无乐趣的语言。Ada 至今仍然存在,因为认证制度使其几乎无法被替代。不过,Ada 的难度恰恰意味着它仍然有存在的价值。这种食物会在替代演出当天才被提供,不能提前一天。3
因此,C++ 仍然显得复杂且难以掌握,似乎与所有这些语言都相矛盾。Rust 同样如此,它也是设计上就比较难用的语言,而且使用起来也越来越困难。实际上,编程中的困难有两种类型,而这一系列语言把这两种困难混在一起了。
一种常见的困难就是与小提琴相关的挑战:这种乐器要求极高,而且必须精心挑选。人们参加 C++ 编程比赛只是为了娱乐而已。人们还会写下关于某一天 “借用检查器” 终于发挥作用时的感受,或者描述弦乐演奏者如何克服 “颤音效果” 带来的困扰。困难本身并不致命,但如果没有足够的回报,那么困难就变得难以忍受了。C++ 和 Rust 语言就具备这样的回报,就像小提琴一样。
另一种困难是摩擦问题:Ada 的语法规则过于繁琐,标准的 Pascal 语言存在缺陷,而 COBOL 语言的语法结构虽然精妙且要求严格,但实际上却并没有真正创造出良好的程序结构。没有人能够撰写过关于 Ada 语法何时会变得更容易使用的文章。这种困难涉及到三个不同的方面…… 不过,其实根本不存在这样的困难。在一项调查中,Ada 和 C++ 都被认为是 “难懂的语言”。不过,Ada 作为一种标准语言已经逐渐衰落,而 C++ 则因为 “难懂” 的部分被放在了不同的维度上,所以才得以延续至今。
那么,Java 在这一切中处于什么位置呢?这是个好问题!Java 并不像 C++ 或 Rust 那样复杂,因此不需要它们的 “保护”。它作为一种实用且有趣的编程语言,至今仍然非常受欢迎。由于最近在软件包和功能上的改进,Java 的生态系统也变得更加繁荣。不过,这完全取决于程序员个人的选择;可以说,Java 还没有真正消亡,但很难预测具体的时间点。就我个人而言,我每天都在使用 Java。我有点偏心吧。
回到音乐的话题上来吧。其实,这种类比已经不再是一种恰当的类比了。现代采样器能够再现小提琴发出的每一个音符,能够呈现小提琴演奏中的每一种细微变化;它简直就是关于各种技巧、指法、演奏方式以及作品本身的百科全书。然而,要让这个系统真正完成所有这些功能,其实比单纯演奏小提琴要复杂得多!能够做到这一点从来都不是问题所在。事实证明,要营造出类似小提琴演奏的声音,最好的方法其实就是亲自演奏小提琴。同时,这也是代码存在的原因:程序是一种对行为的简洁描述,而用文字来描述行为所花费的精力,比为这种任务而设计的符号系统要少得多。4
我可以让电脑模仿我的吉他演奏方式,但我无法让电脑真正像我一样演奏吉他。我知道自己该如何演奏,也明白自己的偏好和节奏特点。我可以逐笔、逐手势地模仿我的吉他演奏方式。但这样做毫无乐趣可言。结果虽然还行,但过程却变得毫无意义了 —— 而过程本就是演奏的乐趣所在。即使我尝试引入随机性或者使用自己的节奏,情况也并不会有所改变。就像我们之前提到的其他情况一样,这种尝试同样失败了。
对于那些只想要音符的人来说,采样器绝对是更好的选择。它永远不会播放错误的音符或错误的时机。但对于那些真正需要演奏音乐的人来说,采样器则毫无用处,因为操控采样器的成本远高于演奏本身,而且它完全无法体现音乐的艺术性。所以,当我希望在音乐中加入吉他声时,我还是会选择使用吉他。选择使用采样器其实是一种选择而已。编程语言的选择规律同样适用于其后续版本。不需要任何特别的辩解…… 或者允许任何辩解。
那么,为什么编程语言会兴衰呢?Peyton Jones 已经说过这一点,Oram 也曾经提到过类似的观点。编程语言不会因为基准测试的结果而兴衰,它们会失去人才。当编程变得更容易、更轻松的活儿时,编程语言就会兴起;而当有其他方式能够承担同样的职责时,编程语言就会衰落。因为在那种时候,唯一的问题就是…… 编程是否有趣?5
脚注
1 关于 Pascal 的一个补充说明:其实 “过早衰落” 这一说法有些误导。Pascal 的商业化发展并非在课堂中结束的;它后来转移到了 Borland 公司,在那里,Turbo Pascal 和 Delphi 在十多年的时间里主导了 PC 开发领域。Turbo Pascal 的作者是 Anders Hejlsberg,他后来又开发了 Delphi、C# 以及 TypeScript。而 Wirth 的系列作品则通过他的学生 Robert Griesemer 传到了 Go 语言中。Pascal 并非真正衰落,而是被逐渐取代了 —— 这与 Oram 的观点相符:有些语言是通过影响力而非被广泛采用来取得成功的。另外,我真的很喜欢 Pascal。
2 拉里・沃尔决定让这些限制条件可以被修改,这在一定程度上帮助了 Perl 的发展。Perl 花了二十年时间等待 “Perl 6” 的诞生,以至于最终 Perl 6 变成了一门完全不同的语言(Raku)。而为了支持 Raku 语言而开发的虚拟机 Parrot 则因为等待时间过长而失败了。不过…… 现在还有人使用 Raku 吗?我甚至得去查一下这个语言的名字。我相信还是有人会使用的,但是…… 如果我在一个论坛上问大家是否使用过 Perl、Python 或 Raku,那么 Perl 和 Python 会得到很多回答,而 Raku 则只会得到一些问题的回应。直到人们意识到 Raku 其实也是 Perl 的一种罢了。
3 这太不公平了,我清楚这一点!应该是 “不惜一切代价避免成功”,而不是 “不惜任何代价来避免失败”。这强调的是优先级的问题,而不是失败。这意味着 Haskell 有自己独特的设计理念,他们不愿意为了变得更受欢迎而牺牲这些理念。
4 问问 Java 关于在浏览器中运行的语言的问题吧!…… 不过,不要直接在浏览器中尝试这种操作,因为 Java 本身并不支持在浏览器中的运行 —— 你需要使用像 CheerpJ 这样的运行时环境,它将 JVM 嵌入到浏览器中;或者,可以使用适用于 WebAssembly 的编译工具链来实现这一目标。
5 Ada 语言非常有趣。它功能强大,被广泛应用于某些领域,而这些应用选择是基于合理的理由:安全性、精确度以及可扩展性。不过,我从未想过要编写使用 Ada 语言的代码。我认识的一些 Ada 程序员认为,Ada 语言之所以成为行业标准,是因为行业需求而非个人选择。而 Rust 同样满足了这些需求,人们也非常热衷于使用它。人们无需通过专门的规范来使 Rust 能够发挥作用。Ada 语言之所以能占据一席之地,是因为其固有的特性;Rust 也是如此,只不过 Rust 在发展过程中已经取得了相当丰富的经验,就像任何替代 COBOL 语言的语言一样。这只是我的猜测,因为目前 Ada 语言和 COBOL 语言都还没有面临大规模的替代趋势。但即便如此,这恰恰就是它们的价值所在。
不久前,我尝试用 Pascal 语言编写了一些代码。结果发现,自己竟然忘记了好多东西,而像 Borland 这样的公司则致力于解决 Pascal 语言使用上的困难,让这种语言能够更易于使用。这真是件有趣的事情。
这完全是正确的。大多数电子音乐作品都是围绕着尝试复制那些源自人类双手的技术而创作的:如后期处理功能、X‑Y 控制器、呼吸控制器、触觉控制器、音序器等等…… 而这样的列表其实并不完整。所有这些技术都是为了实现普通吉他手能够完成的操作而已。
这当然也是为什么很多程序会遇到困难的原因:它们所表述的规格描述往往不够清晰明了。
贝里奇定律指出,任何以问号结尾的标题都可以通过 “不” 来回答。奥拉姆的标题就是一个问题。而这篇文章的标题则是答案 —— 不过据我所知,这违反了规则。标题应该是给人类看的;我咨询了镜子中的自己,他觉得这个标题没问题。
评论(0)
请登录以发表评论
目前还没有任何评论。
评论