是否有关于静态和动态类型语言有效性的研究?
尤其是:
- 程序员生产力的度量
- 缺陷率
还包括是否采用单元测试的影响。
我已经就双方的优点进行了很多讨论,但我想知道是否有人对此进行了研究。
是否有关于静态和动态类型语言有效性的研究?
尤其是:
还包括是否采用单元测试的影响。
我已经就双方的优点进行了很多讨论,但我想知道是否有人对此进行了研究。
Answers:
一些建议阅读:
不完全是静态类型,而是相关的:
关于该主题或程序的静态分析的一些有趣的文章或文章:
对于那些想知道这到底是什么的人:
但是,我怀疑其中任何一个都不能直接给您答案,因为它们不能完全满足您的需求。他们将是有趣的读物。
亲身,我坚信静态类型优于动态类型有助于错误检测。我花太多的时间在JavaScript甚至Ruby代码中寻找拼写错误和诸如此类的小错误。关于动态键入可以提高生产率的观点,我认为这主要归功于工具。如果静态类型语言具有正确的工具来允许后台重新编译并提供REPL接口,那么您将获得两全其美的好处。例如,Scala提供了此功能,它使在交互式控制台中学习和原型化变得非常容易,但是却为您提供了静态类型化(以及比许多其他语言(除了ML语言)更强大的类型系统)的好处。同样,我也不认为使用Java或C ++会导致生产力下降(因为使用了静态类型),只要我使用可以帮助我的IDE。当我仅使用简单的配置(编辑器+编译器/解释器)恢复编码时,就会感到更加麻烦,动态语言似乎更易于使用。但是您仍然在寻找错误。我猜人们会说工具问题是一个可逆的论点,好像工具更适合动态语言,那么大多数错误和错别字都会在编码时指出,但这在我看来反映了系统的缺陷。尽管如此,我通常还是使用JRuby进行原型设计,并且稍后会用Java编写大多数代码。好像工具对于动态语言来说更好,那么大多数错误和错别字都会在编码时指出,但这在我看来反映了系统的缺陷。尽管如此,我通常还是使用JRuby进行原型设计,并且稍后会用Java编写大多数代码。好像工具对于动态语言来说更好,那么大多数错误和错别字都会在编码时指出,但这在我看来反映了系统的缺陷。尽管如此,我通常还是使用JRuby进行原型设计,并且稍后会用Java编写大多数代码。
警告:这些链接中的某些链接是不可靠的,有些链接通过各种计算协会的门户使用会员的收费访问方式。抱歉,我尝试为每个链接查找多个链接,但是它不如我希望的那样好。
就在昨天,我发现了这项研究:单元测试还不够。您还需要静态输入。
基本上,作者使用的工具能够将项目从非静态类型的语言自动转换为静态类型的语言(Python到Haskell)
然后,他选择了许多开源Python项目,这些项目还包括相当数量的测试单元,并自动将它们转换为haskell。
Haskell的翻译揭示了一系列与变量类型有关的错误:测试单元未发现这些错误。
这是一个起点:
本文挑战了普遍接受的观点,即在其他条件相同的情况下,程序员每次编写相同数量的代码行,而与语言无关。换句话说,本文应作为经验证据,证明机械生产率(编写的代码行)不是衡量功能生产率的好方法,并且至少必须通过语言对其进行规范化。
我发现了静态语言与动态语言:文献综述,其中列出了有关该主题的一些研究,并对每项研究给出了很好的总结。
这是执行摘要:
在对照实验中,只有三个实验显示出足够大的作用,对任何实际意义都没有。Prechelt研究比较了C,C ++,Java,Perl,Python,Rexx和Tcl;Endrikat的研究比较了Java和Dart;和Cooley的VHDL和Verilog实验。不幸的是,它们都有问题,很难得出一个真正有力的结论。
在Prechelt研究中,动态语言和打字语言的总体有所不同,任务的条件也有所不同。有一项后续研究通过邀请Lispers提出自己的解决方案来说明该问题,其中包括将Darius Bacon等人与随机的本科生进行比较。从字面上看,后续工作涉及将Peter Norvig的代码与随机大学生的代码进行比较。
在Endrikat的研究中,他们特别选择了一项任务,他们认为静态打字会有所作为,并且他们从每个人都使用静态打字语言上课的人群中吸取了他们的研究对象。他们没有评论学生是否有使用动态类型语言的经验,但是可以肯定的是,假设大多数或所有人对动态类型语言的经验较少。
库利的实验是少数吸引非学生人群的实验之一,这很棒。但是,与所有其他实验一样,该任务是一件琐碎的玩具任务。尽管似乎很遗憾,没有VHDL(静态语言)参与者能够按时完成任务,但要在学校项目以外的任何地方花1.5个小时完成硬件设计是非常不寻常的。您可能会争辩说,一个大型任务可以分解为许多较小的任务,但是似乎可以反驳的是,使用VHDL的固定成本可以分摊到许多任务中。
至于其余的实验,我从中得到的主要结论是,在研究中描述的特定情况下,任何影响(如果存在的话)都是很小的。
继续进行案例研究,发现两个bug的案例研究引人入胜,但它们并没有真正为类型辩护。一个例子表明,将Python程序转录到Haskell会发现非零数量的严重性未知的错误,而这些错误可能是通过面向行覆盖率的单元测试发现的。这对Erlang论文表明,您可以使用静态分析找到通过任何类型的测试都很难发现的错误,其中一些是严重的。
作为用户,当我的编译器在运行单独的静态分析工具之前给我一个错误时,我觉得很方便,但这是次要的,甚至可能比上面列出的受控研究的效果还小。
我发现0install案例研究(将各种语言与Python进行了比较,最终选择了Ocaml)是我遇到的更有趣的事情之一,但这是每个人都会以不同的方式主观理解的东西,您可以通过观察。
这符合我的印象(在我的世界的小角落,ACL2,Isabelle / HOL和PVS是最常用的证明,并且人们在解决行业问题时会更喜欢自动化,这是有道理的)也很主观。
然后有一些研究可以从现有项目中挖掘数据。不幸的是,我找不到任何为确定因果关系做任何事情的人(例如,找到合适的工具变量),因此他们只是测量相关性。一些相关性是出乎意料的,但是没有足够的信息来确定原因。
仅有的数据挖掘研究无需进一步研究即可显示可能有趣的数据,这是Smallshire对Python错误的回顾,但有关方法的信息不足以弄清楚他的研究的真正意义,并且不清楚他为什么暗示要研究其他语言的数据而不显示数据3。
研究中的一些显着遗漏是使用经验丰富的程序员进行的综合研究,更不用说拥有大量“好”或“坏”程序员的研究,着眼于任何接近重大项目的项目(在我工作过的地方,三个月的项目会被认为很小,但比对照研究中使用的任何项目大多个数量级),使用“现代”静态类型语言,使用渐进/可选类型,使用现代主流IDE(例如VS和Eclipse),使用现代基本IDE (例如LightTable),使用老式的编辑器(例如Emacs和vim),在不重要的代码库上进行维护,使用类似于实际环境的任何内容进行维护,在您已经熟悉的代码库上进行维护等。
如果您查看有关这些研究的互联网评论,其中大多数都是为了证明一种观点或另一种观点是正确的。关于动态与静态的Prechelt研究以及对Lisp的后续研究一直是动态语言倡导者的长期偏爱,并且github挖掘研究最近在函数式程序员中变得很流行。
老实说,我认为静态与动态类型不是真正的问题。
我认为应该首先考虑两个参数:
如果您熟悉该语言,则可以编写代码,并轻松查找错误。
如果您编写解耦的代码并广泛地测试每个功能,那么您将产生完善的代码,从而提高了工作效率(因为如果您不评估产品的质量就无法达到生产效率的标准吗? )
因此,我认为关于生产率的静态与动态辩论是没有争议的,或者至少在很大程度上被其他考虑所取代。
这里有一些:
Stefan Hanenberg。2010。关于静态和动态类型系统的实验:对静态类型系统对开发时间的积极影响的怀疑。在面向对象编程系统语言和应用程序的ACM国际会议论文集(OOPSLA '10)中。美国纽约州纽约市,ACM,22-35。DOI = 10.1145 / 1869459.1869462 http://doi.acm.org/10.1145/1869459.1869462
Daniel P. Delorey,Charles D. Knutson,Scott Chun,“编程语言会影响生产力吗?使用开源项目数据进行案例研究”,牙线,第8页,第一届FLOSS研究与开发的新兴趋势国际研讨会(FLOSS '07:ICSE Workshops 2007),2007
戴利 Sazawal,V.,Foster,J .:《进行中的工作:Ruby中的静态类型的实证研究》,编程语言和工具的评估和可用性研讨会(PLATEAU),位于ON-WARD 2009。
Lutz Prechelt和Walter F. Tichy。1998.评估过程参数类型检查好处的受控实验。IEEE Trans。软。。24,4(1998年4月),302-312。DOI = 10.1109 / 32.677186 http://dx.doi.org/10.1109/32.677186