パスワードを忘れた? アカウント作成
11916536 story
プログラミング

Javaで書かれたソースコードの大部分は冗長? 32

ストーリー by hylom
なんとも難しい 部門より
insiderman 曰く、

本家SlashdotでYour Java Code Is Mostly Fluff、New Research Finds(あなたのJavaコードの大半は無駄なもの、新たな研究で判明)なる記事が出ている。元ネタはITworld

さらにその元ネタの論文を見ないとなかなか意味が把握しにくいのだが、自然言語による文章解析をプログラムコードにも適用したところ、そのような結果が得られたという話のようだ。

自然言語で書かれた文章は、その一部の単語がなくなったとしても意味を把握できることが多い。このように文中でなくなっても意味が変わらない単語を「chaff」(もみ殻)と呼び、逆にその単語がなくなると意味が分からなくなる/意味が変わってしまう単語は「wheat」(小麦)と呼ぶという。自然言語でこのような「chaff」と「wheat」を抽出する手法をプログラミング言語にも応用してJavaソースコードを分析したところ、「wheat」に相当する部分はソースコードの約5%程度で、残りの95%はなくなっても意味が変わらない「chaff」に相当する、という話だそうだ。

実際、ソースコードの多くが冗長であると言われても確かにそうなのだが、自然言語処理の話をプログラミング言語に適用するのはやや乱暴な気はする。そういった冗長な部分こそ自動生成できないケースも多いわけで、プログラマの作業の大半は不毛だと言われても納得してしまうが。

  • by Anonymous Coward on 2015年02月14日 8時36分 (#2760818)

    複数のプログラミング言語を比較した結果Javaがそうだった、ならJavaには冗長になるような特徴があるということでちょっと興味深いけど、
    自然言語とプログラミング言語(その代表としてJava)を比較した結果プログラミング言語は冗長という話だと、
    まあプログラミング言語って自然言語とは違うから…としか言えない気がする。
    (論文チラ見したけど、プログラミング言語別の比較表とかはなさそうな雰囲気。後者?)

    ここに返信
    • by Anonymous Coward

      自動生成されたアクセサとか、そういう無駄なものが多いということでないの。
      言語に用意されてないから。

  • パリティビットは冗長だから削除しましょうとか言いたいの?

    冗長性がないと、スペルミス一つ検出できなくなるよ。
    いわゆるマシン語に比べてプログラミング言語の良さは、冗長性があること。

    ここに返信
  • by Anonymous Coward on 2015年02月14日 9時10分 (#2760830)

    その5%で、元の100%のプログラムと同じ機能を持つものを作ってみてほしい。
    それをして、初めて「95%は冗長だった」と言えるんじゃないの?

    ここに返信
  • by Anonymous Coward on 2015年02月14日 8時05分 (#2760814)

    なら納得だが

    ここに返信
    • by Anonymous Coward

      色々な場所に同じ内容を書かなきゃいけないところもねw
      とりわけ関数型系の言語を使った後だと組んでいても冗長だなと感じることもままあり

    • by Anonymous Coward

      コメントを書かない代わりに、クラス名や変数名、メソッド名を冗長にしてるんです。
      ・・・っていう手法が出てくんないかなぁ。

      • by Anonymous Coward on 2015年02月14日 9時53分 (#2760855)

        >コメントを書かない代わりに、クラス名や変数名、メソッド名を冗長にしてるんです。

        Clean Codeとか、結構その手法を推奨している書籍はある気がします(なおこれもJavaの本)。
        最も、提唱者はだいたい英語圏の人で、英語ネイティブではない日本人がそれを猿真似すると、多くの場合悲惨な目にあいますが・・・。

        # 動詞と形容詞と動名詞の区別も付かない開発者たちにその手法を適用した結果、意味も分からずコメントもなくなったソースを前にして。

        • by Anonymous Coward

          そうなんだよね。
          英語はある程度読めるけど英文はたいしてかけない民族であることを前提にしないで
          というか現場という現実も顧みずになんのアレンジもなく理想のまま適用するとひどい目になる。
          まさになんとかの一つ覚え。(でもやりたいから推し進めたくなるんだよね)

          アンクルボブは好きだけど、あれはそのまま適用できないよね。

    • by Anonymous Coward

      パブリックやらプライベートやら一々言葉が多い

    • by Anonymous Coward

      インデントのタブとか無駄だよね?
      とかそういう話かもしれない。

  • by Anonymous Coward on 2015年02月14日 8時29分 (#2760816)

    まさか識別子のうち辞書に載ってるもののユニーク数を数えてるだけだったりしないよな?

    ここに返信
    • by Anonymous Coward

      int number = 1192;のintは自然言語的には不要でしょう。
      誰が見ても1192が整数であることは明白なのでわざわざ説明する必要はない。

      • by Anonymous Coward

        プログラミング言語でも言語によっては不要だし。(静的型付けでないとか型推論があるとか)

    • by Anonymous Coward

      それにかなり近いです。
      プログラミング言語の文脈等はほとんど考慮されていません。

      1. 関数定義をトークン分け。
      2. トークン列を抽象トークン列に変換。
      3. 抽象トークン列からトークンの順序構造を取り除いて、抽象語彙集合を作る。
      4. それぞれの関数定義の抽象語彙集合の部分集合のうち、全ての関数定義で部分抽象語彙集合が異なっていて、最も大きさが小さくなる様に取る(最小部分中小語彙集合)。
      5. 抽象語彙集合と最小部分中小語彙集合の大きさの比が冗長度を表していると考えられる。

  • by Anonymous Coward on 2015年02月14日 9時03分 (#2760825)

    オブジェクト指向っていうのは、つまるところコードを意味と機能に分割するプログラミング手法だ。
    機能を括りだして下位に置くようにプログラムを作って、意味を浮き出せる。
    95%に意味がなかったということは、コードの5%にまで抽象化が完成しているということでは。

    素晴らしいと思うねどな。
    #かなり雑談です。

    ここに返信
  • by Anonymous Coward on 2015年02月14日 9時08分 (#2760829)

    言語によっては文法は通常の英語と異なる。
    どうせならコメント文の冗長性を調べたほうが面白い。

    ここに返信
    • by Anonymous Coward

      どうせ調べるならApple Scriptとかにしておけばいいのに。あれは英語の文法ほぼそのままで書けると言ってもいいので、少なくともJavaを自然言語解析するよりかはもっともらしい結果が得られるはず。

      # そもそも自然言語とは、全く似ても似つかないプログラミング・スクリプト言語を自然言語解析しようと思うことがアレゲだ、とは言っちゃだめ。

  • by Anonymous Coward on 2015年02月14日 9時31分 (#2760842)

    他人の書いたソースコードを読むのがかったるいのがJava
    この20年間Java自身も改良されてるけど根本的に治らないから無理

    ここに返信
    • by Anonymous Coward

      10年前に書いた自分のコードですら読むのがかったるいです。

      • by Anonymous Coward

        10日前に書いた自分のコードを読むのもかったるいです。

    • by Anonymous Coward

      メモリ解放書かなくて良いCみたいな使われかたしてる問題もあるかと。。
      main以外禁止とか、コピペとか。

      オブジェクト指向、Javadocでのドキュメント一元化を全力否定した使い方の多さときたらね。。

  • by Anonymous Coward on 2015年02月14日 10時36分 (#2760866)

    どれが冗長なものなのか論文眺めてもよくわからない... 一応後の方の表でValiable IdentifierとかType IdentifierとかOperator,literal等に分類して集計されてるんですがそれもどっちに所属するかが全然わかりません。
    なんか議論しにくいですなあ。だれか分類たのんます。

    ここに返信
  • by Anonymous Coward on 2015年02月14日 10時45分 (#2760871)

    単語レベルでいらないものってそうそうないと思いますから、キーワードの構成文字数なんかが指標としてよいかと。

    たとえば...
    * rustはキーワードを短くしてコードを短くする工夫が随所に見られます。functionをfnにしてみたり。
    * VBの FUNCTION ~ END FUNCTION を見ると、Cならfunctionすら使わず{}でわずか2文字、返り値がvoidならsubもこなすと考えると短い。
    * JavaScriptのファイルを圧縮するYUI Compressorは不要スペース文字をつぶして変数名をaとかbにしてしまうことで文字数を徹底的に削り、可読性を犠牲にコンパクトにしています。言語仕様ではないけれど一つの極端な例として頭の片隅に。ハンガリアン記法なんかと好対照です。

    ここに返信
    • by Anonymous Coward

      > ハンガリアン記法なんかと好対照です。

      ハンガリアン記法は変数名をコンパクトにするために編み出されたものなんだが?

  • by Anonymous Coward on 2015年02月14日 11時18分 (#2760881)

    ってのは普通によくあることだよね。
    職業プログラマでない学者さんには理解できないかもだけど。
    「メンテハッチを全廃すれば大幅にコストダウンできますよ!」と言ってるのと同じくらい愚にもつかない研究。

    ここに返信
    • by Anonymous Coward

      むしろ職業プログラマなら将来の再利用や拡張への備えはだいたい無駄になるということを学習していそうなものだが。

typodupeerror

一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy

読み込み中...