Perl 6 正式发布
2015-12-25 18:12:40 阿炯

在经历了十多年的开发,Perl 6 如期在圣诞节正式发布


Larry Wall以Perl 6吉祥物Camelia的名义宣布Perl 6可以在产品中使用,但强调她仍然处于青春期,也就是她有几分成熟了,但还是会有问题。我们知道的青春期的人有时候会表现的很成熟,但有时候也会很幼稚,比如一个15岁的人有时候会像25岁,有时候会像5岁。Perl 6早期发行版-Rakudo Star,最终正式的名称为:Raku Programming Language



Perl6 1.0版将会在今年圣诞节发布

2015年3月上旬消息,当你看到这篇文章时肯定是特别吃惊,因为Larry发表声明说Perl 6开发者计划在其61岁生日之时发布 Perl6 1.0 开发版本,在 2015 年圣诞节正式发布 1.0 版本,2015将是Perl之年,但是并未说明具体的发布时间。为什么 Perl 开发者会这样尝试呢,这不仅仅是个承诺,他们面对着实际的问题,代码隐藏的复杂度,计划可能不会预期进行,等等可能导致失败的原因,但是他们想秉着“'Murphy doth exist' 的态度去尝试。尽管可能会有很多评论,讨论甚至是一些批评,但是在 Perl 社区,这将是非常令人兴奋的计划!有着两个很强的语言和一个很强的社区,肯定能在圣诞节发布 Perl 6 1.0 版本!

Perl是一种脚本语言。 最初的设计者为拉里·沃尔(Larry Wall),它於1987年12月18日發表。Perl借取了C、sed、awk、shell scripting 以及很多其他程式語言的特性。其中最重要的特性是他内部集成了正则表达式的功能,以及巨大的第三方代码库 CPAN。Perl 语言的中心思想可以集成为一句话「TMTOWTDI」
There's More Than One Way To Do It.(不只一种方法來做这件事)

Perl 的作者 Larry Wall 建议可以把这个缩写词念成「Tim Toady」。

另一个 Perl 程序员常常想起的 Perl 俗语是:
Easy things should be easy, and hard things should be possible.

2015 将是 Perl 6 之年

在多年的设计和实现之后,2015将是Perl 6正式发布可供生产使用之年。Perl作者Larry Wall将于明年1月31日在布鲁塞尔举行的FOSDEM 2015会议上,谈论Perl 6的开发历史,开发团队如何将事情做正确,如何从错误中吸取教训。更重要的是他们如何在设计者都认为不可能的情况下完成语言实现这一非同寻常的任务。Perl 6的开发始于2000年,2005年唐凤发起了Perl 6语言的首个完整实现Pugs项目,2010年7月Perl 6实现Rakudo Star发布了首个版本。

Perl6 如此长时间开发周期是为何

Perl 6 用了15年时间开发,它计划在今年底正式发布。Perl 作者 Larry Wall 在2015年8月8日 接受了《Linux Voice》的采访, 谈论了管理一个项目的难处,他的语言学背景如何影响 Perl 的设计,Perl 6 为什么花了如此长时间的设计和开发。他说,Perl 6一开始有很多绝妙点子,但你必须在其中有所取舍,否则只会变得一团糟。他承认Perl 6的开发伊始存在大量问题,早期版本看起来像是面向对象的汇编语言,唐凤(发起了Perl 6实现Pugs项目)因此提议使用Haskell去理清底层的语言模型。Perl 6有多个实现项目,除了 Pugs 外,还有 Parrot VM,基于 .NET 的 Niecza,以及 Rakudo 和 MoarVM。 Larry Wall 称,今年的剩余时间需要将精力集中在 MoarVM 上。

Larry Wall 称 Perl 6 计划在圣诞节发布

