文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

Slack在多数服务器端应用程序逻辑中使用PHP,这在当时是一个不寻常的选择。为什么我们选择这种语言来创建新项目呢?你应该吗? 

多数程序员都只是随意的使用PHP,只知道关于它的两件事:这是一种糟糕的语言,如果给他们选择的话,他们将永远不会使用它;历史上一些非常卓越的成功项目中使用它。这不是一个矛盾,但是却让我们好奇。Facebook、维基百科、Wordpress、Etsy、百度、盒子和最近的Slack这些成功的网站难道不是因为使用PHP吗?它们会更好的表达它们的应用程序在Ruby中吗?Erlang?Haskell?

第 1 段(可获 1.45 积分)

也许情况不是这样。因为PHP这门编程语言本身有着非常多的缺陷,这毫无疑问会把它这些成就降低许多,但PHP的编程环境有着可以抵消这些缺陷的有点。所以,现今人们对于如何提高PHP的编程语言水平保有非常大的热情。与PHP本身的缺点相反的是,PHP这门语言比其他竞争的变成语言为开发者提供了更多关于新建,改变以及创建一个成功的项目的支持。综合看来,我会毫不犹豫保留一两个项目用PHP语言来进行开发。

背景

与当前流行的编程语言不同,PHP产生于web服务器。PHP的优势大部分在于结果导向和服务端执行的编程环境中。

第 2 段(可获 1.2 积分)

       PHP的含义是“个人主页”。PHP在1995年由Rasms Lerdorf发布初始版本,着眼于支持小型,简单的动态网络应用,例如在网络早期受欢迎的留言板和计数器。

      从PHP发布以来,它一直被用在许许多多复杂的项目之中,这大大超出了PHP创建者们的预期。在此过程中,PHP完成了几个重大的版本更替,每一次的版本更替都给这些更复杂的应用程序带来新的机制。在2016年的今天,PHP凭借着自身丰富的功能,已经是混合范式开发生产语言(MPDPL)这个大家庭的一员,JavaScript,Python,Ruby和Lua也在这个大家庭其中。如果你仅仅只接触过早期版本的PHP,那么最新版本的PHP代码库将会用它保有的特性,包容性以及可造性给你一个大大的惊喜。

 

第 3 段(可获 1.51 积分)

PHP的优点

PHP对有些事情的处理非常深刻,独到,准确。

第一,状态。每一个网页请求都是从一个完完全全的白板开始。除了提供原始功能和生命支持的标准的全局变量,函数和类以外,它的命名空间和全局变量都是未初始化的。通过从已知状态开始每一个请求,我们可以得到一种本质上的故障隔离;如果请求t 遇到了软件的缺陷和失败,这个缺陷不会直接干扰后续的请求t+1。状态驻留在程序堆以为的其他地方,当然它有可能有状态地弄糟数据库,或者缓存,或者文件信息系统。但是PHP和所有允许存在的可能环境分担了它的弱点。隔离请求堆从另一个方面降低了大多数程序缺陷的成本。

第 4 段(可获 1.69 积分)

第二,并发。一个独立的网络请求运行在一个单独的PHP线程上。乍看,这似乎是一个愚蠢的限制。但是一旦你的程序执行在了一个网络服务器的上下文中以后,我们就有了一个可用的自然并发:网络请求。异步地CURL到本地服务(甚至是网络服务)提供了一个开发并行性的无共享,拷入/拷出的方式。在实践中,这对错误来说比大多数其他通用语言提供的锁共享状态方法要更安全,更具有弹性。

最后一个,事实上PHP程序在一个请求级别操作意味着程序员的工作流程是快速而有效的,并保持随着应用的变化而快速变化。许多开发者使用的语言声称是这样,但是如果它们没有为每一个请求重置状态,主事件循环将和请求共享程序级状态,它们几乎总是需要一些启动时间。例如,对一个典型的Python 应用服务,调试周期看起来像这样“想;编辑;重启服务;发送一些测试请求”。即使“重启服务”只花了几秒,但这也会让我们人类有限的大脑为了保持到微妙状态浪费15到30秒的时间。

第 5 段(可获 2.49 积分)

我敢说,PHP简单的“思想,编辑,重新加载页面”周期让开发者更有效率。在一个漫长而复杂的软件项目的生命周期过程中,这提高了生产力。

PHP的缺点

如果上面所说的全都是对的,那为什么还有那么多人不喜欢PHP呢?当你抛开各种各样夸张的说法,对于PHP的抱怨,最多聚集在几个最基本的原因:

1. 未知类型转换。程序员这些天几乎在比较所有的语言,例如整数和浮点数与> =运算符; heck,甚至C都是允许。其意图是完全清楚的。不太清楚的是使用==比较字符串和整数意味着什么,不同的语言做出了不同的选择。 PHP在这个部分的选择是特别不恰当的,这导致了异常和未检测到的错误。例如,123 ==“123foo”求值为true(看看它在这做什么?),但0123 ==“0123foo”是false(hmm)。

2.值语义,引用的不一致。PHP 3有一个明确的语义--赋值,参数传递和返回都是通过值来传递,创建一个问题的数据的浅拷贝。程序员可以选择参考语义与注释[2]。这将与PHP 4和5中引入了面向对象的编程程序冲突。 PHP的面向对象符号大部分是从Java借鉴的,Java具有通过引用处理对象的语义,而基本类型由值来处理。所以PHP的语义的当前状态是对象通过引用传递(选择Java over,比如说C ++),基本类型通过值传递(其中Java,C ++和PHP允许),但是旧的引用语义和&表示法依然保留,有时候与新的方式对接会出现未知的现象。

3.Failure-oblivious哲学。 PHP进行了非常多的尝试来满足运行需求,它甚至做了一些很奇特的事情。例如,除以0不会抛出异常,或返回INF值,或终止请求。默认情况下。它警告并赋值为false。由于false在数值上默认值0,所以许多应用程序在部署和运行中没有检测到除以0的错误。这个特殊的问题在PHP 7中改变了,但是设计的动力是不断的发展,在过去它可能有意义的,也遍及很多的库中。

4.标准库中不一致。在PHP发展初期,其受众者大都熟悉C语言,许多API使用C标准库的设计语言:六个字符的小写名称,成功和失败返回一个整数返回值,返回值为“实数“,返回值由调用者out参数返回等等。随着PHP成熟,通过前缀_命名空间的C风格变得更加普遍:mysql_ ...,json_ ...等等。最近,Java风格的CamelCase类的camelCase方法的已经成为最多的常见的引入新函数的方式。因此,有时我们看到的代码片断交错表达式像新的DirectoryIterator($路径)与if(!($ f = fopen($ p,'w +'))...一个全新的方式。

第 6 段(可获 6.21 积分)

免得我看起来像一个草率的PHP辩护者:这些所有的严重问题使得缺陷更加明显。而且他们都是自然出现的错误。 这里没有很好的权衡PHP的优点和这些缺点。应该构建一个这样的PHP,限制这些缺点的同时保留好的部分。

HHVM 与 Hack

PHP的后继系统称为Hack[3]

Hack是人们称之为PHP的“渐增类型系统”的编程语言。 '类型系统'意味着它允许程序员通过代码编写自动验证不变的数据类型的传递:这个函数接受一个字符串和一个整数,并返回一个Fribbles列表,就像在Java或C ++或Haskell或任何你喜欢的静态类型语言。 '渐进'部分意味着你的代码库的一些部分可以静态类型化,而其他部分仍然是多样的动态的PHP。它们的混合能力使得大代码库的逐步迁移成为可能。
 

第 7 段(可获 2.04 积分)

不是在这里描述Hack的类型系统和它的工作原理, just go play with it.。当你回来的时候我会在这里。

这是一个整洁的系统,并且你可以认为它相当雄心勃勃。可以选择逐步将项目迁移到Hack,以防它比您预期的更好,这是PHP生态系统的独特优势。 Hack的类型检查保留了'think;编辑;重新加载页面“工作流,因为类型检查器在后台运行,在监测到到对文件系统的修改时持续更新其代码库的模型。 Hack项目提供了与所有流行的编辑器和IDE的集成,以便在输入完成后就能立即获得有关类型错误的反馈,就像在Web演示中一样。

第 8 段(可获 1.74 积分)

让我们评估PHP在light of Hack中提出的真正的风险:

  1. 强制类型转换在Hack文件中会报错。整个类的问题将会得到解决。

  2. 引用和值语义通过简单地禁止Hack中的旧式引用来清除,因为它们在新的代码库中是不必要的。这留下了相同的对象引用和所有的else-by-value语义如同Java或C#。

  3. .PHP的failure-obliviousness 更多的是运行时和库的一种属性,并且很难像Hack这样的语义检查器可以直接到达这些系统里。然而,在实践中,许多failure-obliviousness 形式需要未知的类型转换传递到很远。例如,由除以零返回的'false'的问题产生的错误,最后要通过类型检查边界[4],但它将布尔值像数值处理是失败的。这些边界在Hack代码库中更频繁。使编写这些类型变得更为容易,Hack在实践中减少了许多错误执行的“滑动距离”。

  4. 最后,标准库中的不一致仍然存在。Hack最希望做的是使它不那么复杂,把它们包装在更安全的抽象化中。

 

第 9 段(可获 2.3 积分)

Hack提供了一个其他流行的MPDPL成员没有的选项:即在初始开发后引入类型系统的能力,并且它仅限于价值超过成本的系统。

HHVM

Hack 一开始是作为 HipHop 虚拟机(HipHop Virtual Machine) 的一部分而开发的,这个也被称作 HHVM, 它是一个开放源代码的用于PHP的JIT环境。HHVM 为成功的项目提供了另外一个重要的选择,那就是能让你的网站更快且更加经济的运行。Facebook的报告提到PHP解释器的CPU执行效率有11.6倍的提升,而Wikipedia则报告说有6倍的提升。

第 10 段(可获 1.21 积分)

据说最近 Slack 将它的环境迁移到了HHVM ,所有端点的延迟程度都有显著的下降, 但在写这篇文章的时候,我们对此还缺乏对CPU效率一对一的衡量数据。目前我们也正将代码库的一部分挪到 Hack 中去,这一过程中的相关经验将会在这里向大家实时报告。

展望未来

一开始我们提到了PHP是一门被许多成功项目应用到的非常糟糕的语言,这个悖论,而我们发现其糟糕的名声的确实至名归。使用了PHP的这些项目的成功,比起PHP这门语言而言,更多要归功于 PHP 环境的特性,以及其带来的高节奏的工作流。而环境的优势(通过故障隔离降低了BUG所带来的成本,安全的并发以及较高的开发人员工作效率)所带来的价值要比由语言缺陷所造成的问题更加重要。

第 11 段(可获 1.83 积分)

还有一点在 MPDPL 当中比较独特的就是, 以 Hack 和 HHVM 的形式向更高的性能,更安全和更高的可维护性这些方面的迁移,途径是明确的。Slack 目前正处在向 HHVM 过渡的后期阶段,以及向 Hack 过渡的早期阶段,而我们也乐观地认为它们将会让我们的更加快速的产出更好的软件。

注意

  1. 我构造了“MPDPL”这个次。虽然这些语言之间并没有直接的遗传关系,但彼此之间的影响还是很大的。浏览其语法会发现它们大同小异。在包括 MIPS 汇编, Haskell, C++, Forth, 以及 Erlang 这些语言的领域中,很难否认 MPDPL 在语言设计空间中是一个紧密的集合。

  2. 不幸的是 & 被标记在了被调用的一方,而不是发起调用的那一方。因此程序员们都表示希望能通过引用接收参数,但实际上通过引用来传递参数并没有得到重视。这使得在阅读代码时很难去理解什么可能会发生改变,并显得 PHP 的高效实现更加复杂化。见 http://dl.acm.org/citation.cfm?id=2660199 中的图2。 

  3. 是的, Hack 是一个几乎不那么 Google 的编程语言命名。在几乎会让人迷惑的场合,“Hacklang”有时也会被用到。如果 Google 自己就能够用一个仍旧更加不那么 Google 的名字 Go 来命名一种流行的编程语言,为什么不呢? 

  4. Hack 程序中的类型检查在运行时也是默认开启的, 因为它们捎带提供了 PHP 的“类型提示”工具。这个在Hack和经典的PHP代码混合在一起的混合代码库中能提高安全性。

第 12 段(可获 3.1 积分)

文章评论

CY2
请认真对待 Java
青岛访客
老太太过马路我都不服,我就服你
访客
0123按8进制处理是83,'0123foo'和数字比较时,值是123,我觉得这个问题看起来坑,想一下也没啥问题。