将 Perl 5 代码迁移到 Perl 6

了解将 Perl 5 程序移植到 Perl 6 时可能遇到的问题。
209 位读者喜欢这个。
Perl 6 logo butterfly

Larry Wall。GNU 通用公共许可证或 Artistic License 2

无论您是正在采取第一步将 Perl 5 代码转换为 Perl 6 并遇到一些问题的程序员,还是只是有兴趣了解如果您尝试将 Perl 5 程序移植到 Perl 6 可能会发生什么,本文都应该可以解答您的问题。

Perl 6 文档 已经包含了您需要处理将 Perl 5 代码迁移到 Perl 6 时遇到的问题的大部分(即使不是全部)文档。但是,正如文档一样,重点在于事实上的差异。我将尝试更深入地探讨具体问题,并根据我将大量 Perl 5 代码移植到 Perl 6 的经验,提供更多实践信息。

Perl 6 怎么样?

非常好,谢谢!自 2015 年 12 月首次正式发布以来,Rakudo Perl 6 已经看到了数量级的改进和相当多的错误修复(总共超过 14,000 次提交)。到目前为止,已经出版了七本关于 Perl 6 的书。Learning Perl 6 由 Brian D. Foy 撰写,即将由 O'Reilly 出版,它是从开创性的 Learning Perl (又名“骆驼书”)重新编写而来,许多人都已经熟悉和喜爱它。

用户发行版 Rakudo Star 采用三个月的发布周期,并且在 Perl 6 生态系统 中提供了 1,100 多个模块。Rakudo 编译器版本采用每月发布周期,通常包含 30 多人的贡献。Perl 6 模块被上传到 Perl 编程作者上传服务器 (PAUSE),并使用综合 Perl 存档网络 (CPAN) 在全球范围内分发。

在线 Perl 6 简介 文档已被翻译成 12 种语言,向超过 30 亿人以他们的母语教授 Perl 6。最新版本的 Perl 6 Weekly 自 2014 年 2 月以来每周都报道有关 Perl 6 的所有内容。

Cro,一个微服务框架,从头开始使用 Perl 6 的所有功能,提供 HTTP 1.1 持久连接、具有请求多路复用的 HTTP 2.0 和具有可选证书颁发机构的 HTTPS。并且 Perl 6 IDE 现在处于(付费)beta 阶段(可以将其视为具有即时交付物的 Kickstarter)。

在 Perl 6 中使用 Perl 5 功能

Perl 5 代码可以使用 Inline::Perl5 模块与 Perl 6 无缝集成,使 CPAN所有内容都可用于任何 Perl 6 程序。这可能被认为是作弊,因为它将嵌入 Perl 5 解释器,因此继续依赖于 perl (5) 运行时。但是,它确实使您的 Perl 6 代码易于运行(如果您需要访问尚未移植的模块),只需将 :from<Perl5> 添加到您的 use 语句中,例如 use DBI:from<Perl5>;

在 2018 年 1 月,我提出了一个 CPAN 蝴蝶计划,以尽可能接近原始 API 的方式将 Perl 5 功能转换为 Perl 6。我将此作为目标,因为 Perl 5(作为一种编程语言)不仅仅是语法本身。问问任何人 Perl 独特的卖点是什么,他们很可能会告诉您是 CPAN。因此,我认为现在是从 Perl 世界的这种观点转向的时候了

Dromecentric view

转向更现代的观点

Cpannican view

换句话说:将 CPAN 作为 Perl 最重要的元素放在中心位置。

转换语义

要在 Perl 6 中原生运行 Perl 5 代码,您还需要大量的 Perl 5 语义。在 Perl 6 中提供(可选的)对 Perl 5 语义的支持降低了 Perl 5 程序员在尝试使用 Perl 6 编程时感知的概念门槛。更容易感到宾至如归!

自从 CPAN 蝴蝶计划发布以来,Perl 6 现在支持 100 多个内置 Perl 5 函数,API 相同。许多函数已经存在于 Perl 6 中,但语义略有不同,例如,如果未指定参数,Perl 5 中的 shift 会神奇地从 @_(或 @ARGV)中移出;在 Perl 6 中,参数是强制性的。

