解读 PHP 的 P++提案

周末看到一篇文章说 PHP 创始人提议将 PHP 拉出新分支,创建 P++ 语言。随后阅读了一下 Zeev Suraski 发起的这个邮件列表,大致了解了一下,这里做个解读。

Zeev Suraski 就是几周前爆出的 PHP 核心开发者从 Zend 公司离职消息里面的主角。Zeev 是以色列的开发者。它也是 Zend 公司的联合创始人。登陆它的 twitter 上看,它的 twitter 封面有个可爱的女儿,看来外国人也是很爱在社交账号晒女儿的。

其实 PHP 现在大都由社区进行维护了,Zeev 的离职并不一定会有多少影响。

但是这次 Zeev Suraski 在社区中提的这个方案就引起了不少的反响。https://wiki.php.net/pplusplus/faq。 我们可以通过里面的internal邮件 https://marc.info/?l=php-internals&m=156529545007909&w=2 查看整个邮件线。

P++的方案

Zeev 的这封邮件的标题很有意思: Bringing Peace to the Galaxy。它希望这个idea 能给社区的强弱类型的争端带来和平,希望能解决强弱类型问题的争论。

基本上 Zeev 是从如何发展 PHP 的角度考虑。现在 PHP 最大的分歧就是是维护动态语言,还是逐渐加入强类型的特性。基本上,如果要增加一些静态语言的类型声明和验证,PHP 的向下兼容性是得不到保证的。但是随着 Rust, Go 等语言的冲击,有一部分开发者逐渐倾向于使用一些强类型的特性。

那么 Zeev 就认为,与其不断在现有的 PHP 版本上对每个特性讨论强弱类型的兼容性,我不如让 PHP 可以支持另外一种“新语法” P++。当然这个 P++ 只是暂定的。在 Zeev 的思考中,它认为 P++ 是一种增强型语言,但是和 PHP 是共存的。它们的调用关系就是 C 和 C++ 的关系,C++ 并不对 C 的所有语法兼容,而是C++ 中是可以调用 C 代码的。换句话说,它觉得我们可以在一个代码文件中共存两种语法的代码段。可能示例如下:

<?php
xxx
?> <?p++
?>

这样做的好处有几个,首先 PHP 的适用人群扩大了,它满足了不同开发者的不同口味。其次,一些新的特性不用再考虑向下兼容性了。在 P++ 中开发的特性等于是从头开始开发,并不需要考虑 PHP 若干版本的历史兼容问题。会解放新特性的开发进度。

所以说,Zeev 并不是要开发一个新语言,也不是要从 PHP 分支 fork 出一个分支,更像是要创建一种新的语法分支,这个分支我理解主要是针对强类型限制的。而这个语法分支和原先的 PHP 是在同一份代码内。并且随着每次 PHP 的版本,原先弱类型的 PHP和 新类型的 P++ 都会进行修复和增加。

另一种方案

但是紧跟着 Zeev 的这个邮件,Nikita Popov 回复了这个邮件,它提出了反对的声音,并且提出了自己的解决方法。

Nikita 的解决方法是参照 Rust 的版本管理,Rust 基本 2-3 年发布一个大版本,但是 Rust 的编译器能编译所有版本的代码,所以每次发布新版本的时候,如果你的代码是旧版本的,那么还可以继续编译,且不会和新特性有冲突。 https://doc.rust-lang.org/edition-guide/editions/index.html#what-are-editions。Rust 到如今有两个大版本了,2015版本和2018版本。

可以想象,如果引入 Nikita 的这种方式,需要在每个代码文件中(或者粒度更细,到代码块)中标记 PHP 的大版本版本号,比如用年号作为大版本号,今年2019是第一版本,也是默认版本,过两年2021是第二版本。

Nikita 的这种方式目的是保持单一的 PHP 的语法分支,并且新特性也是不需要考虑向下兼容问题。比如假设有2019版本和2021两个 PHP版本。2021版本中语言的新特性在2019版本中是无法使用的。如果你想要使用这些新版本,开发者需要主动做升级修改。(可以想象到时候会有一些自动升级的脚本)。但是如果你不想要修改,那么就在你的所有文件(或者配置)中说明我的项目使用的是2019版本(即使你现在使用的是 PHP 程序的版本是2021)。

后续

这封邮件后续的反馈基本都是针对这两种方案展开的。Zeev 的方案基本的缺点就是需要维护两个语言特性的分支,对于有限的语言开发者资源来说,是很吃力的。不少人会担心最后演变成为 Python2 和 Python3 的现状,长期无法合并。而且需要开发者在是使用PHP 语法还是P++ 语法做选择。而 Nikita 的方案更有版本迭代的意味。

我个人更站边 Nikita的这种升级,我觉得这种方案会有一种趋向性,最终大家会渐渐升级到新版本。且更容易落地,开发者只需要维护一套语言特性(相比于 Zeev 的方案更容易落地)。而 Zeev 的这种方案总是会给人一种老版本的 PHP 不想再去增加新特性,所有新特性都加在 P++ 这边更好的感觉。渐行渐远,我感觉最终还真会演变成大家都在开发新语言的态势。

参考资料

https://marc.info/?l=php-internals&m=156535343921170&w=2

