解读 PHP 的 P++提案
解读 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++提案的更多相关文章
- 2014年辛星完全解读Javascript第一节
***************概述*************** 1.Javascript是一种原型化继承的基于对象的动态类型的脚本语言,它区分大小写,主要运行在客户端,用户即使响应用户的操作并进行数 ...
- Redux 源码解读 —— 从源码开始学 Redux
已经快一年没有碰过 React 全家桶了,最近换了个项目组要用到 React 技术栈,所以最近又复习了一下:捡起旧知识的同时又有了一些新的收获,在这里作文以记之. 在阅读文章之前,最好已经知道如何使用 ...
- HyperLedger Fabric部署与链码解读
1.Fabric简介 Fabric是超级账本中的一个项目,用以推进区块链技术.和其他区块链类似,它也有一个账本,使用智能合约,且是一个参与者可以分别管理自身交易的系统.它是一个联盟链.Fabric与其 ...
- 蒲公英 · JELLY技术周刊 Vol.30: 此路不通?Vue 3 新提案 Ref-sugar
蒲公英 · JELLY技术周刊 Vol.30 随着 Vue 3 发布,相关的新闻也逐渐火热起来,而近期 RFC 中两个新的提案也因为某乎上的一些事情变得广为人关注.Ref sugar和script s ...
- 三万长文50+趣图带你领悟web编程的内功心法:一文带你深入解读HTTP的发展史
看到题目,大家是不是认为根据上一篇(两万字长文50+张趣图带你领悟网络编程的内功心法)一样,其实不然,我们上一边介绍的是网络编程的基本功,有了这些基本功之后,我们就可以在此之上构建更加接近实际应用的w ...
- CVPR2020论文解读:3D Object Detection三维目标检测
CVPR2020论文解读:3D Object Detection三维目标检测 PV-RCNN:Point-Voxel Feature Se tAbstraction for 3D Object Det ...
- CesiumJS 2022^ 源码解读[7] - 3DTiles 的请求、加载处理流程解析
目录 1. 3DTiles 数据集的类型 2. 创建瓦片树 2.1. 请求入口文件 2.2. 创建树结构 2.3. 瓦片缓存机制带来的能力 3. 瓦片树的遍历更新 3.1. 三个大步骤 3.2. 遍历 ...
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- SDWebImage源码解读 之 NSData+ImageContentType
第一篇 前言 从今天开始,我将开启一段源码解读的旅途了.在这里先暂时不透露具体解读的源码到底是哪些?因为也可能随着解读的进行会更改计划.但能够肯定的是,这一系列之中肯定会有Swift版本的代码. 说说 ...
随机推荐
- Python入门基础(2)
如果你是博客园团队,,看到不符合您们要求的地方可否指出来?不要你不符合要求,然后我不符合哪项要求?是要我自己去找么? python条件语句 首先介绍的是if语句,python中的if语句格式如下: i ...
- java中动态代理的使用
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代 ...
- The Summer Training Summary-- the first
The Summer Training Summary-- the first A - vector的使用 UVa 101 关于vector 的几个注意点 vector p p.push_back() ...
- 【HDU - 1560】DNA sequence (dfs+回溯)
DNA sequence 直接中文了 题目描述 21世纪是生物科技飞速发展的时代.我们都知道基因是由DNA组成的,而DNA的基本组成单位是A,C,G,T.在现代生物分子计算中,如何找到DNA之间的最长 ...
- mysql -h139.129.205.80 -p test_db_dzpk < db.dump
mysqldump -h139.129.205.80 -uroot -p db_a > db_dzpk.dump mysql -h139.129.205.80 -p test_db< db ...
- 全栈工程师知识点汇总——html5(上)
一.HTML5 1.新特性: 1. 取消了过时的显示效果标记 <font></font> 和 <center></center> ... 2. 新表单元 ...
- jmeter使用问题——将接口返回变量存储成csv文件
在使用jmeter做接口测试时,一整个jmx测试计划中,存在多个线程,多个接口的测试 但是接口可以分类,比如业务接口.查询接口.更新接口等 考虑自动化接口测试一般都是一次性的,有完整的闭环链路,一般步 ...
- 深入了解数据校验:Java Bean Validation 2.0(JSR380)
每篇一句 吾皇一日不退役,尔等都是臣子 相关阅读 [小家Java]深入了解数据校验(Bean Validation):基础类打点(ValidationProvider.ConstraintDescri ...
- ASP.NET Core 中的管道机制
首先,很感谢在上篇文章 C# 管道式编程 中给我有小额捐助和点赞的朋友们,感谢你们的支持与肯定.希望我的每一次分享都能让彼此获得一些收获,当然如果我有些地方叙述的不正确或不当,还请不客气的指出.好了, ...
- ThinkPHP 入门
ThinkPHP是一个免费.开源的,快速.简单地面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷Web应用开发和简化企业级应用开发而诞生的.ThinkPHP借鉴国外很多优秀的 ...