官方宣布 Perl 7 发行计划
2020-06-27 17:21:24 阿炯

2020年06月25日,Perl 官方宣布了 Perl 7 计划。Perl 7 目前已经在开发中,但是在代码与语法上不会有太大的改变,其本质上是具有现代特性默认设置的 Perl 5,并为之后进行更大的更改奠定基础。


具体来说,新的 Perl 7 实际上约等于刚发行的 Perl 5.32。这里边有个有趣的事实是,Perl 6 已经与 Perl “分家”,并且还变成了名为“Raku”的项目。至于分开 v5 与 v6 的原因,相信大家已经不陌生了:Perl 5 与 Perl 6 存在难以调合的兼容性问题,使得二者基本变成为两种不同的语言,而同样名为 Perl,会让人误以为二者只是版本号上有所不同,这会导致损害 Perl 的形象。由于“Perl” 一词早已普遍被认为是“Perl 5”,因此最终经过讨论,Perl 6 更名了。

Perl 7.0 在 v5.32 的基础上会更合理,具有更现代的默认设置,开发者不必管理太多配置,7.0 中已准备好。目前一些实验性功能可能会稳定下来,但没有大的重写或新特性。

至于模块库 CPAN(Comprehensive Perl Archive Network),已维护模块应该仍然可以在 7.0 中运行,其余的将会有兼容模式,并且会针对几乎所有 CPAN 模块新版本进行测试。而 Perl 7 是否会有单独的 CPAN?这不好说,但是开发人员不想重做可以正常使用的东西,这项变更应该可以通过最少的附带任务进行管理。

Perl 7 会减少什么内容呢?不多。默认情况下,某些功能将被禁用,但其本质上是 Perl 5.32,第一轮可能被削的包括:
间接对象​​符号(indirect object notation)
裸字文件句柄(bareword filehandles),也许标准文件句柄会除外
伪多维数组与哈希(fake multidimensional arrays and hashes),这是旧的 Perl 4 的东西了
Perl 4 样式的原型定义(Perl 4-style prototype definitions),使用:prototype()替代

有趣的是,在官方原博客中,谈及为什么从 Perl 5 跳到 Perl 7 而不是 6 的时候(Perl 6 已经改名,那么“Perl 6”这个代号实际上已经空缺出来了),其表示 Perl 曾经雄心勃勃重写 5.8 的计划没了下文……而下一个可用数字为 7,这只是序列上下一个数而已,进行这样的跳跃并非没有先例:
PHP 直接从 5 升级到 7
Solaris 2.6 跳到 Solaris 7
Java 1.4 跳到 Java 5
Windows 3.1 跳到 Windows 95(98、ME、2000、XP、Vista、7、8 与 10)
……

“至少不是 Perl 34"

最后,Perl 7 有望在一年内发布。Perl 7 是一个新的机会,即使不指定版本,也可以把其中的一些行为变成默认行为。Perl 5 仍然有它的极度向后兼容的行为,但 Perl 7 将以最小的历史包袱获得现代实践的新生。个人希望签名(signatures)功能能够入选到新的版本,但要让 Unicode 成为默认行为还有很多工作要做,所以你可能需要保留其中的一些编译指令:
use utf8;
use open qw(:std :utf8);

可能会丢掉一些你肯定不应该使用的垃圾功能,比如间接对象表示方式,Larry Wall 说他必须为 C++ 程序员做点什么。
my $cgi = new CGI;  # 间接对象,但在 Perl 7 不这样用了
my $cgi = CGI->new; # 直接对象

但是这个功能在 Perl 7 中并没有真正消失。它在 v5.32 中已经可以通过设置关闭了,但现在有了不同的默认行为。Sawyer 谈到了 Perl 用户的三个主要细分市场:
绝不会改变他们的代码的人
使用新功能的人
从零开始的人

Perl 5 的社会契约是极度后向兼容(extreme backward compatibility),并且在这方面取得了惊人的成功。问题是,极度后向兼容对那些不会更新代码的人有效,但对另外两部分人没有帮助。要使用新功能的人不得不在每个程序中加入挺长的例行模板部分,而从零开始的人们则想知道为什么他们创建一个程序就必须包含这么多,才能不让 StackOverflow 上的人因为少了那些编译指令而呵斥他们。


解释型的脚本语言发展势头近年都比较受压

Linux 一直预装 Perl 和 Python,实际上有一个 Posix 规范或其他的要求。不过时代已经变了,主流操作系统都在积极地移除它们。

苹果公司已经正式宣布弃用所有解释器(Perl、Python、Ruby),MacOS 的下一个版本将不再提供这些解释器。RedHat 已经正式宣布,在 RHEL 8 和未来的版本中将不再提供开箱即用的 Python。

