PHP 是最糟糕的编程语言!你相信吗?
PHP 是一种有趣的编程语言。语言和用语言构建的程序通常分为两种设计理念。这里我指的不是瀑布式或敏捷式的软件开发生命周期,而是软件管理的基本思想。 有些人将这些想法称为“正确的方法”和“越坏越好”。
PHP 包含一些奇怪的问题,许多人因此贬低该语言,但它们也没有错。这种语言有很多问题。有人嘲笑 PHP 糟糕的设计,并提出了一些有效的观点,尽管这些观点是九年前提出的,但这些观点仍然有效。
但是,开发人员可以使用 PHP 来创建“结构正确”的软件,并且它还引入了其他行之有效的实践。您可能遇到过像 Laminas 和 Symfony 这样的框架,它们采用面向对象的编程最佳实践,并允许开发人员编写结构正确的代码。
为什么会出现这种情况?因为PHP是最糟糕的编程语言。
设计软件
1991 年,Richard P. Gabriel 发表了一篇题为 《Lisp: Good News,Bad News, How to Win Big”》 的文章。文章的主题是,对于软件的设计和生命周期来说,“Worse is Better”,这意味着越差越好。他之所以提出这个观点,是因为他意识到存在两种不同的编程流派,他称之为“麻省理工/斯坦福风格”和“正确的方式”。称为新泽西风格,后来更糟糕的是更好)。
两种哲学有相似的目标,但在关键领域有不同的看法。两种风格都侧重于四个关键领域:简单性、正确性、一致性和完整性。
学术风格描述为:
- 简单:设计必须简单,无论是实现还是接口。接口的简单性比实现的简单性更重要。
- 正确性:设计的所有可观察到的方面都必须正确。绝对没有出错的余地。
- 一致性:设计中不应存在不一致之处。为了避免不一致,让设计在简单性和完整性上做出一些妥协。一致性与正确性同样重要。
- 完整性:设计应尽可能涵盖重要情况。必须涵盖所有合理的情况。不允许简单性不必要地降低完整性。
说到新泽西风格,Gabriel 的目标是:
- 简单:设计必须简单,无论是在实现还是界面上。实现的简单性比接口的简单性更重要。简单性是设计中最重要的事情。
- 正确性:设计的所有可观察到的方面都必须正确。但简单性比正确性稍微重要一些。
- 一致性:设计不能太不一致。在某些情况下,可能会为了简单性而牺牲一致性。尽管如此,为了避免引入实现复杂性或不一致,最好在设计中保留不太常见的情况。
- 完整性:设计应尽可能涵盖重要情况。必须涵盖所有合理的情况。但为了其他目标可能会牺牲诚信。事实上,当实施的简单性受到损害时,就必须牺牲完整性。如果能够保持简单性,就可能会为了完整性而牺牲一致性,而接口的一致性尤其毫无价值。
论证的关键是以LISP和C为例来讨论为什么越差越好。 Gabriel 是一名 LISP 程序员,他相信 LISP 比 C 更好。LISP 不仅与 C 一样快,而且 Common LISP 也花了数年时间来设计、开发和标准化。定义该语言的规范充分利用了 LISP 的各个版本,这是最好的现代开发环境之一。
LISP 是正确的方法
LISP 代表了软件开发的“正确方法”。 LISP 易于交互,您可以通过多种方式与其交互。想通过 Fortran 调用 LISP?您可以通过 Fortran 调用 LISP 并传入输入,反之亦然。当使用遗留代码时,您可以享受 LISP 的所有现代功能。
LISP 的规范确保了设计的一致性。如果您查看像 Python 这样的现代语言,您会发现该规范通过提供多个后端和编译器提供了很大帮助,所有后端和编译器都以相同的方式解释或编译代码。 LISP 的工具是一流的,1991 年的 LISP 拥有我们今天仍然享有的所有“优点”,例如逐步调试、数据检查和漂亮的编辑器。
作为一种语言,LISP 是完整的。它具有先进的面向对象编程层、多重继承、一流的对象、函数和类型。 LISP 似乎是开发人员心目中的编程语言。
1991 年是编程语言 LISP 最好的时期。该技术的正确性尚未被实际使用证明。 LISP 的发展正在衰退。多年的负面新闻和定位错误影响了 LISP 的外部声誉,它不再被视为向最终用户提供软件的一种方式。
说到开发,LISP 所倡导的很多理念都与“预先进行大量设计”不谋而合。如果您曾经使用过瀑布模型等设计方法,您就会发现其中的一些问题。 “正确的方法”非常强调一致性、正确性,并确保所有可以想到的问题都得到考虑。
LISP 本身不仅仅是一种语言,它有一个语言家族。尽管 Common LISP 是标准,但 LISP 本身可以用来实现许多基本功能。 Lockless Inc网站上的一篇文章认为,这种差异化是LISP最终失败的决定性原因之一。尽管 LISP 遵循软件设计的“正确方式”,但这种碎片化导致代码的可维护性和可移植性受到损害。
C 和 Unix 是错误的道路
同时,由于 Unix,C 成为软件开发的首选语言。 C 是为 Unix 设计的,而 Unix 是根据 C 设计的。C 的开发人员采用了与 LISP 不同的设计方法。
1972 年,C 还是一门非常简单的编程语言。到1991年,C发生了一些变化,但基本原理保持不变。根据开发人员和 Unix 需求添加功能。编写编译器和程序很容易,因为语言本身非常简单。虽然也可以用C写出复杂的程序,但与LISP相比,估计C只具备程序员想要的50%到80%的功能。不过,
C的便携性却是惊人的。与 LISP 软件和环境中通常使用的硬件相比,C 还可以在功能有限的硬件上运行。因此,C 能够在更广泛的机器上编译和运行软件。 C 软件和 Unix 非常容易运行,以至于 Gabriel 认为 Unix 和 C 会像病毒一样传播。
C 开发始于 Dennis Ritchie 设计和构建 Unix 时。由于贝尔实验室未被正式允许进入计算机领域,Unix 很容易分发给其他各种用户。这些用户修补 Unix 以满足他们的需要。 Dennis Ritchie 能够根据需要合并这些更新,而无需提前考虑这些需求。
与 LISP 不同,C 至今仍被广泛使用。虽然 PHP、JavaScript 和 Python 等高级语言和解释性语言是许多开发人员的首选,但许多高级语言都是用 C 开发的。尽管如今 Rust 等竞争对手兴起,但运行在小型、低功耗设备仍然是 C 的强项。
PHP最差
首先,劣质软件会被接受;第二,用户的期望降低;第三,这个软件可以改进,直到接近“正确”。
——Richard Gabriel
几年后,Rasmus Lerdorf 开始致力于创建个人网站/表单解释器,我们现在称之为 PHP。PHP/FI 的诞生源于 Lerdorf 维护其网站以及与表单和数据库交互的需要。 PHP/FI的设计甚至不是一种编程语言,而是C之上的脚本和函数层。
PHP很简单
设计一定要简单,无论是实现还是接口。
其实PHP底层使用的是C,我们认为这是“最差的”。然而,这提供了一些优点,最重要的是,简单的底层语言更容易扩展。尽管Hack/HHVM使用了更多C++方法,但PHP本身仍然是C语言。
您可以在短短几个小时内了解 PHP 语言的内部工作原理。 Elizabeth Smith 发表了关于 PHP 扩展 (https://www.slideshare.net/auroraeosrose) 的精彩演讲,其中涵盖了 PHP 的大部分内部工作原理。 PHP借鉴了其他C风格语言,不仅阅读方便,而且可以切换到其他C风格系列语言。
PHP的大部分接口或者标准库都非常简单,因为大部分核心功能只是各种C库的包装然后原封不动的暴露出来。虽然这会导致接口不一致,但它也为 C 或 C++ 开发人员提供了熟悉的环境。
PHP语言主要用于Web开发。您可以轻松地在该语言中找到某些 HTTP 概念。想要获取请求的标头吗?您可以直接使用 get_headers() 。您想接收请求信息吗?只需读取全局变量$_GET和$_POST即可。
PHP的界面非常简单,内部结构也非常简单。
PHP(几乎)正确
设计的所有可观察到的方面都必须是正确的。简单性优于正确性。
这里,在简单性和正确性的选择上,PHP更喜欢“简单”。在 HHVM 出现之前,没有关于 PHP 的外观或工作方式的规范。 Zend 解释器本身就是规范,并且语言的行为方式始终是“正确的”(除非出现实际错误)。如果要替换 PHP 引擎,则必须实现该引擎的所有功能。
很多核心函数的参数和返回类型并不是特别严格,主要目的是为了让系统更易用。例如,像 strpos() 这样的函数的返回值可以是整数或布尔值,这比严格设计的返回整数或抛出异常的方法更容易使用。
纵观PHP语言的演变,几乎所有的新功能都是基于开发者的需求,而不是追求“正确性”。更多地关注严格类型和异常错误是更正确的做法。尽管如此,诸如短箭头函数、属性和枚举之类的功能仍然是开发人员希望简化其代码的功能。
PHP 不必保持一致
设计不能太不一致。在某些情况下,可能会为了简单性而牺牲一致性。
我永远不会说PHP是一致的,但它已经足够一致了。当谈到数组和字符串函数时,人们可能会抱怨needle/haystack参数顺序。但总的来说,数组函数是一致的,字符串函数也是一致的。与底层 C 库保持一致比与语言保持一致更容易。
PHP 在其他方面也是一致的。比如strpos()函数,PHP函数遇到错误都会返回FALSE,这一点非常一致。不一定正确,但一致。函数名是否带下划线通常与底层库匹配。
PHP 语言为了简单性而牺牲了一致性,但即使没有规范,它也会努力在有意义的地方保持一致。
PHP的完整性满足一定的要求
设计必须尽可能涵盖重要的情况。
在某些时候,PHP 已达到其应有的完整性,可以完成其设计目的:编写 Web 应用程序。 PHP 的设计目标从来都不是成为解决所有编程问题的一刀切的语言。尽管如此,由于其简单性,PHP 也适合离线编程。 PHP 的最初目的是为 Web 编程提供最基本的功能,并且一直延续到今天。
核心语言的变化主要是由开发人员的需求驱动的。整个社区提出更改建议,社区投票决定新功能是否被拒绝、修改或接受。语言的大部分创新都来自于我们更快地完成工作的需要。即使我们从其他语言中窃取功能,也是因为它们减轻了开发人员的负担,很少是因为另一种语言“更正确”。
您现在可以使用 PHP 构建 Web 应用程序,在接下来的五年中,您将继续使用 PHP 构建 Web 应用程序,但具有一些新功能。但语言本身就实现了所需要的。如有必要,我们可能随时添加新功能或更改语言。
是越差越好吗?
Gabriel 承认,“越差越好”的心态是说设计看起来很糟糕,可能不应该被视为更好的选择。唯一的问题是,审视这两种设计理念,比较学术与现实。 “正确的方式”,那么自然“越差越好”是更灵活的选择,以及“具有更好的生存能力”。看看PHP,它证实了“越差越好”的想法。
在此期间,Gabriel 承认他也很犹豫哪个概念更好。作为一个社区,PHP 一直在争论我们应该做正确的事情还是保持简单的事情。我们有像 Laminas 这样的框架,以经典计算机科学方式构建的库,以及像 Laravel 这样专注于开发人员体验和速度的框架。可以说PHP两者兼而有之。
下次当你听到有人批评 PHP 时,就随他们去吧。 这种语言确实很糟糕,但是PHP的长寿和广泛使用证明了这样一个事实:“正确的方法”并不一定比“最糟糕的”更好。如果有人抱怨您正在使用的框架,请不要担心,从长远来看,这并不重要。更重要的是,选择一个舒适的设计理念,告诉自己“越差越好”。
参考链接:
https://www.phparch.com/2021/09/education-station-php-is-the-worst/
作者 |奥斯卡·梅里达
翻译 |半月 制作者:
| CSDN(ID:CSDNnews)
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。