最近,ACM发布了一份关于编程语言对软件质量影响的研究报告,其中有一些关于bug的有趣发现。研究人员BaishakhiRay、DarylPosnett、PremkumarDevanbu和VladimirFilkov使用GitHub数据对程序员之间关于哪种编程语言最适合特定任务的争论进行了大规模的实验调查。通过多元回归建模、可视化和文本分析的结合,研究所研究静态和动态语言的属性,以及编程语言对软件质量的影响。分析得出的结论可以简单表述为:语言设计确实对软件质量有显着影响。最值得注意的是,似乎不允许类型混淆比允许它稍微好一些,静态类型也比功能语言中的动态类型好一些。我们还发现函数式语言比过程式语言稍微好一些。本研究的目的是阐明编程语言是否可以影响编程的过程和结果,重点是静态语言和动态语言的比较:静态类型语言的拥护者坚信静态可以及早发现缺陷,对他们来说,预防远比治疗好得多;而动态类型语言的拥护者则认为,保守的静态类型检查是对开发资源的浪费,可以依靠强大的动态类型检查来捕获类型错误。当然,这些争论大多还停留在纸上谈兵阶段,缺乏事实证据的支持。对于本次调查,团队选择了GitHub上排名前19位的编程语言,将TypeScript添加为第20位编程语言,然后抽取了每种语言编写的排名前50位的项目,同时丢弃了少于28次提交的前19位。次,如果项目以多种语言提交,少于20个以该语言提交的有效提交也将被丢弃。然后,如上表所示,该研究分析了使用17种语言开发的728个项目。这些项目跨越了18年的历史,包括29,000名不同的开发人员、157万次提交和564,625次错误修复提交。接下来,团队定义了语言类,区分了三种编程范式:过程式、脚本式和函数式;两种类型检查:静态和动态;是否禁止或允许隐式类型转换,以及托管或非托管内存:通过关键字搜索10%的错误修复消息来训练错误分类器,研究人员确定了每个错误修复提交的原因和影响。第一个要解决的问题是“是否有些语言比其他语言更容易出错?”这是使用回归模型来比较每种语言对所有语言的错误平均数量的影响,并针对错误修复提交:这里在表的顶部是用于控制可能相关的因素的变量。项目年龄主要反映了一些事实,在一些较旧的项目中,通常有更多的错误修复;涉及的开发人员数量和项目的原始大小也会影响错误的数量,最终提交的数量也是如此。具有最大正系数的语言,即与错误修复更相关的编程语言,是c++、C、objective-C、PHP和Python。Clojure、Haskell、Ruby和Scala都有显着的负系数,这意味着这些语言不太可能导致错误修复提交。对于语言类,函数式语言比过程语言或脚本语言更容易出现错误研究人员接下来将注意力转向了错误的倾向,即每种语言中错误修复与提交总数的比率,并生成了一个热图,其中颜色较深表明更高的错误倾向:从上面的热图中可以得出结论,应用领域和语言缺陷倾向之间没有普遍的关系。但观察语言类与错误类别的关系表明:缺陷类型与语言密切相关;一些缺陷类型如内存错误和并发错误也依赖于语言原语。对于特定的类,语言比整体缺陷更重要。由于此热图显示了Proc-Static-Implicit-Unmanaged类与并发和内存错误之间的密切关系。这也表明静态语言一般更容易出现故障和性能错误,其次是Erlang等Functional-Dynamic-Explicit-Managed语言。最终结论数据表明,函数式语言优于过程式语言,隐式类型转换不允许比允许更好;静态类型优于动态类型。此外,托管内存使用情况优于非托管内存。此外,语言的错误倾向通常与软件领域无关。此外,与整体错误相比,语言与单个错误类别的相关性更高。
