解读 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. windows container 踩坑记

    windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署 ...

  2. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  3. thread学习笔记--BackgroundWorker 类

    背景: 在 WinForms 中,有时要执行耗时的操作,比如统计某个磁盘分区的文件夹或者文件数目,如果分区很大或者文件过多的话,处理不好就会造成“假死”的情况,或者报“线程间操作无效”的异常,或者在该 ...

  4. Lucene05-分词器

    Lucene05-分词器 1.概念 Analyzer(分词器)的作用是把一段文本中的词按规则取出所包含的所有词.对应的是Analyzer类,这是一个抽象类,切分词的具体规则是由子类实现的,所以对于不同 ...

  5. UVA816 Abbott的复仇 Abbott's Revenge

    以此纪念一道用四天时间完结的题 敲了好几次代码的出错点:(以下均为正确做法) memset初始化 真正的出发位置必须找出. 转换东西南北的数组要从0开始. bfs没有初始化第一个d 是否到达要在刚刚取 ...

  6. Scala数据结构

    Scala数据结构 主要的集合特质 Scala同时支持可变集合和不可变集合,优先采用不可变集合.集合主要分为三大类:序列(List),集(set),映射(map).所有的集合都扩展自Iterable特 ...

  7. [小米OJ] 5. 找出旋转有序数列的中间值

    排序,输出 #include <bits/stdc++.h> using namespace std; int main() { string input; while (cin > ...

  8. PHPStrom激活方法【亲测有效2018.4.23】

    直接用浏览器打开 http://idea.lanyus.com/ 点击页面中的"获得注册码", 然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串 ...

  9. 【SVN】SVN使用教程总结

    SVN使用教程总结 SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subve ...

  10. Linux基础之bash shell介绍及基本特性

    今天继续讲Linux基础知识,内容是关于bash shell的.分享以下bash shell的相关知识,例如基本特性等.  1.8)bash shell的介绍 1.8.1)什么是bash shell ...