Communications of the ACM上的一篇文章《A Large-Scale Study of Programming Languages and Code Quality in Github》,基于Github上数据收集及分析,研究编程语言对软件质量的影响。
方法论
数据收集
共收集了17 种语言开发的、有 18 年历史的 728 个项目。共包括 29,000 名开发人员、157 万次提交和 564,625 次错误修复提交。
表1: 每种语言Top 3项目
表2:数据集
由于一个项目可能使用多种语言,因此表2的第二列显示以某种容量(该语言至少在项目中有20次提交)使用某种语言的项目总数。我们进一步从项目中排除了该语言提交次数少于 20 次的某些语言。例如,我们发现 220 个项目在 C 语言中使用了 20 多个提交。这确保了每个语言-项目对都有足够的活动。
语言分类
便于后续分析,从不同的维度对编程语言进行了分类。包括编程范式(命名式过程、命名式脚本、函数式)、类型检查(静态检查、动态检查)、隐式类型转换、内存管理方式等维度。
表3: 编程语言的不同分类
识别项目域
便于后续分析,对所有项目进行了领域分类。
表4:领域及特征
Bug分类
通过提交日志对修复的Bug进行分类。根据错误的原因和影响对错误进行分类。原因进一步分为不相交的错误子类别:算法、并发、内存、通用编程和未知。影响也分为四个不相交的子类别:安全、性能、故障和其他未知类别。
表5:Bug分类及在数据集中的分布
统计方法
采用回归方法,使用negative binomial regression (NBR) 方法进行建模。
结果
RQ1. Are some languages more defect-prone than others?
某些语言是否比其他语言更容易出现缺陷?
Result 1: Some languages have a greater association with defects than other languages, although the effect is small.
某些语言与缺陷的关联性比其他语言更大,尽管影响很小。
表6:某些语言比其他语言产生的缺陷更少
RQ2. Which language properties relate to defects?
哪些语言属性与缺陷相关?
Result 2: There is a small but significant relationship between language class and defects. Functional languages are associated with fewer defects than either procedural or scripting languages.
语言等级和缺陷之间存在微小但显着的关系。与过程语言或脚本语言相比,函数式语言的缺陷更少。
表7:与其他语言类别相比,函数式语言与缺陷的关系较小,而过程性语言则大于或接近平均值
RQ3. Does language defect proneness depend on domain?
语言缺陷倾向是否取决于领域?
Result 3: There is no general relationship between application domain and language defect proneness.
应用领域和语言缺陷倾向之间不存在一般关系。
RQ4. What is the relation between language and bug category?
语言和 bug 类别之间有什么关系?
Result 4: Defect types are strongly associated with languages; some defect type like memory errors and concurrency errors also depend on language primitives. Language matters more for specific categories than it does for defects overall.
缺陷类型与语言密切相关;某些缺陷类型(例如内存错误和并发错误)也取决于语言原语。语言对于特定类别的影响比对于整体缺陷的影响更大。