我最近一直在思考生锈变化多久了。有些人断言这些日子里的铁锈保持相当静态,有些人说锈病仍在改变太多。在本博客文章中,我想进行这个问题的数据驱动分析。首先,我会呈现我的假设。接下来,我的方法论。然后,我们将讨论结果。之后,我们将讨论可能的方法问题,以及进一步研究的可能指示。
我个人对锈病变化:对我来说,过去的感觉比我们今天有更多的变化。这些变化也变得更加小。这将是我的假设。
有很多不同的方式,我们可以衡量问题“经常变化?”所以在我开始收集数据之前,我必须决定一些细节。
我意识到我这里的前提是人们对生锈的看法。那么,他们如何了解如何变化如何变化?嗯,我们通过释放博客帖子来沟通对生锈界的改变的主要方式。所以我决定从那里开始。
我所做的是,我在一个新的标签中开辟了每一个Rust的博客帖子,从1.0.0到1.42.0开始。为了好玩,我还打开了1.43的发行说明,这将很快出来。
我最初包含“弃用”和“声音”也是类别,但我最终不包括它们。更稍后的更多信息。
从这里,我不得不决定这些类别的意思。我在这里使用什么标准?这是更容易的:
语言变化意味着对语言定义的某种修改。由于我们的稳定性政策,这些是添加的变化,但它们是新的补充。
标准库是指标准库的更改,主要是新功能,新类型,新方法,类似的东西。这一个很简单,作为标准,但有一些小的有趣的方法问题,我们稍后会进入。
工具链改变与货物,Rustup,新编译目标支持相关,类似的东西。不是正确的语言的一部分,但是生锈分配的一部分和生锈程序员将使用。
主要/中/微小的变化是我认为改变的变化有多大。这有一些有趣的部分。首先,这当然是非常主观的。我还决定尽可能地评估这些,即我们可能认为有一些变化是思想的主要是在今天经常在实践中使用的专业,所以我将那些归类为中等而非专业。这对我来说比试图记住我当时的感受更符合。
添加语法变化声音容易,但实际上真的很棘手。例如,考虑像“模式中的dotdot”这样的功能。例如,这会更改语法,因此您可以争辩说它添加语法。但作为程序员,我并不真正关心语法。此功能的摘要是“允许在更多上下文中允许...模式片段”。这是说:
此RFC旨在“完成”功能,并使其在所有可能的列表上下文中工作,使语言有点方便且一致。
我认为这些改变实际上是这个想法的核心,所以我决定根据我的意见进行分类:这不是一个新的语法变化。你已经知道......
我相信这可能是我分析中最有争议的部分。当然,在此之后更多。
好的,那是我覆盖的东西。但还有我没有覆盖的东西。我做了足够的工作,不得不在某处绘制这条线。我离开了这个东西:
编译器加速。这是有趣的数字,但这意味着实际上编译了东西,我没有时间。这是一个整体研究。
文档工作。这往往不会被跟踪为新功能,但有时它出现在发行说明中,更大的东西。更好地留下它。我也不认为它根本不影响我的假设。
图书馆类型实现新特征。这些可能难以编号,特别是涉及泛型。我决定将它们留下更好。
编译内部新闻。我们有时会谈论“MiR现在存在的东西!”或者“我们将建立系统移植到货物上!”但类似于文档,我们很少谈论它。它也不是影响最终用户的更改,或者更确切地说,它会通过计入的内容更直接地影响它们。 MIR启用了NLL,并且将NLL被跟踪为语言功能。
我认为我不如Google Sheets一样好,所以我要求帮助。非常感谢曼德为帮助我举行这个。我应该注意他让我起来,但是我调整了一大吨的东西,所以任何错误都是我的,不是他的。例如,我有点懒惰,并没有意识到各种图表中的颜色不一样。这是我的坏事。
这里有一些快速总计,以及我发现的每种发生了多少,有一些闪亮线。您可以单击此帖子中的任何图像以放大它们:
首先,它非常清楚,至少在数字上讲,标准库是锈的一部分,最常变化。它是卷的明显异常值。我觉得这个结果有点热闹,因为Rust是众所周知的,用于拥有一个小型标准库。我们将更多地讨论为什么我认为这是在下面的“问题和进一步研究”部分。
您可以看到早期有一大吨的工具链。我们早早做了很多工作,所以做了很多变化!它近期平静下来,但工具链改变几乎发生了语言变化的两倍。我还应该注意,这种工具周内的减少可能是由于方法;这是关于帖子后来的谈判。
所以,这里的核心问题:它看起来像语言正在改变更多,最近,而不是更少。我认为这很清楚,这个图表并不是我想象的,即,我期待一个漂亮的温和曲线,但这并不是发生了什么。我想更多地挖掘这个,但首先,让我们看看一些其他图表:
添加语法的更改是语言更改的子集。总体而言,这一切都没有一大堆。铁锈2018是大的凹凸。我们的一半版本不添加语法,但是43中的10个介绍了语言更改。我们的前29个版本,跳过1.26,平均一两次变化,但每次都在三到四之间。我相信这与我的方法有关,但与此同时,这相当难以驳斥我的假设。很有意思!
Fort 2018周围有一个峰值,1.12到1.19,否则,最近一直非常稳定,在整体变化方面。如果我们看起来只是重大变化:
铁锈2018年有一个巨大的凹凸。在1.0之后,经过2018年Rust,它平静下来。我认为这个图表非常有趣,并展示了3年版周期。我们发货版,东西镇压,事情慢慢地恢复,我们发货时,他们再次冷静下来。
那么,为什么我的假设错误?我认为这个结论是令人着迷的。我认为它的一部分与我的方法有关,也许可能会解释人们对生锈的一些方式。你看,即使我们经常发布,而且许多版本没有它们的巨大变化(如你所见,它在8或10左右,当你平均排除标准图书馆时)事实上,我们经常发布并具有体面,但相当少量的变化意味着事情进入发行说明,如果我们有完全相同的变化,但每年都会发布。
因此,例如,在2019年,我们释放了生锈1.32至1.40。涉及35语言的改变。我会包括,说:“你现在可以使用#['如果我一直在写一篇关于所有这些变化的帖子吗?可能不是。但由于该版本中只有八个总变化,其中一半是语言的变化,其中包括在1.37发布帖子中包含意义。
这是否意味着读发布帖子并认为生锈变化的人是错误的?不,不是的。对于我们的厚实的人,很多较小的变化都会进入背景。我实际上最初在enums上键入了“#['作弊(n)]”写上述句子时,因为这种变化与我或我的工作不相关,并且非常小,并使事情更加正交,所以它只是对我来说是模糊的背景噪音。但对于那些没有与语言同义的人来说,这更难了解什么是大而且什么很小。在他们里面有很多东西的无尽的释放帖子让它感觉很像发生了很多。但是也可能发生在其他语言中的相同数量的东西,你只是在发布帖子中看到它们,因为他们每年只推出一次。你们俩都经常看到它们,以及少在他们身上看到。
我不认为这意味着Rust项目应该改变其发布时间表,我并不完全确定这意味着我们应该改变我们如何编写发布帖子。但是,也许有更好的方法来表面“这些都是大的改变”vs“这是一件小事”或类似的东西。我不知道。但我认为这有助于我了解得很好。
这种方法有一些很大的问题。没有分析是完美的,但我想公平,所以我至少叫我想到的所有东西。
第一个是,这是本质上的主观性。有不同程度的主体性;例如,“笔记的总变化”是相当客观的。但不是完全;人们必须决定发布说明的内容。因此,在我甚至开始看数据之前,已经有一层过滤。做这个分析需要我两天的实时,但只有几个小时的实际工作。以自动方式分析Git Repo的东西可能会看到其他结果。我认为这种主观性水平是可以的,因为我们也在测试主观的东西。我认为我以适当的方式设计了我的方法。在某种程度上,如果“真正的”答案是那么重大变化,那就没关系了:人们仍然通过阅读帖子来获得这个信息,所以我不认为“哦,是的,你觉得这样的方式,但是这个图表说你的感受是错误的“真的会帮助这种辩论。
第二个问题在此扩展。我们有点有三种发布说明写作:第一个帖子是由Aaron和Niko编写的。截至生锈1.4,我接管了,几乎每篇帖子都写到1.33。然后我退回了一段时间,虽然我确实有助于编写1.42帖子。发布团队向前写了1.34,而且比以前的帖子更具合作努力。这意味着从发布说明中进行过滤器的人 - >博客文章随着时间的推移而变化。这可以混淆数字。例如,有一些博客帖子,我可能会省略一小夫一象的功能,但是那些帖子的帖子都包括所有,单独地包括它们。这可以最近解释语言变化的上升,以及为什么他们中的许多人没有被评为“专业”。此外,从“PRS列表”到“发布说明”过滤器的人也随着时间而改变,因此还有一定程度的过滤改变。
进一步复杂化东西,从生锈1.34开始,货物在释放博客岗位中丢失了其部分。货物的大变化仍然进入文本,但之前的帖子有更强大的货物部分,所以我觉得第1.34篇,货物被估计了一点。货物变更是工具链的变化,因此工具箱号码最近的冷静性可能是由于这个。这仍然是好的,因为再次,这个分析是关于读发行说明的人,但值得呼唤。同样,我认为写入图书馆稳定的标准也随着时间的推移而改变了一点;它从更多到更少的全面和又回来了几次。
这是上面提到的一点,但是对于完整性,锈版释放的结构意味着有一个可变标准,因为它将其变成释放帖子。如果它是较小的释放,则可能会出现较小的更改,而如果这些相同的功能处于更大的释放,则可能没有。我认为这方面是拒绝我的假设的重要因素,如上所述。
我认为这里有很有趣的未来研究。我最初试图跟踪贬值和健全的修复,但是健全的修复发生了很少,这不值得谈论。这些42份释放中有7个。这是未来研究的另一个弱点/区域,因为我没有包含点版本,只有1.0释放。这将增加了更多的声音修复,但它也会增加大量随机噪音,在图中没有太大发生,因此这就是为什么我离开那些。他们也不会在相同的常规计划中发生,因此时间会有点好玩......无论如何。折旧也很难跟踪,因为没有很多人,有时候很难说,如果因为健全的问题而被贬值,其他原因。
我的Critera是否添加语法正确?我认为一个合理的人可以说“不”。如果您有一些特殊的套件,并且您更加一般,那么这是一个很好的论点,即它正在删除限制,而不是添加一个功能。但合理的人也可以说你添加了一些东西。我不认为这部分是我的分析的核心,所以我认为我做出了这一决定很好,但如果你不同意,你可能不在乎这个结果。
这种分析并没有进入一些我认为是一个巨大交易的东西:生态系统对语言本身。我只在这里追踪生锈分布本身,但大多数铁锈程序员都使用许多生态系统库。当人们谈论生锈时,他们真的意味着生态系统,而不是语言吗?在某种意义上,这样做是正确的:Rust有一个小标准库意味着您必须使用外部包。如果那些流失了很多,它比在语言本身的流失更好吗?
Rust有一个小标准图书馆吗? 42个版本中有962个变化,每次发布几乎是23个变化。很多人都很小,但仍然是。也许生锈有一个小但深的标准图书馆?由于连贯,我可能会认为这是真的。无论如何,标准图书馆有多大?我只看到了对设计理念的概念的讨论。我从未见过这样的数值分析。这是吗?你知道一个吗?我很想听到它!
我认为标准图书馆更改主导总变化率有很多原因。主要是,博客文章的这一部分往往是最完整的,也就是说,除了总变化量之外,更多的标准库更改使其成为博客文本而不是其他类型的变化。为什么?嗯,它真的很容易测量:计算稳定的东西并将其放在帖子中的一个大清单中。这也是关于如何测量这些变化的;当一个方法被添加到每个数字类型时,那是U8 + U16 + U32 + U64 + U128 = 5个变化,即使概念上它也是一个改变,有一个不同的意义。
这导致另一个关于这些标准库的问题更改:Rust 1.33周围的奇怪峰是什么? 嗯,我们在Rust 1.31中添加了Const FN功能。 在该降落之后,我们可以在标准库中使用多种功能。 这里的最初大部分变化降落在1.33。 它有138个变化,但只有13个不是“这个功能现在是const”。 并且该功能继续在1.33之外推动变化; Const FN在1.31中的初始降落非常有限,并且随着它的扩展,可以使已经存在的更多功能。 总之,即使我仍然认为锈病已经减缓了它的变化率,我认为这是完全有意义的,不是每个人都同意我。 通过一些指标,我只是出错了。