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