PHP 是最糟糕的编程语言?

我已有将近二十年的编程经验,并使用过各种编程语言进行开发。在我以前做过的很多工作和现在正在做的这份工作中,我非常高兴能够将 PHP 作为核心编程语言。从第一次使用 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 易于交互,你可以通过各种方式与它交互。希望从 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 坚持软件设计的“正确的方式”,但是这种碎片化导致代码维护和可移植性都受到了影响。

同时,由于 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 语言的优势。

因此,“更糟就是更好”的软件首先会被接受,其次它会使用户期望更少,第三,这些软件将被不断改进,直到接近“正确的方法”的程度。

——Richard Gabrie

在这一启示的几年后,Rasmus Lerdorf 开始研究个人主页/表单解释器,也就是我们现在所知的 PHP。PHP/FI 的诞生是因为 Lerdorf 需要维护他的主页,并与表单和数据库进行交互。PHP/FI 甚至不是作为一种实际的编程语言设计的,而是作为 C 语言之上的一层脚本和函数设计的。

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

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 倾向于选择“简单”而不是正确。在 HHVM 出现之前,语言的外观和特性一直没有得到规范。Zend 解释器本身就是规范,并且这门语言的行为方式总是 “正确”的(不包括实际的错误)。要想用别的东西代替 PHP 引擎,就必须实现现有引擎的所有特性。

许多核心函数的 LAX 函数参数和返回类型都使得系统的工作更容易。像 strpos() 这样的函数返回值可以是整型数或布尔值,相对于严格设计成返回整型数或抛出异常的方法,处理要稍微容易一些。

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

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

我甚至不打算假装 PHP 是一致的,但是它的一致性已经足够了。当涉及到数组与字符串函数时,人们可能会抱怨 needle/haystack 参数顺序。不过,一般而言,数组函数是一致的,而字符串函数也是一致的。与底层 C 库保持一致比在语言中保持一致要简单得多。

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

为了简单起见, 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/

近 10 年新秀编程语言大 PK,Pick 它

作者 | Andrew Smith

译者 | 明明如月,责编 | 伍杏玲

头图 | 东方 IC

出品 | CSDN(ID:CSDNnews)

编程语言演进的步伐不会停止。尽管 Python、C、Java 等最有影响力的语言已经问世很久,但有价值、新的编码语言还是会一直出现。很多时候正是新编程语言推动了技术的创新,并帮助编写传奇的软件。下面让我们一起看看过去十年中诞生、最具潜力的几个编程语言。

Rust 是 Mozilla 在2010年发布的一种系统编程语言。Rust 被定位为一种非常快速的语言,可以防止内存冲突并保证线程安全。Rust 在语法上类似于 C ++,就速度而言,它可以与 C 或 C++ 相提并论。这意味着用 Rust 编写的应用程序可以和用 C 或 C++ 编写的应用程序一样快,比用其他动态语言编写的应用程序更快。

通过连接不同的编程范例,编程语言允许高层次的抽象,并且依赖于通用于函数式语言的类型系统而不是垃圾收集器来进行内存管理。因此,Rust 编程语言通常用于性能至关重要的项目。特别是,该语言可用于 CLI(调用层接口) 工具和网络服务。

越来越多的公司在使用 Rust。例如亚马逊选择 Rust 来创建不同的工具,Dropbox 在前端和后端开发中使用它,在 Rust Facebook 为源代码控制构建解决方案的帮助下,Red Hat 创建了一个新的存储系统,微软则构建了 Azure 的物联网。Rust 不仅是最流行的编程语言之一,也是最受人喜爱的语言之一。根据最新的 Stack Overflow 调查,73% 的开发者表示他们希望在未来继续使用 Rust。

Dart 是一种面向对象的开源编程语言,Google 在 2011 年创建。Dart 被认为是 JavaScript 的替代品,可以帮助解决长期存在的 Web 语言的一些问题。Dart 主要针对移动设备和网络,最好与跨平台框架 Flutter 结合使用,其实Flutter 也是由 Google 创建的。

2019 年底,Dart 的开发人员发布了新版本——带有 dart2native 的 Dart 2.6,这是其编译器集合的扩展。这个版本为 Flutter 应用程序提供了全面的编译器集,而 dart2native 的目的是为那些拥有包含预编译机器代码的独立可执行程序的开发人员开发更多的平台。

根据 GitHub 最新的 Octovers 报告显示,Dart 和 Flutter 在开发者社区中正变得越来越流行。调查显示,2019年 GitHub 上增长最快的编程语言名单中,Dart 名列榜首,Flutter 在贡献最多的知识库中排名第三,在贡献者增长最快的知识库中排名第二。

Kotlin 是一种跨平台的静态类型编程语言,由 JetBrains 开发,于 2011 年公布。该语言最初是为 Java 虚拟机(JVM)开发的。Kotlin 编写的程序会被翻译成可以被 JVM 读取的字节码。由于代码可以被翻译成 JavaScript,编程语言也适用于 Web。