2021年6月,有用户在 Apple 开发者社区提问 macOS 12 似乎缺少了 PHP,负责开发者工具的工程师回复称:“macOS Monterey 已移除 PHP”。其实早在 Xcode 11 的发行说明中就已进行过提示:“macOS 中包含 Python、Ruby 和 Perl 等脚本语言运行时以与旧软件兼容。在未来版本的 macOS 中,默认情况下将不提供脚本语言运行时,并且可能需要使用者安装额外的软件包。如果有软件依赖于脚本语言,建议在应用程序中绑定运行时”。


Perl 指导委员会谈发展战略: Perl 7 没那么快发布

2022年5月下旬消息,随着 Perl 5.36 即将发布,Perl 指导委员会在一篇博客中谈论了 Perl 语言当前的发展策略以及未来的发展计划,同时也解答了一些常见的问题。

谁在决定 Perl 的方向?

2020 年 6 月,Perl 官方宣布 Perl 7 计划。Perl 7 的一个关键想法是通过启用许多广泛使用的模块/编译指示,来减少代码顶部所需的样板,但这将以破坏一些向后兼容性为代价。该想法引发了很多激烈的讨论,有些人认为抛弃 Perl 的关键优势 “向后兼容性” 是非常糟糕的想法,另一些人则认为墨守成规得不到更好的发展。

这些讨论引发了另一个新问题:谁有权利决定 Perl 的发展方向和具体计划?原作者 Larry Wall ?但他已经有近 20 年没有参与 Perl 的开发了。最终,社区在讨论之后创建了一个新的治理结构 :为 Perl 5 作出最多贡献的核心团队通过选举推出三个人,这三个人组成的 Perl 指导委员会 (PSC) 拥有 Perl 未来的最终决策权。

Perl 当前发展战略

第一届 PSC 在 2020 年底当选,随后为 Perl 制定了如下的战略:
现有的合理编写的 Perl 5 代码应该能在未来的 Perl 版本下继续运行(继续保持向后兼容性)。但有时这是不可能的,比如某些安全漏洞可能需要破坏向后兼容性的更改才能修复。
推动语言向前发展,提高引入新功能的速度。所以引入了 RFC 流程,任何人都可以使用该流程来对 Perl 语言提出修改。
让人们更容易使用这些新功能。

该策略的核心是功能保护和版本包捆绑。

特性保护

如果一个新的语言特性不能向后兼容,那么它就会受到 “特性保护” 的保护。比如 ,Perl 5.010 引入了 say 关键字。但默认情况下无法启用它,因为有人可能在代码中有一个 say 函数,那么新的关键字就会与之冲突。因此需要用到 feature pragma (编译指示功能):

use feature 'say';
say "hello, world";

但并不是所有的新语言特性都有保护。如果新的语法,在所有旧版本的 Perl 中都会导致语法错误,那么就不需要保护了。例如,Perl 5.36.0 引入了新的语法,允许一次从一个列表中处理 N 项:

foreach my ($key, $value) (%hash) {

}

这个新语法没有特性保护,所以可以在第 0 行使用 (即在  use v5.36 之前)。

版本包捆绑

Perl 5.36.0 引入了版本包捆绑(Version bundles)功能,解决了 Perl 被诟病已久的 “样板文件” 问题。该功能只需将这一行放在代码顶部:
use v5.36;

这一行相当于以前的:
require v5.36;
use strict;
use warnings;
use feature 'say';
use feature 'state';
use feature 'current_sub';
use feature 'fc';
use feature 'lexical_subs';
use feature 'signatures';
use feature 'isa';
use feature 'bareword_filehandles';
use feature 'bitwise';
use feature 'evalbytes';
use feature 'postderef_qq';
use feature 'unicode_eval';
use feature 'unicode_strings';
no feature 'indirect';
no feature 'multidimensional';

也就是说,版本包捆绑功能,让开发者使用简单的 use v...;  语句即可达成这些效果:
告诉 perl 解释器和人类读者,当前代码需要 perl 5.36.0 或更高版本才能运行;
支持当前版本 Perl 提供的所有非实验性功能;
使用了许多已被广泛实践过的附加编译指示。

该功能极大地减少了在代码顶部编写的样板文件,解决了 Perl 这个诟病已久的问题。

Perl 7 咋样了?

目前Perl的计划是继续引入新功能,并解决所有现有的实验性功能,实验性功能要么被删除,要么成为非实验性功能(包含在版本包捆绑中)。

在未来的某个时候,Perl 指导委员会可能会认为:这些新的功能加在一起,代表了一个足够大的进步,足以证明 Perl 的新方向是正确的。如果发生这种情况,那么 Perl 版本将被提升到 7.0。

我们有很多好的想法在工作中,如果我们能够保持去年的势头,那么事情看起来很有希望。与此同时,我们将继续发布 5.XX 版本。

即使 Perl 版本将被提升到 7.0,默认情况下 Perl 7 仍将向后兼容 Perl 5 —— 必须将 use v7; 放在代码顶部,才能使用 V7 所有新功能。

感兴趣的朋友可以移步 Perl 指导委员会的博客作进一步阅读。