最近,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類別相關。
原文轉自:http://www.techug.com/post/most-bug-programming-language.html