宣布 Perl 7

图片来源: Darren Wood,Flickr上的“7”。
今天上午在云端Perl大会上,Sawyer X 宣布了 Perl 前进的新计划。Perl 7 的开发工作已经展开,但这不会在代码或语法上带来巨大变化。它是带有现代默认设置的 Perl 5,并为未来的更大变化奠定了基础。我的新书《为 Perl 7 准备》将详细介绍这些内容。
Perl 7 将主要基于 Perl 5.32
Perl 7.0 将基于 v5.32,但拥有不同、更合理、更现代的默认设置。您不需要启用大多数您已经做的事情,因为它们已经为您启用。主要版本跳跃设定了我们过去如何做事与未来可以做什么之间的边界。
记住,Perl 是一种“做我所想”的语言,其默认设置可能正是您想要的。在 Perl 4 和 Perl 5 的早期,那很简单。但是,现在已经过去了几十年,世界变得更加复杂。我们不断添加了约定,但是由于 Perl 对向后兼容性的承诺,我们无法更改默认设置。现在我们回到了 C 语言的老日子,在开始做任何事情之前,我们必须包含大量的模板代码
use utf8;
use strict;
use warnings;
use open qw(:std :utf8);
no feature qw(indirect);
use feature qw(signatures);
no warnings qw(experimental::signatures);
在 v5.12 及以后的版本中,这会略有改善,因为我们通过设置最小版本,可以免费获得 strict
设置
use v5.32;
use utf8;
use warnings;
use open qw(:std :utf8);
no feature qw(indirect);
use feature qw(signatures);
no warnings qw(experimental::signatures);
Perl 7 是一个机会,可以在不指定版本的情况下将这些设置为默认值。Perl 5 仍然具有 Perl 5 的极端向后兼容性行为,但 Perl 7 则带有更现代的实践和最少的遗留问题。我个人的希望是签名能够被选中,但还有许多工作要做,以便使 Unicode 成为默认设置,因此您可能需要保留一些
use utf8;
use open qw(:std :utf8);
您可能会错过一些您根本不应该使用的特性,例如间接对象表示法。Larry Wall 表示他必须为 C++ 程序员做些事情
my $cgi = new CGI; # indirect object, but not in Perl 7
my $cgi = CGI->new; # direct object
但是,这个特性在 Perl 7 中并没有消失。它已经是 v5.32 中的一个设置,但现在有了一个不同的默认值。
Perl 5 会发生什么变化?
没有人会从您那里拿走 Perl 5;它将进入长期维护模式——比最近两个用户版本的两个滚动支持周期要长得多。这可能是在十年后(或者 Perl 5 已经存在的半数时间)。
这会什么时候发生?
这项工作正在进行中,但您不需要担心它大约六个月,因为第一个候选版本应该会出现。目标是在明年内发布 Perl 7.0 的用户版本,途中会有一些候选版本。
这也是一个容易实现的承诺,因为 Perl 7 主要基于 v5.32,但有不同的默认设置。没有大改写或新功能,尽管一些目前实验性的功能可能会稳定下来(请选择签名!)。
CPAN 呢?
综合Perl档案网络(CPAN)几乎有20万个模块。人们正在使用的维护模块应该仍然可以工作,而对于其他模块,将会有兼容模式。记住Perl 7基本上是v5.32,所以你不需要做太多改变。
你可能不知道,Perl5 Porters几乎对CPAN上的所有新版本进行了测试。有一段很长的时间历史,有工具来检查变化可能对Perl社区产生的影响。作为一个模块作者,我经常收到来自各种人的消息,大多是Andreas Koenig或Slaven Rezić,关于我的模块中可能在新Perl版本中出问题的奇怪事情。通常,这是需要我更新的东西。追踪现有代码中的问题是一个已经解决的问题。修复代码不应该那么困难,因为仍然是Perl 5,但是有更好的实践。
Perl 7会有独立的CPAN吗?没有人说过不能有,但是在跳到Perl 7的过程中,开发者不想重新做已经工作良好的事情。这个变化应该可以尽可能地少做额外的任务来管理。
此外,Perl作者上传服务器(PAUSE)在过去的几年里收到了相当多的关注。这使得它们更容易适应未来的需求。那些从事这项工作的人经验丰富,才华横溢,他们已经使代码库更加易于处理。
为什么跳到主要版本?
主要版本可以与用户有不同的协议。主要版本跳变会通过新的默认行为改变这个协议,即使这与过去冲突。如果你愿意,将所有这些设置重置为旧的Perl 5默认设置的方式是存在的。尽管如此,Perl 7代码在语法和行为上仍然是v5.32代码(主要是)。
Sawyer谈到了Perl用户的三个主要市场细分
- 永远不会改变他们代码的人
- 使用新功能的人
- 从头开始的人
Perl 5的社会契约是极端的后向兼容性,在这方面取得了惊人的成功。问题是极端的后向兼容性对那些不会更新代码的人有效,但对其他两个细分市场没有帮助。新特性人群必须处理每个程序中更长的样板部分,而新手会 wonder为什么他们必须包含这么多才能创建一个程序,这样StackOverflow上的人就不会对他们缺少pragmas而进行骚扰。
为什么是7而不是6?
这个答案有两个部分。首先,“Perl 6”已经被现在所知的Raku所占用。很久以前,我们认为一个非常雄心勃勃的重写工作将取代v5.8。简而言之,那并没有发生,这个语言已经继续自己的生活。
所以,7是下一个可用的数字。就是这样。这只是下一个基数数字。这不是什么新鲜事:PHP直接从5跳到7,难道不是时候从那个社区中借鉴一些东西了吗?考虑这些历史上的其他奇怪跳跃
- Solaris 2.6到Solaris 7
- Java 1.4到Java 5
- Postgres 9.x作为主要版本到Postgres 10作为主要版本
- Windows 3.1到Windows 95(98,ME,2000,XP,Vista,7,8,10)
- TeX(每个新版本都更接近π)
至少它不是Perl 34。
什么在消失?
没有太多。一些事情将默认禁用,但再次强调,这基本上是Perl 5.32,但旋钮和旋钮在不同的地方。在Perl 5领域,有些事情你应该学会接受,即使在这些地方。这些可能是第一轮变化的热门候选者
- 间接对象表示法
- 裸词文件句柄(除了可能的标准文件句柄)
- 假的多维数组和散列(旧Perl 4技巧)
- 旧样式的原型定义(使用
:prototype()
代替)
什么会出现?
并不多。Perl 7基本上是Perl v5.32,但默认启用了所有功能。您无需做任何事情即可获得大多数新功能,例如后缀解引用、新的isa
运算符或许多其他功能。这就是新版本提供的重大合同的好处。这是一条清晰的界限,新功能可以在一侧默认存在而不会干扰另一侧。
我现在应该做什么?
如果您需要较旧的Perl来运行代码,您将没问题。那些旧版本不会消失。就像Perl 5.6仍然可用一样,如果您想运行这个版本。
如果您的代码在严格和警告模式下运行没有问题,并且您使用现代Perl风格,您可能大部分都很好。如果您有一些裸词文件句柄,开始转换它们。间接对象表示法也是如此。
对于杂乱无章的代码,您并不走运。将会有兼容模式来帮助您从Perl 5过渡到7(但不是从Perl 5到8)。一个pragma将设置旋钮和旋钮回旧设置(但这更像是单版本的事)
use compat::perl5; # act like Perl 5's defaults
对于模块,有一些问题需要解决,但也会有兼容机制。
好消息是,这些事情已经在生产环境中由主要的Perl利益相关者进行了测试。这不是一个纸面计划:它已经在进行中,粗糙的边缘正在被磨平。
而且,v5.32已经有一个这样的旋钮和旋钮在位。您可以关闭间接对象表示法
no feature qw(indirect);
但预计还有两个旋钮或旋钮,可能如下所示
no multidimensional;
no bareword::filehandle;
我将所有这些信息收集在为Perl 7做准备中,这是通过Perl School和LeanPub的最新产品。
底线
Perl 7是v5.32,但设置不同。如果您的代码不是一团糟,它应该能工作。预计将在一年内发布用户版本。
标签
brian d foy
brian d foy是一位Perl培训师和作家,也是Perl.com的高级编辑。他是Mastering Perl、Mojolicious Web Clients、Learning Perl Exercises的作者,也是Programming Perl、Learning Perl、Intermediate Perl和Effective Perl Programming的合著者。
浏览他们的文章
反馈
这篇文章有什么问题?请在GitHub上打开一个问题或拉取请求来帮助我们。