2016 年,Kotlin 第一个稳定版本面世。2017 年春,谷歌宣布 Kotlin 为 Android 应用程序编程的主要语言。从那时起,许多开发人员开始使用 Kotlin 替代 Java。这确实是有道理的,因为 Kotlin 和 Java 比有许多优势。它更安全、更简洁、加快了开发任务,并且有助于减少代码中的 Bug。是一个非常棒的开发 Android 应用程序的语言,它也允许为 iOS 设计应用程序。这使得用同一种编程语言开发 Android 和 iOS 的移动设备软件成为可能。

Kotlin 有这么多优势,这门语言的受欢迎程度不断上升也就不足为奇了。Stack Overflow 的数据显示,Kotlin 在去年最受欢迎的编程语言中排名第四,也是增长最快的编程语言之一,而 PyPl 在 2019 年最受欢迎的编程语言中排名第12,比前一年上升了 4 位。许多知名的产品如 Coursera、 Netflix、 Uber、 Trello、 Evernote 和 Pinterest 都在他们的软件中使用了 Kotlin。

官网截图

TypeScript 是微软开发的开源编程语言,于 2012 年首次发布。Typescript 是 JavaScript 编程语言的超集,这意味着 TypeScript 可以编译到 JS,并且可以在任何支持 JavaScript 的浏览器和任何 Web 服务器上运行。TypeScript 编程语言是为构建大型应用程序的而准备的。

TypeScript 可以帮助开发人员避免在使用 JS 编写程序时经常遇到的 Bug。不像 JavaScript,只有在运行代码时才能了解错误,TypeScript 允许您更早地报告错误,并使用类型系统更快地创建代码。有趣的是,TypeScript 的静态类型系统是可选的。可以动态编写代码,也可以混合使用这两种类型的代码。编程语言包括不同的有用工具,例如自动完成,它提高了开发人员工作的效率,并使编程过程更加容易。

分析人士指出,TypeScript 的受欢迎程度在不断增长。根据 RedMonk 团队每隔六个月发布一次的编程语言排名,TypeScript “终结了他们所见过的最引人注目的成长故事之一”。

在2019年6月的最新排名中,在程序设计语言的排名从 16 位跃升至12位,首次进入前十位。包括 Avanade 和 Accenture 在内的许多大公司都使用 TypeScript 来实现他们的重要项目,而科技巨头谷歌则选择用 TypeScript 来创建其著名的框架 Angular2 + 。

作为 PHP 的最大用户之一,Facebook 认为 PHP 还有待改进,并创造了替代品。2014年,HipHop 虚拟机(HHVM)的编程语言 Hack 就是这样诞生的。Hack 允许开发人员同时使用动态和静态类型,是一种与其前身 PHP 完全兼容的编程语言。这意味着所有现有的 PHP 项目都可以很容易地转移到 Hack。然后可以用新的语言实现增量的新特性,或者可以重写旧的特性。

应该提到的是,Hack 并不支持 PHP 的某些“不推荐的”特性,尽管它包含了许多 PHP 没有的特性。根据 Hack 的创造者之一 Bryan O’Sullivan 的说法,通过 Hack,你可以得到“安全和速度”。听起来似乎有道理,因为一方面,编程语言允许开发人员编写缺陷较少的代码,并在重新访问时更好地理解代码,另一方面,它提供了这些优势,而不会减慢工程师的工作。

尽管如今你在顶级编程语言中找不到 Hack,一些公司(比如 WordPress 和 Symfony)决定放弃与 HHVM 的兼容性,但它仍有相当大的成功机会。一般来说,这很大程度上取决于它的创建者 Facebook 的支持,这就是为什么 Hack 的未来看起来充满希望的原因。正如 2018 年底宣布的那样,在未来 2 到 3 年内,这种语言应该成为一种一致的、静态类型的语言,展现出动态类型语言的开发速度和用户友好性。

此外,根据 Facebook 的声明,该公司计划增加对 Hack/HHVM Open Source 的投资,以支持现有用户,并围绕该项目建立一个大型社区。

Swift 是苹果公司在 2014 年开发的开源通用编程语言。它通常被称为 Objective-C 的继承者,而 Objective-C 是 macOS 或 iOS 早期编程应用程序的标准。它的语言并不局限于苹果的生态系统,你也可以使用 Swift 为 Linux 创建应用程序。Swift 有一个强大的、静态的类型,并且语法简洁,可读性高。

虽然 Swift 是基于 Objective-C 的,但它更舒适,也更容易使用。Swift 中的变量是类型安全的,语法也大大简化了。Swift 创作者的主要目标之一是为初学者提供轻松的编程入门。为了实现这一目标,苹果公司甚至开发了自己的学习应用“ Swift Playgrounds” ,以一种简单而有趣的方式传达语言的基本知识。

Swift 的优点是应用程序创建的高速度,它吸引了很多开发者的目光。目前,Swift 在 PYPL 排名和 TIOBE 索引中都保持在第 9 位,在 Stack Overflow 最新的编程语言排行榜中也保持第 6 位。

苹果公司最近发布的新版本有许多重大的改进,看来这种编程语言的流行程度还将继续增长。除了 Swift ABI 目前达到的稳定状态外,一种新的错误处理数据类型和独占内存访问扩展也是 Swift 5.0 的新特性之一。

链接:https://dzone.com/articles/top-6-new-programming-languages-born-in-the-last-d

译者:明明如月,知名互联网公司 Java 高级开发工程师,CSDN 博客专家。

本文为 CSDN 翻译,

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。