https://doc.rust-lang.org/edition-guide/editions/index.html#what-are-editions

https://nikic.github.io/

https://www.oschina.net/news/108717/zeev-leave-zend

解读 PHP 的 P++提案的更多相关文章

  1. 2014年辛星完全解读Javascript第一节

    ***************概述*************** 1.Javascript是一种原型化继承的基于对象的动态类型的脚本语言,它区分大小写,主要运行在客户端,用户即使响应用户的操作并进行数 ...

  2. Redux 源码解读 —— 从源码开始学 Redux

    已经快一年没有碰过 React 全家桶了,最近换了个项目组要用到 React 技术栈,所以最近又复习了一下:捡起旧知识的同时又有了一些新的收获,在这里作文以记之. 在阅读文章之前,最好已经知道如何使用 ...

  3. HyperLedger Fabric部署与链码解读

    1.Fabric简介 Fabric是超级账本中的一个项目,用以推进区块链技术.和其他区块链类似,它也有一个账本,使用智能合约,且是一个参与者可以分别管理自身交易的系统.它是一个联盟链.Fabric与其 ...

  4. 蒲公英 · JELLY技术周刊 Vol.30: 此路不通?Vue 3 新提案 Ref-sugar

    蒲公英 · JELLY技术周刊 Vol.30 随着 Vue 3 发布,相关的新闻也逐渐火热起来,而近期 RFC 中两个新的提案也因为某乎上的一些事情变得广为人关注.Ref sugar和script s ...

  5. 三万长文50+趣图带你领悟web编程的内功心法:一文带你深入解读HTTP的发展史

    看到题目,大家是不是认为根据上一篇(两万字长文50+张趣图带你领悟网络编程的内功心法)一样,其实不然,我们上一边介绍的是网络编程的基本功,有了这些基本功之后,我们就可以在此之上构建更加接近实际应用的w ...

  6. CVPR2020论文解读:3D Object Detection三维目标检测

    CVPR2020论文解读:3D Object Detection三维目标检测 PV-RCNN:Point-Voxel Feature Se tAbstraction for 3D Object Det ...

  7. CesiumJS 2022^ 源码解读[7] - 3DTiles 的请求、加载处理流程解析

    目录 1. 3DTiles 数据集的类型 2. 创建瓦片树 2.1. 请求入口文件 2.2. 创建树结构 2.3. 瓦片缓存机制带来的能力 3. 瓦片树的遍历更新 3.1. 三个大步骤 3.2. 遍历 ...

  8. SDWebImage源码解读之SDWebImageDownloaderOperation

    第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...

  9. SDWebImage源码解读 之 NSData+ImageContentType

    第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...

随机推荐

  1. redis 命令的调用过程

    参考文献: Redis 是如何处理命令的(客户端) 我是如何通过添加一条命令学习redis源码的 从零开始写redis客户端(deerlet-redis-client)之路--第一个纠结很久的问题,r ...

  2. Django项目的创建和管理

    1.主题 这部分教程主要介绍如何通过Pycharm创建.管理.运行一个Django工程.对于Django模块的相关知识大家可以参考Python社区. 2.准备环境 Django版本为2.0或更高 Py ...

  3. .NET项目迁移到.NET Core操作指南

    为什么要从.NET迁移到.NET Core? .NET Core提供的特性 .NET Core性能提升 .NET如何迁移到.NET Core? 迁移工作量评估(API兼容性分析) 迁移方案制定 通过类 ...

  4. java集合框架使用原理分析

    集合是我们日常编程中可能用的很多的技术之一 使用频率极高 可能平时就会知道怎么去用 但是集合之间的关系与不同之处都不是很清楚 对它们的底层原理更甚 所以写词文章 让自己有一个更深的认识 集合是一个庞大 ...

  5. .Net微信网页开发之JSSDK使用步骤和配置信息timestamp(时间戳),nonceStr(随机串),signature(签名),access_token(接口调用凭据)的生成获取讲解

    前言: 因为接下来会有几篇关于微信JS-SDK功能使用的文章,主要会对微信分享,获取设备信息,获取地理位置,微信扫一扫这几个功能进行讲解.而这几个功能都是围绕着微信JS-SDK实现的,首先使用微信JS ...

  6. 1.svn 彻底clear时,注意代码备份 2.借助vc助手加头文件

    1.svn 彻底clear时,注意代码备份 2.不小心彻底clear可以在回收站找到 3.借助vc助手加头文件

  7. JAVA获取公网ip

    在ipv4地址稀缺的今天,分配到公网ip几乎是不可能的,但是我拨号之后的ip竟然是公网IP. 将自己的电脑作为服务器·,做点好玩的程序,就成为了可能. 由于运营商的ip是动态分配的公网ip的所以就需要 ...

  8. html提示框插件

    最近工作需要,用到各式各样的提示框,寻找了很久,发现一个的第三方的插件很好用,各种样式.接口良好.允许自定义. 官网:http://layer.layui.com/ 使用需要先引入jq1.8以上: & ...

  9. HashSet源码分析:JDK源码系列

    1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...

  10. android异常 More than one file was found with OS independent path 'META-INF/XXX'

    android 异常总结:一个文件在jar包中出现多次. Error:Execution failed for task ':app:transformResourcesWithMergeJavaRe ...