天涯论坛

 找回密码
 立即注册
搜索
查看: 13|回复: 1

PHP 是最糟糕的编程语言?

[复制链接]

3047

主题

3万

回帖

9606万

积分

论坛元老

Rank: 8Rank: 8

积分
96065852
发表于 2024-11-3 07:22:43 | 显示全部楼层 |阅读模式

我已有将近二十年的编程经验,并运用各样编程语言进行研发。在我以前做过的非常多工作和此刻正在做的这份工作中,我非常高兴能够将 PHP 做为核心编程语言。从第1运用 PHP 工作起始,我就听到了关于 PHP 的各样抱怨,但与此同期看到了 PHP 的威力。

本文最初发布于 PHPArch 网站 ,经原作者 Chris Tankersley 授权,InfoQ 中文站翻译并分享。

PHP 最少是一门有趣的编程语言。这门语言和用它构建的程序一般属于两种设计哲学。在这儿,我所说的并非软件研发生命周期,如瀑布或敏捷,而是关于软件应该是什么样的基本思想。这些思想被叫作为“正确的方式”(The Right Way)和 “更糟便是更好”(Worse is better)。

PHP 又是一门相当奇怪的编程语言。当人们抱怨这门语言“很槽糕”时,她们说错。这门语言确实有非常多欠好地区。搁在以前,这门语言还有更加多糟糕的问题。嘲笑 PHP 的博文《全面解析 PHP 的槽糕设计》(PHP: a fractal of bad design)确实有几个正确的观点,即使这些观点在九年前发布时就已然过时了。

然而,与此同期研发人员却能够利用 PHP 创建结构上“正确”的软件,并从其他语言中引入被视为良好实践的哲学。像 Laminas 和 Symfony 这般的框架就运用了面向对象编程的最佳实践,使研发能够用这些框架编写结构正确的代码。

PHP 是怎么做到这些的?这是由于 PHP 是最糟糕的编程语言。

设计软件