超过 50 个 Perl 5 CPAN 发行版也已移植到 Perl 6,同时坚持原始 Perl 5 API。这些包括核心模块,例如 Scalar::UtilList::Util,以及非核心模块,例如 Text::CSVMemoize。在 CPAN 之河 上游的发行版旨在尽可能地对生态系统产生影响。

总结

Rakudo Perl 6 已经成熟到这样的程度,即使用 Perl 6 现在是创建新的交互式项目的可行方法。能够使用可靠且经过验证的 Perl 5 语言组件有助于降低开发人员使用 Perl 6 的门槛,并且它朝着 Perl 5 和 Perl 6 的总和大于其各部分之和的情况发展。

Elizabeth Mattijsen
Elizabeth Mattijsen 自 1978 年以来一直从事编程工作,使用各种(现在大多已过时的)编程语言,然后开始使用 Perl 4 编程。1994 年,她创立了荷兰第一家商业网站开发公司,使用 Perl 5 作为主要编程语言。从 2003 年起,她参与了一家在线酒店预订服务的快速增长。

6 条评论

?

对于有经验的 Perl 程序员来说,总结得很好。我想开始使用 Perl 6!

哇,很棒的文章,Elizabeth!
Perl 6 听起来随着这些新发展变得令人着迷。现在,我正在考虑重新开始使用一种新语言进行编程,Julia、Nim、Crystal、Object Pascal/Lazarus(我喜欢 Pascal 语法!)、Swift、Rust 和 Kotlin 真的让我很感兴趣。实际上,我刚刚在 Udemy 上注册了“从零开始学习和掌握 Julia 编程语言” - 还没有开始!

现在,Perl 6 出现了,我想知道我是否应该先追求它。但另一方面,我真的想要一种静态编译语言,它可以吐出一个快速的可执行文件,以“接近”C 速度运行。Perl 不是解释型的吗?

您能否向我们介绍一下 Perl 6 的性能,以及我们应该对未来 -- 随着代码库的成熟 -- 在性能(编译器等?)方面相对于我上面提到的语言有何期望?

干杯!

-Dark Matter
****
计算机编程的头两条定律
1) 永远不要相信未经彻底调试的程序。
2) 没有程序是永远彻底调试的。
****

Rakudo Perl 6 始终首先是一个解释型动态语言。但其理念是,热代码将通过 JIT 优化到机器级别。Jonathan Worthington 有一个关于此的精彩演讲:去优化如何帮助我们更快? (http://jnthn.net/papers/2017-spw-deopt.pdf)。

为了回答您的问题:短期来看,我不会因为速度而选择 Perl 6,而是因为它的功能。长期来看(未来 2-5 年),Rakudo Perl 6 将会变得更快。但是我不认为它永远能够吐出以接近“C”速度开始运行的快速可执行文件:Perl 6 的动态性质始终是这方面的问题。我猜有人可以制作 MoarVM 字节码 -> 模块空间中足够静态的 Perl 6 程序的汇编端口。但是我不认为这种情况会在短期内发生。当然,我很乐意被证明是错的 :-)

回复 作者 DarkMatter

> 为了回答您的问题:短期来看,我不会因为速度而选择 Perl 6,而是因为它的功能。长期来看(未来 2-5 年),Rakudo Perl 6 将会变得更快。
---

现在,它的执行速度与最新的 Python 或 PHP7 相比如何?或者在 2-5 年后?
Perl 6 确实有一些令人惊叹的功能。

谢谢您的回复。

回复 作者 lizmat

我只知道将其与 Perl 5 进行比较的基准测试。并且取决于您正在做什么,我会说目前单线程 Perl 6 在某些情况下与 Perl 5 并驾齐驱,如果您使用大量正则表达式,则比 Perl 5 慢 10 倍。但是,如果您可以使用 `race` 或 `hyper` 并行化您的工作,它通常已经比 Perl 5 快得多。我不知道 2-5 年后情况会如何。YMMV。

回复 作者 DarkMatter

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 许可。
© . All rights reserved.