当前位置: 首页 > news >正文

某些编程语言更容易出错?研究人员提出质疑

在人们的印象中,使用某些编程语言往往更容易出现bug,但是这种印象基本还处于比较“唯心”的阶段,在近来的研究中几乎没有发现有力的证据。

在2014年软件工程基础(FSE)大会上发表的一篇学术论文“A Large Scale Study of Programming Languages and Code Quality in Github”声称,某些计算机编程语言具有更高的代码错误率,并由此引发了一场开发者大讨论。

这篇论文由加州大学戴维斯分校计算机科学家Baishakhi Ray、Daryl Posnett、Vladimir Filkov和Premkumar Devanbu共同撰写,论文指出,使用C语言、C++、Objective-C、JavaScript、PHP和Python编写的代码比其他语言包含了更多的缺陷。

来自马萨诸塞州阿默斯特大学、美国东北大学和布拉格捷克技术大学的计算机科学家们试图重现这项研究结果。

在最近的一篇题为“On the Impact of Programming Languages on Code Quality”的ArXiv论文中,Emery Berger、Celeste Hollenbeck、Petr Maj、Olga Vitek和Jan Vitek重新回顾了2014年论文中的四个主要发现,以此来评估有关编程语言设计重要性的假设。

但他们并没有发现任何有力的证据。他们尝试重现2014年的研究成果,但大多以失败告终。他们的分析表明,C++代码中实际出现的缺陷比它们应该出现的频率更高,但即便如此,他们认为,这从统计学方面来看仍然是无关紧要的。

相关性和因果关系

马萨诸塞州阿默斯特大学计算机科学教授Emery Berger在接受“The Register”的电话采访时表示,最重要的是要区分重现失败的含义和实际情况之间的区别。

他说,最初的研究旨在建立编程语言与缺陷之间的相关性,而人们误将这种相关性看成是一种因果关系。

Berger说,“这并不意味着它就是不对的,只能说明他们的很多说法站不住脚。在数据科学家们当中流行着一个玩笑——如果你对数据进行足够长时间的折磨,它们最终会说话。仅仅因为拥有数据并不意味着它们就是建立某些特定主张的正确数据。GitHub代码库的数据是一个很好的资源,但并不能通过分析这些数据来确定所有的事实”。

2014年分析GitHub代码得出的发现还包括:

  • “某些语言与缺陷的相关性比其他语言更高,尽管效果没有那么明显。”

  • “语言类别和缺陷之间存在着一个很小但却很重要的关系。函数式语言与缺陷的相关性比过程式语言或脚本语言要小一些。”

  • “领域和语言缺陷倾向之间不存在一般性关系。”

  • “缺陷类型与语言密切相关。”

但是,当研究人员试图重现早期的研究结果时,大多数情况下却做不到。对于第一个命题,他们在编程语言与其缺陷数量关系方面发现了一些细微差别,但这并不重要。

他们无法重现其余三个命题的结果,最后两次试图重现结果的努力因数据缺失而以失败告终。

这是一门科学

Berger、Hollenbeck、Maj和Vitek在他们的论文中写道:“我们已经发现FSE研究中存在很多问题,这些问题导致其关键结果无效。我们的目的不是要责备谁,基于大规模代码库对编程语言进行统计分析本来就是一件很困难的事情”。

未能重现结果并不意味会得出相反的结果:无论是使用函数式、过程式还是面向对象编程语言并不重要,语言是静态类型的还是动态类型、是强类型的还是弱类型的也不重要。实际上,数据并没有告诉我们这些信息。

Berger表示,除了这项研究之外,更重要的是编程语言是否会产生影响。

他说:“我心里是这么认为的,但在现实当中不可能通过实验来证实”。

他说,使用Haskell的程序员比普通Python程序员受过更多的学术训练,“我们假设Haskell程序的错误更少,可能是因为使用Haskell的程序员大都拥有博士学位”。

换句话说,有很多上下文信息没有被纳入到GitHub的数据分析中。

结果的反面是科学的运作方式、实验结果应该针对可重复性进行测试,但这种情况通常不会发生。《自然》杂志2016年发布的一份报告显示,在接受调查的1576名科学家中,有一半甚至无法重现自己的研究成果。

值得称赞的是,研究人员最初预见了工作中存在缺陷的可能性,并指出了在结论有效性方面存在的几个潜在威胁。

这些研究人员对数据科学陷阱提出了警告,并强调了通过自动化研究来实现可重现研究的必要性。

他们总结说:“虽然统计分析与大数据语料库相结合是一种强大的工具,可以用来解答最难的研究性问题,但这些研究所涉及的工作量以及出错的可能性是巨大的”。

英文原文:https://www.theregister.co.uk/2019/01/30/programming_bugs
学术论文 A Large Scale Study of Programming Languages and Code Quality in Github:http://web.cs.ucdavis.edu/~filkov/papers/lang_github.pdf
学术论文 On the Impact of Programming Languages on Code Quality:https://arxiv.org/pdf/1901.10220.pdf

相关文章:

  • 通过npm或yarn自动生成vue组件
  • EOS是什么
  • 互联网大厂Java面试题:使用无界队列的线程池会导致内存飙升吗?
  • App Store 隐私政策网址(URL)
  • 企业级java springboot b2bc商城系统开源源码二次开发(十六)用restTemplate消费服务...
  • GraphQL 官方自述文档(翻译)
  • 网页视频流m3u8/ts视频下载
  • OS开发基础——多线程的简单应用
  • 阿里云ACE认证学习知识点梳理
  • 二、flask配置与应用-flask
  • Linux下的计算器(bc、expr、dc、echo、awk)知多少?
  • CH2601 电路维修(双端队列bfs)建图恶心
  • 新书推荐|Windows黑客编程技术详解
  • 大主子表关联的性能优化方法
  • 5G一周热闻:华为夺联通5G大单,首张5G电话卡发放
  • 分享一款快速APP功能测试工具
  • Angular 响应式表单 基础例子
  • go语言学习初探(一)
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Javascript编码规范
  • js递归,无限分级树形折叠菜单
  • Laravel 菜鸟晋级之路
  • Linux快速复制或删除大量小文件
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python实现BT种子转化为磁力链接【实战】
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 创建一个Struts2项目maven 方式
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端存储 - localStorage
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 收藏好这篇,别再只说“数据劫持”了
  • 首页查询功能的一次实现过程
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • (26)4.7 字符函数和字符串函数
  • (27)4.8 习题课
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (四)c52学习之旅-流水LED灯
  • (转)C#调用WebService 基础
  • (转)http协议
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .net项目IIS、VS 附加进程调试
  • .NET值类型变量“活”在哪?
  • [Android 13]Input系列--获取触摸窗口
  • [Android]How to use FFmpeg to decode Android f...
  • [Bugku]密码???[writeup]
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [bzoj4010][HNOI2015]菜肴制作_贪心_拓扑排序