Perl 6 语言的开发持续了十多年,有一个古老的笑话说,Perl 6 将在圣诞节发布,但不知道是哪一年的圣诞节。这个笑话即将成为过去,Perl 作者 Larry Wall 于2015年11月上旬证实,Perl 6 将在 2015 年圣诞节发布,这一次的时间是明确无误而不是含糊其辞。此外,新的Perl 6网站也已经上线。在旧金山科学家探索馆举行的一个会议上Larry Wall谈论了Perl 6的新特性,他开玩笑的说,他们现在的最优先级工作是修正bug,以避免被错误当成特性。他介绍了一些新特性如匿名状态变量$++和序列算子等等,另外新的面向对象的设计方法了格外引人关注。


早在2010年,Rakudo团队就发布了第一个可用的Perl 6的编译器。在这里要稍微说一下关于Perl 6和他的编译器名称的问题。在Perl 5时代以及更早的时候,Perl既可以指这Perl一门语言,也可以指Perl的编译器。可是在Perl 6的时候,Larry提出我们要让语言本身和他的实现相分离。所以Perl 6指的是这个语言的设计标准,而他的实现(编译器)可以是不同的。类似的例子就如C++。C++是一门语言,但是他可以有不同的编译器,比如VS C++,G++,CLANG等等。而Rakudo就是目前对Perl 6标准支持最完善的一个编译器。当然要指出的是,这里的编译器和C/C++的编译器还是很不一样的。因为Rakudo并不是将Perl代码编译成机器码,可以在CPU上直接执行,而是转换成一种类似Java Bytecode的中间代码。这种中间代码可以在虚拟机上运行。其中,JVM就是被支持的一种虚拟机。除了JVM,还有MoarVM,这是比JVM更好的选择。除了这两个以外,还有一个叫Parrot,曾经是Perl 6主要支持的。后来因为一些变故和MoarVM的崛起,Perl 6转向了主要支持MoarVM,这些就不展开啦。总而言之,Perl 6完全摆脱了Perl 5的编译器,采用的是一个全新的,没有历史包袱的架构。这同时也带来了一些问题,主要有两个。一是Perl 6并不完全向下兼容Perl 5的语法。对于以前的Perl 5的程序,不能保证他们可以正确地被编译,可能出现编译错误。对于这个问题,在Python 2向Python 3转变的过程中也遇到过。二是Perl 6由于采用了先编译到中间代码,再通过虚拟机执行的方式,他的运行速度相比Perl 5慢了不少。这两个问题目前还没有非常完美的解决办法。

虽然Perl 6还有一些问题,但是这不能掩盖Perl 6背后先进的设计思想和更丰富好用的语法所带来的便利。在Perl 6还没有发布前,我们可以通过安装Rakudo和MoarVM(JVM/ParrotVM)来体验和学习一下Perl 6。初学者强烈建议采用这一种安装方法。
Debian/Ubuntu/LinuxMint
$ sudo apt-get install rakudo

Fedora/Red Hat/Cent OS
$ yum install rakudo

看一下版本
$ perl6 --version

从源码编译安装需要用到一个小工具叫rakudobrew。利用这个小工具,可以让我们很方便的下载并安装最新的rakudo。安装这个小工具需要下面三条命令
$ git clone https://github.com/tadzik/rakudobrew ~/.rakudobrew
$ echo 'export PATH=~/.rakudobrew/bin:$PATH' >> ~/bashrc
$ source ~/.bashrc

如果没有什么错误信息的话,就表示rakudobrew已经装好啦。
下面就可以用这条命令安装Rakudo了。
$ rakudobrew build moar

经过将近十分钟的等待之后,Rakudo和MoarVM已经成功装好了。

除了Rakudo以外呢,还推荐大家装一个小工具叫Panda。名字取的挺好的,就是熊猫。这个是专门为Perl 6用来安装Perl模块的工具。用下面的命令就可以装上。
$ rakudobrew build-panda

该命令可以一键帮你装好所有常用的Perl 6的模块,就不用等到需要的时候再一个个去找去安装了。


Perl 6 FAQ

