PHP是怎么做到最糟糕的编程语言?|?
2021-10-09
作者 |
翻译 |
规划 | 蔡芳芳
本文首发于本站,经原作者授权,由中文网翻译分享。
我有近 20 年的编程经验,使用过各种编程语言进行开发。在我以前做过的很多工作和现在做的工作中,我很高兴能够使用PHP作为核心编程语言。从我第一次使用 PHP 开始工作,我听到了对 PHP 的各种抱怨,但同时我也看到了 PHP 的强大。
PHP 至少是一种有趣的编程语言。这种语言和用它构建的程序通常属于两种设计理念。在这里,我不是在谈论软件开发生命周期,例如瀑布或敏捷,而是关于软件应该是什么的基本思想。这些想法被称为“The Way”和“ is ”(是)。
PHP 是另一种相当奇怪的编程语言。当人们抱怨语言“不好”时,他们并没有犯错。这种语言确实有很多缺点。撇开,这种语言有更多不好的问题。嘲笑 PHP 的博客文章“PHP 糟糕设计的综合分析”(PHP:a of bad)确实有一些正确的观点,尽管这些观点在九年前发布时已经过时了。
然而,与此同时,开发人员可以使用 PHP 来创建结构上“正确”的软件,并从其他语言中引入被认为是良好实践的理念。框架喜欢并使用面向对象编程的最佳实践,因此开发人员可以使用这些框架编写结构良好的代码。
PHP 如何做到这一点?这是因为 PHP 是最糟糕的编程语言。
设计软件
1991年,P.发表了一篇文章《Lisp: Good News, Bad News, How to Win Big》(Lisp: Good News, Bad News, How to Win Big)。本文的论点是,在软件设计和寿命方面,“越差越好”的理念将是更好的选择。他得出这个结论是因为他意识到出现了两个不同的编程学校,他将它们命名为“MIT/ ”(MIT/),或者“正确的方式”。,以及“新泽西”或“越差越好”。
这两种哲学的目标相似,但在关键领域有所不同。两种风格都专注于哲学的四个关键领域:简单性()、正确性()、一致性()和完整性()。
MIT 风格是这样描述的:
简单:设计必须简单,无论是实现还是接口,都必须简单。相比之下,保持界面简单更重要。
正确性:在所有可观察的方面,设计必须是正确的。不要试图做出错误的设计。
一致性:设计不能不一致。为了确保一致性,您可以稍微牺牲简单性和完整性。一致性和正确性同样重要。
完整性:设计必须涵盖尽可能多的重要情况。必须涵盖所有符合预期的情况。完整性的优先级应该高于简单性。
至于新泽西风格,它将其目标定义为:
简单:设计必须简单,无论是实现还是接口php高级程序设计:模式,框架与测试,都必须简单。相比之下,保持实现简单更为重要。简单是最重要的,其他功能不如保持简单重要。
正确性:设计必须在所有可观察的方面都是正确的。但是为了简单起见,可以稍微牺牲正确性。
一致性:设计不能太不一致。在某些情况下,可以牺牲一致性来确保简单性。如果在设计中引入一个不常见的情况会导致实现变得复杂或不一致,那么就不要考虑这种情况。
完整性:设计必须涵盖尽可能多的重要情况。必须涵盖所有符合预期的情况。任何其他特征的完整性都会受到影响。事实上,一旦实现的简单性受到威胁,就必须牺牲完整性。如果你想保持简单,你可以牺牲一致性来实现完整性;尤其是界面的一致性。
这场争论的关键在于以 LISP 和 C 为例来说明为什么“越糟越好”。对于 LISP 程序员来说,LISP 是一种比 C 更好的语言,和 C 一样快,而且 LISP 的设计、开发和标准化已经花费了很多年。定义语言的规范吸取了所有不同 LISP 的精髓,现代开发环境最适合 LISP 开发人员。
LISP 是正确的方式
LISP 代表了软件开发的“正确方式”。LISP 易于交互,您可以通过多种方式与其交互。想从中调用 LISP?您可以从中调用 LISP 并传入数据,反之亦然。使用遗留代码时,您可以愉快地使用 LISP 的所有现代“豪华”功能。
由于其规范,LISP 具有一致的设计。如果你学习这样一种现代语言,该规范在提供多个后端和编译器方面有很大的作用,它们都以相同的方式解释或编译代码。这些工具都是一流的,1991 年的 LISP 拥有我们今天仍然享受的所有舒适,例如步进调试、数据检查和花哨的编辑器。
作为一种语言,LISP 是完整的。它具有先进的面向对象编程层,多重继承,一流的对象、函数和类型。LISP 似乎是开发人员想要的编程语言。
1991 年,像 LISP 这样的编程语言可能处于有史以来最好的状态。这种技术正确性尚未得到实际使用的证实。LISP 的开发者正在减少。多年来,负面新闻和错误定位阻碍了 LISP 的外部声誉。人们不再将其视为向最终用户交付软件的一种方式。
在开发方面,LISP 经常代表许多与“Big Up”(BDUF)相同的理想。如果你曾经使用过瀑布模型()这样的设计方法,你会发现一些问题。“正确的方式”非常强调一致性和正确性,并确保考虑到所有可以想到的问题。
LISP 本身不是一种语言,而是一个语言家族。虽然 LISP 是作为标准设计的,但 LISP 的实现本身是根据需要完成的各种任务而存在的。Inc网站的一篇文章指出,这种“碎片化”是导致LISP最终失败的决定性因素之一。尽管 LISP 坚持软件设计的“正确方式”,但这种碎片化已经影响了代码的维护和可移植性。
C 和 Unix 是错误的方式
同时,由于Unix的出现,C语言逐渐成为软件开发的首选方法。C语言是为Unix设计的,Unix是为C语言设计的。它的开发人员与麻省理工学院的 LISP 及其作者有着不同的设计立场。
1972 年,C 语言被设计为一种简单的语言。到1991年,它发生了一些变化,但C语言的基本原理没有改变。添加了一些功能以满足开发人员和 Unix 的需求。因为语言非常简单,所以很容易编写编译器和程序。虽然这种语言并不妨碍你进行复杂的编程,但与 LISP 相比,C 语言估计只有程序员需要的 50-80% 的功能。
但是,C语言具有很强的可移植性。与 LISP 软件和环境中常用的硬件相比,它还可以在低功耗硬件上运行。这个因素使得在更广泛的机器上编译和运行软件成为可能。C语言和Unix易于使用。我认为 Unix 和 C 语言会像病毒一样流行起来。
在设计和构建 Unix 的过程中,开发了 C 语言。由于贝尔实验室不允许正式进入计算机领域,Unix 也可以很容易地分发给各种不同的用户。这些用户帮助修补 Unix 以满足他们自己的需求。这些补丁可以根据需求进行集成,无需提前考虑这些需求。
与 LISP 不同,C 语言至今仍被广泛使用。虽然PHP等高级解释语言是很多开发者的首选,但是这些高级语言很多都是用C语言开发的。即使像 Rust 这样的竞争对手开始出现,在小型、低功耗设备上运行的能力仍然是 C 语言的优势。
PHP 是最糟糕的
因此,“越差越好”的软件首先会被接受,其次,它会让用户期望更少,其次,这些软件会不断改进,直到接近“正确的方式”。
——
这个启示几年后,我开始研究个人主页/表单解释器,也就是我们现在所知道的 PHP。PHP/FI 的诞生是因为需要维护他的主页并与表单和数据库进行交互。PHP/FI 甚至不是作为一种实际的编程语言设计的,而是作为 C 语言之上的脚本和函数层。
PHP很简单
无论是实现还是接口,设计都必须简单。
PHP在底层使用了C语言,正如我们之前所说php高级程序设计:模式,框架与测试,这部分是“最糟糕”的部分。但是,这也带来了一些优势,最重要的是,更简单的底层语言可以使其更容易扩展。尽管 Hack/HHVM 使用了更多的 C++ 方法,但 PHP 本身仍然是 C 语言。
您可以在短短几个小时内了解语言的内部结构。我做了一个关于 PHP 扩展的精彩讲座,介绍了很多 PHP 的内部工作原理。这种语言本身借鉴了其他 C 风格的语言,不仅易于阅读,而且可以与其他 C 风格的语言相互转换。
PHP的大部分接口,或者说标准库,都非常简单,因为大部分核心功能无非就是封装了各种C语言库,然后几乎完好无损的公开。虽然这样做会导致界面上的一些不一致,但它为来自 C 或 C++ 的开发人员提供了一个熟悉的环境。
PHP 语言非常专注于 Web 开发。提取 HTTP 中的概念并找到语言中的相似概念通常非常简单。想知道一个请求的头部信息吗?() 可以满足你。获取请求信息就像读取 $_GET 和 $ 全局变量一样简单。
PHP 维护了一个简单的开发人员界面,并使其内部结构尽可能简单。
PHP(几乎)是正确的
在所有可观察的方面,设计必须是正确的。但是为了简单起见,可以稍微牺牲正确性。
在这里,PHP 倾向于选择“简单”而不是正确。在 HHVM 出现之前,语言的外观和特性还没有被标准化。Zend 解释器本身就是规范,语言的行为方式总是“正确的”(不包括实际错误)。如果你想用别的东西替换 PHP 引擎,你必须实现现有引擎的所有功能。
许多核心函数的 LAX 函数参数和返回类型使系统的工作更容易。像 () 这样的函数的返回值可以是整数或布尔值。与严格设计为返回整数或抛出异常的方法相比,它更容易处理。
纵观PHP语言的发展,几乎所有的新特性都是基于开发者的需求,而不是“因为错,所以必须修复”的严肃想法。更多地关注那些严格的类型和异常错误是一种更正确的做事方式。但是,仍然有一些东西,例如短箭头函数()、属性和枚举,开发人员希望简化代码。
PHP不需要一致性
设计不能太不一致。在某些情况下,可以牺牲一致性来保持简单。
我什至不打算假装 PHP 是一致的,但它的一致性就足够了。当涉及到数组和字符串函数时,人们可能会抱怨 / 参数顺序。不过一般来说,数组函数是一致的,字符串函数也是一致的。与底层 C 库保持一致比在语言中保持一致要简单得多。
PHP 在其他方面也足够一致。正如我在 () 中提到的,PHP 倾向于相当一致地返回遇到错误的函数。这可能不正确,但它是一致的。带下划线和不带下划线的函数名称通常与基础库匹配。
为简单起见,PHP 语言牺牲了一致性,但即使没有这个规范,它仍然努力在有意义的地方保持一致。
PHP完整性满足要求
设计必须涵盖尽可能多的重要情况。
每当 PHP 是最苛刻的设计任务:编写 Web 应用程序时,PHP 就完成了。PHP 从来没有被设计为一种可以应用于编程世界中所有问题的语言。尽管如此,它的简单性使其可以在 Web 之外使用。PHP 的最初目的是为 Web 编程提供最基本的功能,这种趋势一直持续到今天。
修改核心语言通常是由开发人员的需求驱动的。整个社区提出修正案,然后通过社区投票,决定拒绝、更改或接受新功能。该语言的许多创新源于快速完成工作的需要。即使我们吸收了其他语言的特性,也是因为它让我们的开发更容易,很少是因为其他语言“做得更正确”。
今天,您可以使用 PHP 开发 Web 应用程序。五年后,您仍然可以使用 PHP 开发 Web 应用程序,但会添加一些新功能。然而,语言本身的完整性已经满足了今天的需求。将来如有必要,我们可以随时修改语言或为其添加新功能。
越差越好吗?
承认“越糟越好”的理念是指设计看起来很糟糕,也许不应该是更好的选择。唯一的问题是,当他审视这两种哲学时,与MIT/“正确方式”的设计哲学相比,“更糟更好”最终仍然是一个更灵活的选择,“具有更好的生存特性”。如果我们查看 PHP,我们可以确认“更糟更好”的观点。
多年来,他承认自己在哪种方式更好之间摇摆不定。PHP 社区一直在争论我们应该正确地做事还是继续简单地做事。我们有这样的框架,我们以经典的计算机科学方式构建库,然后我们有这样的框架,专注于开发人员的体验和速度。PHP 本身两者都有。
下次听到有人骂 PHP 就让他喷吧。这种语言真的很糟糕。但在许多方面,PHP 的长久和广泛使用证明了这样一个事实,即以“正确的方式”做事并不总是比以“最坏”的方式做事更好。当有人抱怨你使用的框架时,你必须明白从长远来看这无关紧要。选择一种您认为适合自己的设计理念,并接受这一点:实际上可能越糟越好。
关于作者:
有多个角色:丈夫、父亲、作家、演讲者、播客主持人和 PHP 开发人员。在他 12 年的编程生涯中,他使用了许多不同的框架和语言,但他一天中的大部分时间都在使用 PHP 和 PHP。他是《for(暂无中文版)》一书的作者,与公司和开发人员合作,将容器集成到他们的工作流程中。
原文链接: