现在,jnthn撰写了一篇关于Rakudo和MoarVM的权威概述,截至2020年的情况。我认为可以发布一些手写历史笔记,涵盖2000年到2019年,这可能会引起一些读者的兴趣。
我的笔记是为了回答你问题中的摘录而组织的:
Raku中类型/约束的性能惩罚?
理论上不应该有惩罚,相反地应该增加性能。Larry Wall在早期(2001年)设计文档中写道:
随着您提供更多的类型信息,它将提供更高的性能和安全性
(这是在2005年的一次学术会议上引入“渐进式类型”术语之前的4年。)
因此,他的意图是,如果开发人员添加了适当的类型,则程序运行时更安全、更快/更轻,或两者兼备。
(并且/或能够与外部语言进行交互:“除了性能和安全性之外,类型信息还在编写与其他语言的接口方面非常有用。”十年后,他说类型的第一和第二个原因是多重分派和文档。)
我不知道是否有系统的努力来衡量Rakudo在实现类型不会减慢代码运行速度并且如果它们是本地类型,则可以可预测地加速的设计意图方面的程度。
此外,Rakudo仍在快速发展中,过去十年中整体性能提升了2-3倍。
(虽然Rakudo已经有15年的历史了,但它是随着Raku语言的不断演变而发展起来的,最终在过去几年中才稳定下来,Rakudo的总体开发分为三个步骤:“让它工作起来,让它正确地工作起来,让它快速工作起来”,后者仅在近年开始真正实施。)
引用一段话:“据我所知,一些逐渐类型化的语言(如Typed Racket和Reticulated Python)由于执行类型系统合规策略而遭受了严重的性能问题。”
Gradual Typing from Theory to Practice (2019)总结了一篇2015年的论文,称:
一个系统性的尝试来测量[声音成本]…揭示了相当大的性能问题…
(可能是你们一直在读的那些问题)...
还说:
[而且]使用JIT编译器、名义类型、表示改进和定制编译器等方法可以显著提高性能。
现在将其性能特征与Rakudo和Raku进行比较:
Rakudo是一个15年历史的自定义编译器,带有几个后端,包括使用自定义MoarVM后端的x86 JIT。
Raku语言具有(逐渐)名义类型系统。
Raku语言支持表示多态性。这就像所有表示改进的母亲,不是指其中之一,而是因为它将表示从结构中抽象出来,因此可以利用表示多态性带来的自由进行改进。
还有其他与类型系统相关的潜在性能贡献;例如,我期望本地数组(包括多维稀疏等)有一天会成为重要贡献者。
另一方面,StrongScript中的具体类型由于相对廉价的名义子类型测试而表现良好
我注意到jnthn的评论:
防范确切类型比关心子类型关系等更便宜
我猜大约还需要5年左右的时间,才能确定Rakudo是否提供了足够的性能,使其逐渐类型化变得普遍有吸引力。
也许有一名陪审员(你好,Nile)将在未来一年左右首先对Raku(do)与其他逐渐类型化语言进行初步比较。
完备性
它是否具有完备的逐渐类型系统?
从数学处理的角度来看呢?我99%确定答案是否定的。
从被认为是完备的角度来看呢?唯一的保证只是内存安全吗?我认为是这样。还有更多的保证吗?好问题。
我所知道的是,Raku的类型系统是由像Larry Wall和Audrey Tang这样的黑客开发的。 (参见她2005年有关类型推断的笔记。)