Perl 6 提供了过程式的, 面向对象的和函数式编程方法。
易于使用的一致性语法, 数据结构中的符号不变性。
完全基于字素的 Unicode 支持, 包括附件 #29足够清晰的正则表达式, 更易读, 更多功能。
Junctions 允许多个可能性的简单检测, 例如 $a == 1|3|42(意思是 $a 等于 1 或 3 或 42)
相对于全局变量, 动态作用域变量提供了词法作用域备选强调可组合性和本地作用域以阻止「超距作用」。例如, imports 总是本地作用域的。
易于理解的一致性作用域规则和闭包强大的面向对象, 含有类和 roles(所有的东西都可以当做对象)。继承、子类型、代码复用。
内省到对象和元对象中(叠罗汉)
元对象协议允许元编程而不需要生成/解析代码。
子例程和方法签名,便于解包位置参数和命名参数。
根据元数、类型和可选的额外代码使用不同的签名对同一具名子例程/方法进行多重分派。
未知子例程/不可能的分派在编译时给出错误报告。
可选的渐进类型检查,无需额外的运行时成本。 还有可选类型注解。
基于对编译器/运行时状态的内省的高级错误报告。这意味着更有用,更精确的错误信息。
Phasers(如 BEGIN/END) 允许代码作用域 进入/退出, 首次循环/last/next 和其它更多上下文中执行。
高级并发模型,用于隐式以及显式多进程处理,这超越了原始线程和锁。 Perl 6 的并发提供了一组丰富的(可组合的)工具。
多核计算机越来越多地被使用,由于并行性使得 Perl 6 可以使用多核,包括隐式(例如使用>>.方法)和显式 (start {code}) 。这很重要,因为摩尔定律正在结束。
提供结构化语言支持以实现异步执行代码的编程。
Supplies 允许在发生某些事情时执行代码(如定时器,信号或文件系统事件)。
react/whenever/supply 关键字允许容易地构建交互式,事件驱动的应用程序。
懒惰求值,如果可能的话,急切求值当需要或必要时。这意味着,例如,惰性列表,甚至无限延迟列表,如斐波纳契序列或所有素数。
原生数据类型用于更快的处理。
使用 NativeCall 连接到 C/C++ 中的外部库非常简单。
使用 Inline::Perl5 和 Inline::Python 连接 Perl 5(CPAN)/Python 非常简单。
可以同时安装和加载模块的多个版本。
由于更简单的更新/升级策略,简化了系统管理。
简单的数值计算没有损失精度,因为 Rats(有理数)。
用于解析数据或代码的可扩展语法(Perl 6 用它解析自身)。
Perl 6 是一种非常易变的语言(定义自己的函数,运算符,traits 和数据类型,为您修改解析器)。
很多的数据类型选择,加上创建自己的类型的可能性。
具有适当边界检查的多维成型的和/或原生数组。
在某个匹配出现时, 词法解析期间随时执行代码。
添加自定义运算符或添加 trait 特征和编写子例程一样简单。
在任何运算符(系统或自定义添加的)上自动生成超运算符。
运行在各种后端上。目前 MoarVM 和 JVM,JavaScript在开发中,可能会有更多。
执行期间(JIT)热代码路径的运行时优化。
运行在小型(例如 Raspberry Pi)和大型多处理器硬件上。
基于垃圾收集:没有及时销毁,所以引用计数没有必要。使用 phasers 用以及时的动作。
方法可以在运行时混合到任何实例化的对象中,例如。以允许添加带外数据。
通过使用具有多重分派和自动生成使用信息的 MAIN 子例程,使命令行接口易于访问。
更少的代码行创建更紧凑的程序。名字的霍夫曼编码允许更好的可读性。
使用简单的迭代器接口定义的惰性列表,任何类可以通过最小化的提供单个方法来提供。

Perl 6 的座右铭与 Perl一直保持不变:Perl是不同的。简而言之,Perl旨在”使容易的工作变得容易,使困难的工作变得可能”,和”条条大路通罗马”。现在有更多 -Ofun 添加进来。


Perl6 或重新命名为 Camlia