1991 年,Richard P. Gabriel 发布了一篇文案《Lisp:好信息,坏信息怎样赢得大》(Lisp: Good News, Bad News, How to Win Big)。这篇文案的论点是,在软件设计和寿命方面,“更糟便是更好”的哲学将是更好的选取。他之因此得出这一结论,是由于认识显现了两种区别的程序设计流派,他分别将之命名为“麻省理工学院/斯坦福风格”(MIT/Standford Style),“正确的方式”,以及“新泽西风格”(New Jersey Style“更糟便是更好”。

这两种哲学的目的类似,但在关键行业却有所区别。两种风格都侧重于哲学理念的四个关键行业:简单性(Simplicity)、正确性(Correctness)、一致性(Consistency)和完整性(Completeness)。

麻省理工学院风格是这般描述的:

简单性:设计必定要简单,不论它的实现还是接口,都必定要简单。相较而言,让接口保持简单更重要。正确性:在所有能够观察到的方方面面,设计必定要正确。不要妄想做一个不正确的设计。一致性: 设计必定不可是不一致的。为了保证一致性,你能够略微牺牲简单性和完整性。一致性和正确性同等重要。完整性:设计必定要尽可能多地涵盖重要的状况。所有符合预期的情况必定要被覆盖到。完整性优先级应该高于简单性。

至于新泽西风格,Gabriel 说,它将其目的定义为:

简单性:设计必定要简单,不论它的实现还是接口,都必定要简单。而相较而言,让实现保持简单更重要。简单是最重要的,其他的特性都不如保持简单更重要。正确性:在所有能够观察到的方面,设计必定要正确。然则能够为了简单而轻微牺牲正确性。一致性:设计必定不可太过不一致。某些状况下,为了保准简单能够牺牲一致性。倘若将某个不平常状况引入设计,会引起实现变繁杂不一致,那样就不要思虑这种状况完整性:设计必定要尽可能多地涵盖重要的状况。所有符合预期的状况必定要被覆盖到。完整性能够为任何其他特性让步。实质上,一旦威胁到实现的简单性,完整性必须要被牺牲。倘若为了保持简单,能够牺牲一致性来实现完整性;尤其是接口的一致性。

这场争论的关键是用 LISP 和 C 做为例子来讲为何“更糟便是更好”。针对 LISP 程序员 Gabriel 来讲,LISP 是一种比 C 更好的语言,速度和 C 同样快,况且 Common LISP 的设计、研发和标准化已然花了非常多年。定义该语言的规范吸取了所有区别的 LISP 的精华,而现代研发环境针对 LISP 研发来讲是最好的。

LISP 是正确的方式

LISP 表率了软件研发的“正确的方式”。LISP 易于交互,你能够经过各样方式与它交互。期盼从 Fortran 中调用 LISP?你能够从 Fortran 中调用 LISP 并将数据传入,反之然。在运用遗留代码时,你能够愉快地运用 LISP 的所有现代“豪气”特性。

LISP 持有一致的设计,这得益于它的规范。假如你科研一下 Python 这般的现代语言,规范在供给多个后端和编译器方面有很大的功效况且它们都以一样的方式解释或编译代码。这些工具是一流的,1991 年的 LISP 持有咱们今天仍然享受的所有舒适,例如过程调试、数据检测和花哨的编辑器。

做为一种语言,LISP 是完备的。它拥有先进的面向对象编程层、多重继承、一流的对象以及函数和类型。LISP 似乎是研发人员心中想要的编程语言。

1991 年,LISP 这么编程语言可能处在有史败兴的最佳状态。这种技术上的正确性并实质运用所证实。LISP 的研发商正在衰退。数年消极资讯和错误定位阻碍了 LISP 的外边声誉。人们再也不将其视为向最后用户交付软件的方式。

研发而言,LISP 常常表率着许多与“大规模预先设计”(Big Design Up Front,BDUF)同样的理想。假如你曾经运用过瀑布模型(Waterfall Model)这般的设计办法,你就会发掘有些问题。“正确的方式”非常强调一致性、正确性,并保证思虑到所有能想到的问题。

LISP 本身并非一种单一的语言,而是一个语言家族。尽管 Common LISP 被设计成一种标准,然则 LISP 本身的实现方式是按照需要完成的各样工作而存在的。Lockless 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 很容易运用,Gabriel 认为 Unix 和 C 语言会像病毒同样流行起来。

在 Dennis Ritchie 设计和构建 Unix 的过程中,C 语言得到了发展。由于贝尔实验室(Bell Labs)不被准许正式进入计算机行业因此 Unix 能够容易地分发给各样区别的用户。这些用户帮忙修补 Unix 以满足她们自己的需要。Dennis Ritchie 能够按照需要将这些补丁整合在一块,而不必事先思虑这些需要

与 LISP 区别,C 迄今仍然被海量运用。尽管高级的解释性语言,如 PHP、JavaScript 和 Python 是许多研发者的首选,然则这些高级语言非常多都是用 C 语言研发的。即使像 Rust 这般的竞争对手起始崭露头角,但能够在小型低功率设备上运行仍然是 C 语言的优良

PHP 是最槽糕的

因此呢,“更糟便是更好”的软件首要会被接受,其次它会运用户期望更少,第三,这些软件将被持续改进,直到接近“正确的办法”的程度。

——Richard Gabrie

在这一启示的几年后,Rasmus Lerdorf 起始科研个人主页/表单解释器,便是咱们此刻所知的 PHP。PHP/FI 的诞生是由于 Lerdorf 需要守护他的主页,并与表单和数据库进行交互。PHP/FI 乃至不是做为一种实质的编程语言设计的,而是做为 C 语言之上的一层脚本和函数设计的。

PHP 很简单

设计必定要简单,不论是它的实现还是接口。

PHP 底层运用了 C 语言,咱们之前已然说过,这部分是“最糟糕的”。然而,这带来了有些优良,最重要的是,更简单的底层语言能够让它更易扩展。虽然 Hack/HHVM 采用了更加多的 C++ 办法,但 PHP 本身仍然是 C 语言。

只需短短几个小时就能学完这门语言的内部结构。Elizabeth Smith 发布过一篇关于 PHP 扩展的精彩演讲,其中间商绍了海量关于 PHP 的内部工作原理。这门语言本身借鉴了其他 C 风格的语言,不仅易于阅读,并且能够跟 C 风格的其他语言互相转换。

PHP 的大都数接口,说标准库,都非常简单,由于都数核心功能都只不外是包装了各样 C 语言库,而后几乎原封不动地公开出来。尽管这般做会引起接口上的有些不一致,然则它为来自 C 或 C++ 的研发供给了一个熟练的环境。

PHP 语言非常注重于 Web 研发。将 HTTP 中的概念提取出来并在语言中找到类似的概念一般非常简单。期盼认识一个请求的头信息吗?get_headers() 就能满足你。获取请求信息就像读取 $_GET 和 $_POST 全局变量同样简单。

PHP 保持了简单的研发者接口,并且尽可能地保持内部结构的简单。

PHP(几乎)是正确的

在所有能够观察到的方面,设计必定要正确。然则能够为了简单性而轻微牺牲正确性。

这儿,PHP 倾向于选取“简单”而不是正确。在 HHVM 显现之前,语言的外观和特性始终得到规范。Zend 解释器本身便是规范,并且这门语言的行径方式总是 “正确”的(不包含实质的错误)。想要用别的东西代替 PHP 引擎,就必须实现现有引擎的所有特性。

许多核心函数的 LAX 函数参数和返回类型都使得系统的工作更易。像 strpos() 这般的函数返回值能够是整型数或布尔值,相针对严格设计成返回整型数或抛出反常办法,处理要稍微容易有些

看 PHP 语言的发展,几乎所有新特性都是创立研发人员需要的基本上,而不是“由于它错了因此必须修复”的严肃想法。更加多地关注那些严格类型和反常错误是一种更正确的办事办法。然而,还有有些东西,例如简短的箭头函数(arrow function)、属性和枚举,才是研发者想要用来简化代码的东西。

PHP 不需要一致性

设计必定不可太过不一致。某些状况下,为了保持简单能够牺牲一致性。

乃至不打算假装 PHP 是一致的,然则它的一致性已然足够了。当触及到数组与字符串函数时,人们可能会抱怨 needle/haystack 参数次序不外通常而言,数组函数是一致的,而字符串函数是一致的。与底层 C 库保持一致比在语言中保持一致要简单得多。

PHP 在其他方面足够一致。正如我在 strpos() 中说到的,PHP 针对遇到错误的函数往往会相当一致地返回 FALSE。这未必是正确的,但它却是一致的。带下划线和不带下划线的函数名一般都会匹配其基本库。

为了简单起见, PHP 语言牺牲了一致性,然则即使这个规范,它仍然奋斗在有道理地区保持一致。

PHP 的完整性符合所需

设计必定要尽可能多地涵盖重要的状况

无论何时,在针对 PHP 需求最大的设计任务:编写 Web 应用程序时,PHP 都是完备的。PHP 从未被设计成一种能够适用于编程世界所有问题的语言。尽管如此,它的简单性还是使它能够用于 Web 以外的场合。PHP 最初的目的便是为 Web 编程供给最基本的功能,这一趋势始终连续迄今

修改核心语言一般是由于研发人员的需要驱动。整个社区提出修改意见,而后经由社区投票,决定新特性被拒绝、改变接受。该语言的许多创新都源于快速完成工作的需要。即便咱们吸收了其它语言的功能,由于它使咱们研发变得简单,而很少是由于其他语言做得“更正确”。

今天,你能够用 PHP 研发 Web 应用程序。五年后,你仍然能够用 PHP 研发 Web 应用程序,只不外增多有些新特性。然则,语言本身的完整性已然符合今天所需。倘若将来有需要,咱们能够随时修改语言或为它添加新功能。

更糟便是更好吗?

Gabriel 承认,“更糟便是更好”的哲学指的是设计看起来很糟糕,不该做为更好的选取独一的问题是,当他审视这两种哲学时,与麻省理工学院/“正确的方式”的设计哲学相比,“更糟便是更好”最后仍然是更灵活的选取,“拥有更好的存活特性”。倘若咱们看一下 PHP,就能够证实“更糟便是更好”这一观点。

这些年来,Gabriel 承认他在哪种方式更好之间摇摆不定。PHP 社区始终在争论咱们是应该正确地办事还是继续简单地办事咱们有像 Laminas 这般的框架,以经典的计算机科学方式构建库,而后咱们有像 Laravel 这般的框架,关注研发者的体验和速度。PHP 本身二者兼具。

下次再听到有人骂 PHP 的时候,就随他喷去吧。这门语言确实很糟糕。但从许多方面来看,PHP 的长寿和广泛运用证明了这般一个事实:用“正确的方式”办事并不总是比用“最糟糕”的方式办事好。当有人吐槽你正在运用的框架时,你要明白从长远来看这并不重要。选取一种你认为适合自己的设计哲学,并欣然接受这一点:更糟的可能实质上更好。

作者介绍:

Chris Tankersley 持有多种角色:丈夫、父亲、作家、演讲家、播客主持人和 PHP 研发者。Chris 在 12 年的编程生涯中运用非常多区别的框架和语言,然则他一天的大部分时间都在运用 PHP 和 Python。他是《Docker for Developers(尚无中文版)的作者,并与机构研发者合作,将容器整合到她们的工作流中。

原文链接:

https://www.phparch.com/2021/09/education-station-php-is-the-worst/





上一篇:简历中最难写的部分是什么?应该怎么写?
下一篇:什么是PHP?PHP培训都学什么?
回复

使用道具 举报

2949

主题

3万

回帖

9997万

积分

论坛元老

Rank: 8Rank: 8

积分
99979417
发表于 2024-11-6 15:36:55 | 显示全部楼层
楼主的文章深得我心,表示由衷的感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 10:58 , Processed in 0.114565 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.