线性类型在GHC中合并

2020-06-20 03:55:40

已经快4年了。他们有4年了!我们学到了很多东西。我很疲惫,但最重要的是,我很高兴,我很感激,我很有希望。

GHC向线型的旅程始于2016年秋天。在这个时间点上,Jean-Philippe Bernardy和我从事分布式存储研发已经有一年左右的时间了。在此之前,我们两人都刚刚发表了对线性逻辑的研究。而且,我们开始在很多地方看到线性类型的机会:对于内存管理,为了概括协议类型,可以使用管理缓冲区…。在这个项目中,它成了一个反复出现的笑话:“你知道怎么做才能帮上忙吗?”线性类型!“。

我猜,在重复了足够多的笑话之后,你会开始想,也许它不应该是一个笑话。也许线型真的会有帮助。何乐而不为呢?所以我们决定给那头牦牛刮胡子。

不过,老实说:我认为这是不可能的。我真的认为要将线性类型添加到一种语言中,您需要从头开始重新设计它。也就是说,真正创造了一种新的语言。但是,幸运的是,让-菲利普知道得更清楚。他想出了一个令人信服的设计,将线性类型添加到GHC中。我当时在船上。

2016年秋天,我和同事马修·博斯普弗卢格(Mathieu Boespflug)集思广益,用了几个月的时间完善了我们的设计。冬天,西蒙·佩顿·琼斯(Simon Peyton Jones)和瑞安·牛顿(Ryan Newton)加入了我们的行列,努力将我们仍然相当粗糙的想法转化为足够坚实的设计,足以保证发表学术论文。到2017年秋天,我们的文章在POPL2018上被接受发表,并伴随着原型实施。

原型机只修改了GHC的前端,还没有接触到Coreet。然而,我们有足够的信心在2017年11月编写了一份用线性类型扩展GHC的提案。在接下来的三周里,这项提议吸引了200条评论。我们最终关闭了提案公关进行大修。由于200条评论在当时听起来太多了,我们选择在2018年2月以令人难忘的数字111作为单独的公关重新启动该提案。该提案的第二次迭代于2018年10月被接受。该提案总共收集了近600条评论,仅可与创纪录的点句法提案相媲美。多棒的一次旅行啊!

在对这项建议进行激烈辩论的同时,我们继续实施。实现不会说谎:我们开始它是为了找出我们在设计中可能遗漏了什么。确实,我们在设计中发现了一些漏洞。Matthew Pickering从2018年4月到7月作为实习的一部分加入我们,他承担了在Core内部实现第一个线性类型的费力的任务。仅让GHC二次编译就花了大约两个月的时间。在这个过程中,Matthew发现了我们的向后兼容性故事中的错误。所以我们更新了我们的设计和提案。

2018年10月,我的同事Krzysztof Gogolewski加入了这个项目。而且,为了让人们了解线型的工作有时会有多么平淡无奇,我们继续将线型的当前状态与GHC的大师进行了合并。一项需要两周以上的全职工作的任务。在接下来的一年里,Krzyszto坚持不懈地粉碎了提案中剩余的缺陷和不足之处。

为什么是一年?嗯,事实证明,一个看起来很无辜的设计选择:扩展𝜂的数据构建器,最终成为了一项巨大的事业。我们不得不与GHC中真正的错误作斗争,或者只是代码中隐含的、无意识的假设,这些假设需要相当多的工作才能解开。

那是2019年的夏天,我们已经准备好了,或者说我们是这么认为的。今年秋天,西蒙·佩顿·琼斯(Simon Peyton Jones)和理查德·艾森伯格(Richard Eisenberg)将在剑桥参加一个集中审查会议。发现了一些小故障。在这个实现的过程中,发生了很多研究:向Core传授线性类型并不像仅仅实现线性逻辑那么简单,甚至不像我们文章中的微积分那样简单,但这是另一个时代的故事。我们必须在现场做更多的调查。

我们在2020年1月之前解决了这些故障。今年剩下的时间一直专注于狩猎表现的回归。

让我确信不会忘记理查德·艾森伯格在这一切中所扮演的角色。理查德引领了这项提议,审阅了整个3000条线路板(好几次!),引导了合并,并在性能上提供了至关重要的帮助。可以肯定的是,这不是一项卑鄙的任务!

特别感谢Andreas Klebinger,他对线性类型分支进行了几次基准测试,以帮助确定性能回归;感谢Ben Gamari,他运行并分析了线性类型补丁上的8h基准测试。

现在我们到了。4年来,在GHC中发现了近30个错误(大多数是我们自己修复的)1,之后又发现了200多个内部拉取请求。这在很大程度上是一项集体工作,我非常感谢参与其中的每一个人。

在GHC 8.12中将有线性类型。但别指望会有成品。这是我们的第一次迭代,可以说是MVP。这是我们认为对任何人都有用的最小功能集。但它仍然主要针对早期采用者和急于修修补补的人。

打开-XLinearTypes,您可能会注意到的第一件事是,错误消息通常是没有帮助的:您会收到键入错误,告诉您承诺线性使用变量,但没有使用。它是如何线性使用的?嗯,这是给你喝的。虽然有时出错的地方非常明显,但要找出错误往往是很棘手的。

没有多态的中缀语法。您可以将前缀形式Fun p a b用于多态为p的箭头。但是:

多数情况下不支持多态,并且您可以预期大多数时间都会出现行为不正常的情况。

我的同事Divesh Otwani发现了一个窍门,你可以用它来解决这个问题,那就是用。

当然,也会有错误。可能很多。我们将很高兴收到您关于GHC错误跟踪器的错误报告。

当GHC8.12发布时,我们将发布LINEAR-BASE的第一个版本,这是一个帮助您开始使用线性类型的工具包。它包含来自Haskell基本库的许多函数的线性化版本、两种函数、带纯API的可变数据结构、用于安全资源管理的单值、线性光学、用于免分配阵列管线的API、…。

线性基库目前由我的同事DiveshOtwani开发,之前由Bhavik Mehta在Tweag暑期实习期间开发。

显然,要使GHC中的线型体验流畅,我们还有很多工作要做。完成提案的设计,而且很可能超出提案的范围。

但接下来最重要的是你。到目前为止,线性打字主要是专家的课题,他们确实提出了许多应用。但是,就我个人而言,我发现这个企业最令人兴奋的是,将线性类型添加到主流编译器中,可以让更多的人使用它们。尽管专家们很聪明,但他们无法与许多倍于配备类型检查器的程序员相匹敌。甚至不是很接近。

所以一定要玩耍,修补,实验,想出点子,建立图书馆。这一切都将非常令人着迷。我们为您提供线性基础,让您开始,但也许它不适合您,然后您可以建立自己的东西。有一个巨大的设计空间可供探索。一切都在我们面前。我就是其中之一,迫不及待地想看看哈斯克尔社区会拿出什么来。