パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

プログラミング言語がソフトウェアの品質に与える影響」記事へのコメント

  • by Anonymous Coward on 2014年11月08日 20時57分 (#2708258)

    どうやら、コミットログから不具合修正らしきものの割合を算出して、「不具合の作り込みやすさ」を比較する手法のようです。

    言語のカテゴリごとの結果(数値が小さいほうが不具合が少ない、カッコ内は標準誤差):

    Category Coef. Std. Err.
    Functional-Static-Strong-Managed −0.25 (0.04) ∗∗∗
    Functional-Dynamic-Strong-Managed −0.17 (0.04) ∗∗∗
    Proc-Static-Strong-Managed − 0.06 (0.03) ∗
    Script-Dynamic-Strong-Managed 0.001 (0.03)
    Script-Dynamic-Weak-Managed 0.04 (0.02) ∗
    Proc-Static-Weak-Unmanaged 0.14 (0.02) ∗∗∗

    カテゴリはそれぞれ、関数型・手続型・スクリプト言語の区別(Functional/Proc/Script)、コンパイル時の型チェック有無(Static/Dynamic)、型付けの強弱(String/Weak)、メモリ管理(Managed/Unmanaged)の意味のようです。

    各カテゴリに属する言語は以下のとおりです。

    Functional-Static-Strong-Managed: Haskell、Scala
    Functional-Dynamic-Strong-Managed: Clojure、Erlang
    Proc-Static-Strong-Managed: C#、Java、Go
    Script-Dynamic-Strong-Managed: Python、Ruby
    Script-Dynamic-Weak-Managed: Perl、PHP、JavaScript
    Proc-Static-Weak-Unmanaged:C、C++、Objective-C

    「コンパイル時の型チェック」と「型付けの強弱」が分けられているのが曲者で、C/C++はコンパイルの時の型チェックはStaticだが、弱い型付け(Weak)とされています。一方、RubyやPythonはコンパイル時の型チェックはDynamicだが、強い型付け(Strong)になっています。JavaScriptやPerl、PHPはDynamicかつWeakに分類されています。

    結果から言えそうなのは、(1) 関数型言語はバグが少ない、(2) C/C++/Objective-Cはバグが多い、(3) それ以外の言語はあまり変わらない。といったところでしょうか。議論されることの多い、Proc-Static-Strong(JavaやGo)とScript-Dynamic-Strong(RubyやPython)の相違については、品質の差はあまり大きくなさそうです。

    さらに言語ごとの結果です(読み方は上と同じ):

    C 0.15 (0.04) ∗∗∗
    C++ 0.23 (0.04) ∗∗∗
    C# 0.03 (0.05)
    Objective-C 0.18 (0.05) ∗∗∗
    Go −0.08 (0.06)
    Java −0.01 (0.04)
    CoffeeScript 0.07 (0.05)
    JavaScript 0.06 (0.02) ∗∗
    TypeScript −0.43 (0.06) ∗∗∗
    Ruby −0.15 (0.04) ∗
    Php 0.15 (0.05) ∗∗∗
    Python 0.10 (0.03) ∗∗
    Perl −0.15 (0.08)
    Clojure −0.29 (0.05) ∗∗∗
    Erlang −0.00 (0.05)
    Haskell −0.23 (0.06) ∗∗∗
    Scala −0.28 (0.05) ∗∗∗

    同じカテゴリの言語でも、Perl(-0.15)とPhp(0.15)、Clojure(-0.29)とErlang(-0.00)のように、けっこうばらけていて、カテゴリ分けの妥当性に若干疑問が生じますが、総じて関数型言語が優秀なのは確かなようです。上の方のコメントでRubyがディスられていましたが、Rubyは関数型言語に次いで優秀という結果になっています。

    • JavaScriptに比べてTypeScriptが最強すぎなんですけど…。

      言語そのものの特徴以外に、コードかいてる人間が、好き好んでその言語を選んだのか、仕方なくその言語で書いているか、でも違ってきそうな気がする。

      その言語が好きなら、仕様とか設計思想とかまで知りたくなるから、そういうことを理解した上でコードを書く。結果バグが減る。

      C、C++、Obj-C、Java、PHPあたりは、もうその言語で書かれ始めちゃってる、とか、その言語しかサポートされてない、って理由で仕方なく選択されている可能性が高い。なので、その言語に愛着はないけどコーディングしているって人も多いはず。
      そうなると、言語仕様に対する探究心も薄くなるし、言語設計者の意図に沿わないようなコーディングも多くなる。結果バグの発生率が上昇する。

      なので、TypeScriptみたいにマイナーな言語の方がコードの品質が高いのは、「敢えて好き好んでその言語を使っている」って人が多いってのも影響してそう。

      親コメント
      • by Anonymous Coward

        JSの場合、型どーとかよりも。。。
        src=なんちゃらの奴が運悪く取得失敗とか、コンテンツ全体で最終的に何が入ってくるのか分からない部分がなんとも。。
        ※同一ページに埋め込む処理を複数チームが作ってて関数名ぶつかってたとか。。

      • by Anonymous Coward

        むしろ、「バグを直せる人がいない」からバグったままなのではないかと。

        バグの発見には言語知識が必要なかったとしても、特定と修正には必須ですし。

      • by Anonymous Coward

        言語が好きすぎて言語設計者の意図に沿わないようなコーディングまでしちゃうってのもCやC++だとある気もする。

        • by Anonymous Coward
          C/C++の場合、使う側も慎重なので(ヤバイとみんな分っているから)、そういうので問題にはち合わせる事は無い印象
          テンプレートメタプログラミングライブラリなんかはどれ程ヤバそうに見えても、少し追ってみると恐ろしく慎重に書かれていて意外と問題ないかなと
          この言語は malloc new 関係と例外処理にヤバサが凝縮されていると思う
          もっとも、逆にそれがなければ言語の存在意義そのものに関わるのですが・・・
    • by Anonymous Coward
      今まで使いこんだことのある言語で、実感的には

      Haskell > C# > Java > Python > JavaScript > C > C++ だったな・・・

      あまり当てにならない印象
      Rubyもおさわり程度に使った事が有るけど、強靭とは思えなかった
      Scala評価高いな、次はこれ勉強してみよう
      • by Anonymous Coward

        評価が高いがねなんはもっと高いのだ

    • by Anonymous Coward

      ソースの複雑性とかも入れないとわかんないと思うけどなあ。
      hello worldならどの言語でもバグが入らないだろうし、OSレベルに複雑ならどの言語でもバグは入るだろうし。

      • by Anonymous Coward
        肝心なところは、人間のミスをどの程度コンパイラ側でエラーとして判別できるかという点になると思うな
        人間がしでかすミスをミスと認識できない文法は、あんまり良くない

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

処理中...