查看原文
其他

Perl 6 真的太烦人了?

aearnus CSDN 2019-07-25

要应用于 Unix 系统维护功能、CGI 脚本、Web站点维护自动化等场景的 Perl,是一种功能非常丰富的计算机程序语言。它像 C 一样强大,像 awk、sed 等脚本描述语言一样方便。不过,还记得曾于 2015 年发布的 Perl 6,是历经 15 年时间开发的最终成果,为何会这么长?对此,Perl 作者 Larry Wall 曾表示,Perl 6 开发伊始存在大量的问题,早期版本看起来像是面向对象的汇编语言。不过虽然耗费了 15 年的时间,如今很多开发者对 Perl 6 的印象并不是太好,而这又是怎么一回事?

作者 | aearnus

译者 | 谭开朗,责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

…童话人物会在睡前祝自己好梦…

厌恶是一种强烈的情感,它往往是处于对事物的一知半解。我不喜欢主观臆断“我讨厌……”,除非是我研究过的东西且值得我背负厌恶它所带来的情绪负担。

接下来,我将直接切入主题。我见过太多的人说他们“讨厌”Perl 6,却没有人愿意花时间去了解它。我想消除某些因这种厌恶情绪而衍生的观念。如果你真的讨厌Perl 6,那么你应该有具体的理由。否则,你只是毫无依据的吐槽这成百上千个劳动者因为热爱而创造出来的东西。退一步说,吐槽要正中槽点,这样我们才能对症下药。希望这篇文章能让你放下偏见,看看它设计决策背后的意义。如此一来,编程社区将会是一个驱散了厌恶愁绪的美好的净土。

让我们直奔主题吧,看看人们广为传播的误解有哪些。



误解:Perl 6永远不会完成。

事实:Perl 6已经完成了,完成了很长时间。

Perl 6 被定义为一组测试用例,任何特定的编译器都必须通过这些测试用例。测试套件详见:https://github.com/perl6/roast/。自该语言发布以来,随着测试套件的完成,该语言也已经完成。一些Perl 6编译器可能还没有完全支持该语言,但这并不意味着该语言未完成。

Rakudo作为最流行的Perl 6编译器,通过了这个套件的绝大部分内容。这已经足够宽泛了,你可能永远也不会遇到不支持实现的边缘情况。就我个人而言,我只遇到过一次这样的边缘情况,那是在对一个对象的元对象进行激烈的黑客攻击的时候,这绝对不是你日常就能遇到的。



误解:Perl 6有一个奇怪的生态系统。

事实:你可能混淆了Perl 5和Perl 6,或者混淆了Rakudo和Perl 6。请容我解释一下……

  • Perl 6是一种语言,它有时被称为Raku,以便于与Perl 5区别开来。

  • Rakudo是最流行的Perl 6编译器,它实现了一种名为Rakudo Perl 6的语言超集。

  • Rakudo Star指的是Rakudo编译器包,以及一些高质量的社区包。

  • nqp是用于构建该语言的Perl 6的子集。没错——Perl 6是通过它的简化版来实现。Rakudo的很大一部分内容是用nqp编写的。

  • MoarVM是Rakudo使用的虚拟机,它作为nqp编译所需要的后端。

  • Zef是Perl 6的包管理器,它从master repo下载模块列表。



误解:Perl 6没有目标人群,也没有市场定位。

事实:Perl 6聚焦于问题解决者。

(请查阅这篇有趣的辩证文章:https://news.ycombinator.com/item?id=20375080

Perl的创始人Larry Wall是一位语言学家。请允许我反问一个问题:英语的目标人群是谁?

你会怎么回答?这个问题是多余的吗?“说英语的人”是英语的目标人群这一说法有意义吗?

你也许会说这个问题毫无意义;Perl 6是一种为特定人群而创建的语言。但是英语也是由人类创造的,尽管不是刻意而为之。现代英语是由各种规范的中世纪英语发展而来的,而后逐渐演变为更接近口语形式的现代英语。同理,Perl 6是由Perl发展而来,许多特性都是由Perl 5演变而来。Perl 6“启示”中描述了一些尚未实现的特性。

因此,Perl 6成为了Perl 5不满足Perl发言人期望的解决方案。至少可以这么说,现代英语的出现是为了解决古英语和中世纪英语不再能代表其用法这一问题,这给我们带来了什么启发?我不太确定。

一种语言的存在是否有意义?这不是我该考虑的问题,而是哲学家该考虑的问题了。如果你认为Perl 6没有有效的目标人群,那么至少也要先想到这一点。

更直接的回答这个问题:Perl 6缺乏市场定位就是该语言的市场定位。它吸引那些敢于尝试的函数式编程的程序员,吸引那些具有简单C互调用的初级程序员,吸引那些需要灵活容器和操作符的程序员,诸如此类。Perl 6支持程序员以他们喜欢的方式来编写代码(请参见:baby Perl 6,如下所述)(也请参见:https://aearnus.github.io/2019/04/05/perl6-is-the-world-s-worst-ml

能够选择自己的市场定位是一种独特的优势,其使得Perl 6能以一种独特的方式吸引着每个人和每个问题。



误解:Perl 6是反复无常的。

事实:每个问题都有多种解决方式。做这件事的方法不止一种。

语言、想法和现实都是反复无常的。Perl 6支持通过问题来选择最佳方案。这就是反复无常的根源——我觉得在这个话题上无须多言了。



误解:Perl 6太复杂了,太难学了。

事实:Perl 6具有必要的复杂性。

初学者直接以Perl 6作为入门的话会立即陷入难题,这太复杂了。但这种复杂性是必要的。我要再次引用Damian Conway的话:

Perl 6最初的设计理念之一是,复杂性在本质上是必不可少的,但使用时可重新分配。

你大可在新的程序员那儿将复杂性转移出去,但是你不可能阻止他们去挑战。如果你向新的Perl 6程序员展示这个页面,他们会尖叫着跑向另一个方向。这就是Perl 6总是被缓慢又温和的引入的原因——使用了一个子集,社区成员喜欢称之为“baby Perl 6”。你可以在像https://perl6intro.com/(第一个教程在https://perl6.org/resources/)这样的教程网站上找到关于baby Perl 6的示例。它只介绍了少量的操作符,几乎没有介绍到任何控制流结构。控制流结构的内部工作原理根本没有涉及!它甚至没有提到given/when使用智能匹配操作符~~,而在调用程序上使用.ACCEPTS方法。

这种复杂性是存在的,我们可以使用它。但是如果你是一个初学者,或者你不打算深入学习这门语言,你就没必要使用它了。对于不想染指这部分内容的程序员来说,他们是不知道这部分内容的。

尤为重要的是:复杂性是分层次的。你可以使用Perl 6的表层特性,它将作为Python-esq的高级脚本语言正常工作。但是抛开这些,你可以做任何你想做的事情——甚至可以修改nqp解析Perl 6语言的方式!



误解:Perl 6很难读懂。

事实:写得不好的Perl 6很难读懂。

另一事实:你无法读懂你不会的语言。

我的母语是英语,我只会讲英语而不懂中文,我甚至不能假装看懂中文。这些象征性的文字掠过我弱小的西方心灵。

如果你不了解Perl 6,那么它就会从你的脑海里一掠而过。它包含了的丰富,忽略一个符号就可能完全改变你对整个代码的理解。想看看Perl 6有多丰富吗?这是一个自动并行映射和折叠从1到100的数字,它通过子程序f($x)映射每个数字,通过g($x,$accum)来折叠列表:

[[&g]] (1..100)».&f

这一行代码中的每一个符号都有意义,如果其中任何符号丢失或改变,代码就会有很大的区别。想象一下,这是英文字符的时候,你却试图用中文的视角来阅读!

问题在于:使用这些符号的数量肯定是有限制的。诚然,优先级规则令人困惑,左右绑定又似乎是可以改变的。如果你来自阿格达或哈斯凯尔,你可能会处理。但如果你来自爪哇,你可能就不会了。

好的代码和糟糕的代码都属于个人主观意愿,但在我看来:这可能是糟糕代码产生的原因,而糟糕代码很难读懂。能力越大,责任越大。



误解:Perl 6太慢了。

事实:你在用速度来换取表现力,但速度赤字是一直在不断缩小的。

Perl 6是由一小群人创建的一种极具表现力的语言。优先考虑的从来都不是速度,而是包罗万象的表现力。在选择Perl 6时,需要在这两者之间进行权衡。

尽管如此,也有两个好的方面:

  • Perl 6对并发性提供了非常好的支持。这文档比我解释的更好:https://docs.perl6.org/language/concurrency。另一个关于这个问题的答案请点击此处。这是一篇老文章,但仍然适用。

  • 在Rakudo编译器领域,速度一直在提高的。查看所有在Rakudo中实现的开放性能修复程序!有一个网站按版本顺序列出了Rakudo编译器的渐进式基准测试,但我尝试了很多次Google-fu都找不到它。如果你知道我讲的这个页面,烦请通过下面的联系方式告诉我,我将不胜感激。

我曾多次提到这个文章,但如果你还没有读过,建议你看看:Perl 6是世界上最糟糕的ML(https://aearnus.github.io/2019/04/05/perl6-is-the-world-s-worst-ml)。除此之外,我还添加了一些新的见解与深刻的评论。绝对值得一看!还有一些出自于Damien Conway的令人难忘的语句,我最喜欢的段落是:

我坚信,语言应该看说话人的需要,而不是反过来。就像英语没有一种正确的表达方式一样,用你喜欢的编程语言编写代码也不应该有一种正确的表达方式。大多数语言并不真正支持这个理念;事实上,它们中的许多都基于完全相反的原则:“任何东西都必须是纯函数的”、“所有东西都必须是对象”、“所有东西都必须有声明关系”、“所有东西都必须是独立的,交互线程不可靠”。在我看来,每一个表述都相当于:“这是一把锤子。那么所有的东西都必须得是钉子。”

当然,专业严谨的开发人员并不赞同。这意味着他们现在必须熟练使用Haskell、Erlang、Python和Node.js以及其他十几种完全不同且难以理解的开发工具。在编写、调试和维护项目时,它们之间必须不断的切换表述。但我们绝大多数人都不擅长这个。

这就是为什么我花了20年的时间,来确保Perl 6支持以任何合理的方式去解决问题……以及解决专属于你的问题!无论如何,要从功能上解决大部分问题,要使用对象来实现程序中固有的状态部分,并使用声明语法处理固有的语言组件。但是你可以使用同一种语言,以你最喜欢的方式来实现。

我有遗漏哪些误解吗?我遗漏了你希望看到的解释吗?我有说得不对的地方吗?请通过以下联系方式给我留言!

原文:https://aearnus.github.io/2019/07/06/perl-6-is-cursed

本文为 CSDN 翻译,转载请注明来源出处。

【End】


 热 文 推 荐 

一场全能的开发者大会,来自助力开发者成功进阶的华为云

☞支付宝 AR 拯救垃圾分类;小霸王陷欠薪风波;TensorFlow 1.13.2 发布!| 极客头条

☞使用 JavaScript,也能在 Web 应用中实现人脸检测功能?

☞程序员爬取 2 万条数据,撕开微博热搜的真相!

☞"别太乐观, 冲破黑暗还很远呀! "

☞帮嫦娥五号登月的AI还能用来玩游戏,20行Python代码带你领略强化学习的风采

☞2019年技术盘点容器篇(四):来自京东云的技术问答 | 程序员硬核评测

☞读完这45篇论文,“没人比我更懂AI了”

实测!华为鸿蒙比 Android系统快60%!

点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

你点的每个“在看”,我都认真当成了喜欢

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存