
ソースコードで最もよく使われる単語が明らかに 93
ストーリー by headless
単語 部門より
単語 部門より
あるAnonymous Coward 曰く、
英文で最も多く使われるアルファベットが「e」だというのはよく知られていますが、最も多く使われる単語は「the」だそうです。プログラミング言語ではどうなのか、GitHubで公開されているソースコードを解析した結果が発表されました(The Most Frequent Word in Source Code on GitHub: PDF)。
調査ではソースコードからコメント行を除外し、アルファベットと数字のみが連続する部分を単語として検出しています。調査対象となった10種類のプログラミング言語全体で、ソースコードに最も多く登場する単語はなんと「0」で、次に「if」が続くという結果になっています。
「if」のように良く使われそうな予約語が1位というのなら解りやすいのですが、「0」が圧倒的多数で1位の座を獲得したことに素直に驚きました。マジックナンバーは使用厳禁と言いながらも、考えてみれば初期化等に使う「0」だけは、ひとつの意味をもった定数であるかのごとく無意識のうちにそこら中で使っていることに気付いた次第です。その他にもプログラミング言語が自然言語の特性を持つかジップの法則を使って検証しており、どの言語がより自然言語に近いか検証していて面白いですよ。
プログラミング言語別にみると、「0」が1位なのはC、C++、JavaScriptのみ。5言語では5位以下となっている。JavaScriptでは上位20個のうち14個が1文字の単語だ。一方、「if」はRubyを除く9言語で5位以内に入っている。
Rubyの上位 (スコア:4, 参考になる)
>一方、「if」はRubyを除く9言語で5位以内に入っている。
Rubyの上位はなんなんだ、とソースを見てみたら、
という結果。たしかにRubyらしいという気がする。
class-end, def-end, begin-end, といろんなブロック構文の終了にendを使うので、終わらせる方が始めさせる方より多いというちょっと不思議な結果に。
それ以外の結果からは、なんかRubyistはテストばっかり書いてるんじゃないかという気がしてきます。
(たぶんRSpecみたいな、テスト記述用の「単語」が使える仕組みがあるからでしょうかね?)
Re:Rubyの上位 (スコア:1)
0より1の方が多いのって、なんか理由あんの?
1を聞いて0を知れ!
Re:Rubyの上位 (スコア:4, 参考になる)
++が無くて+=1と書くとか、配列の最後の要素がa[-1]だったりとか、範囲オブジェクトを作る場合1..nと書く場合が多いとか、$1を多用するとかが考えられます。
特にPythonとの違いは$1が効いているようです。
例えばRuby 1.9.1の標準ライブラリにおいて、"$1"は613ファイル中428回出現します。
一方、Python 2.7.3においては、/[[::]]/は1444ファイル中147回しか出現しません。
Pythonでは正規表現のグループに名前を付けて参照する形式が使われるらしく、/[[::]]group(/は349回出現します(ちなみに/[[::]]group()/は22回出現します)。
どちらにしろ、正規表現を使う頻度自体もRubyの方が多いようです。
# というか標準ライブラリだとPythonも0より1の方が多い。コメントを除外していないとか語の定義が違うとかで数え方が違うというのもあるけど。
Re:Rubyの上位 (スコア:1)
他の言語とは違って、0がfalse扱いにならないからかも。間違いの元になるから。
何でもいいから適当に初期化する場合、Rubyでは通常nilを使う。
あと、ゼロテストに関しては専用メソッドzero?, nonzero?を使えるのもあるかな。
Re:Rubyの上位 (スコア:1)
Rubyもそうだっけ?
1を聞いて0を知れ!
Re: (スコア:0)
endを使う言語としたらVBかな。
今の.net系は知らないけど6までだと
End If
End Sub
なんかあった。
ifや関数/メソッドの終了部分を「}」で閉めないで単語で閉めている言語にはendはそこそこ使う気がする。
Re:Rubyの上位 (スコア:2)
構文はVB6以前と同じように似せてあるので、.NETになってからも終わりはEndです。
Re:Rubyの上位 (スコア:1)
minifyスクリプト (スコア:3)
javascriptは、配布時のファイルサイズを減らすために各種minificationが行われますし、
httpリクエストを減らすためにファイルも結合するので、そういうことではないでしょうか?
新人。プログラマレベルをポケモンで言うと、コラッタぐらい
Re:minifyスクリプト (スコア:2)
node.js関連でnpmにてモジュールを入れている場合とかは、
すでにminify済みのライブラリが入ってるかもしれません。
あとは、coffeescriptを使うとundefinedはvoid 0に変換される点も気になってます。
自分はJSでは初期化にundefinedを使うことが多いので、
リストにundefinedが入っていないのも不思議です。
逆に言うとそんなに0を使うことは無い気がします。あくまで個人的な書き方の問題ですが。
新人。プログラマレベルをポケモンで言うと、コラッタぐらい
0大杉 (スコア:1)
テキストエディタの設定を変えて、リテラル部分の背景色を目立つ色にしたら、
どのソースのどの部分を表示しても 0 が目に付く位、あちこちにあった。
かなり古いCのソースとはいえ、自分の印象より更に多かった。
定数にしてシンボル情報埋めたいなー
nullptrとかも使いたいなー(せめてNULLマクロくらい使えばいいのに)
Re: (スコア:0)
Pascalにすれば1が増えますヨ
"Fig. 3 The average size per file (byte)" (スコア:1)
ファイル数や総バイト数ではC言語、次いでJavaとC++が多いのに、
何故か一ファイルあたりのバイト数ではJavaScriptがダントツ
…なんでもかんでも一個のファイルに書き込んでしまう文化的な何かなんでしょうか(^_^;
# 最近、Facebookで使用言語の欄にC言語とか使えなくなりましたね、本筋とは全く関係ないですが。
Re:"Fig. 3 The average size per file (byte)" (スコア:4, 参考になる)
ソースコードのような比較的サイズの小さいデータに対しては
ファイル数を少なくした方が,ネットワーク,サーバ,ファイルシステムのオーバヘッドが減ります.
cとかc++が登場した頃は,コンパイラ,開発環境,エディタが貧弱だったので,
機能単位,モジュール単位で兎に角ファイルを分割する方針をとってましたが,これはもう昔の話かと.
実際最近のc/c++の開発環境はプリコンパイルヘッダのような仕組みで,
ヘッダファイルが細かく分割されていても,内部的にはできるだけ一個のファイルに情報(シンボル情報とか)をまとめて保存することで
余計なオーバヘッドを回避するようになっています.
Re:"Fig. 3 The average size per file (byte)" (スコア:1)
それよりも、Javascriptで第16位の 4294967295 って、なんでこんなのが16位に出てくんの?
1を聞いて0を知れ!
Re:"Fig. 3 The average size per file (byte)" (スコア:2, すばらしい洞察)
UMAX_INT がシステム定義の定数などで提供されていないために、あちこちのライブラリで記述されてるんですかね。
0 が多いのと似た理由といえるかも。
Re:"Fig. 3 The average size per file (byte)" (スコア:1)
けど、他言語ではUMAX_INTに相当する定数、ランクインしてませんよね。
1を聞いて0を知れ!
Re:"Fig. 3 The average size per file (byte)" (スコア:1)
0xFFFFFFFFでも、文字数変わらないじゃん……
うっかりどっか間違えると面倒なことになりそうだから、間違えにくい表現で書いてほしい……
1を聞いて0を知れ!
Re: (スコア:0)
Webサイト作るときは、極力統合しますね。
その分リクエストを減らせますので。
まぁ本当は製作時はちゃんと分けて、公開時に統合すればいいのですが
めんどくさいので、よほどでなければ、統合した状態で書いちゃいますね。
Re: (スコア:0)
# 酔ったら饒舌にしゃべれるようになるくらいには立派な言語ですのに。
基本的にメソッド名が長いのなんの document.getElementsByClassName() とか平気で登場するからだとおもいます! たしかに説明不要なくらいに体を表してる名前だけど、長いよ。
Re:"Fig. 3 The average size per file (byte)" (スコア:2)
そのための jQuery。
$(".class") = document.getElementsByClassName("class")
新人。プログラマレベルをポケモンで言うと、コラッタぐらい
Re:"Fig. 3 The average size per file (byte)" (スコア:1)
いや,それ言語じゃなくてDOMで決まってるメソッド名ですから.
C++でもJavaでも,XML/HTMLをDOMで操作すれば,同じ長大なメソッド名が頻出します.
命名規則 (特に動詞の使い方) が,言語標準のものと違って気持ち悪いんですよねえ.
ifとゼロ (スコア:1)
初期化にゼロを代入する記述が多いのは確かですし、続くif文でも、
その条件判断として、ゼロと比較することも多いはずです。
二番目に記述頻度が高いif文の中で、一緒にゼロも記述されているのであれば、
代入文も合わせて、ゼロの記述頻度がより高くなるのも納得できますね。
Re:ifとゼロ (スコア:1)
ループするとき、何回ループするかは変数だったり定義された定数を使ったりしますが、カウントしはじめの値は0なり1なりを使いますね。
#define COUNTSTARTVALUE 0
とかやってもいいかもしれませんが、0や1を直接使ったとしても構文から言って意味が自明ですし、あまり御利益がないような。
「初期化にゼロを代入する」のうちに含まれるかも知れませんが。
Re:ifとゼロ (スコア:2, おもしろおかしい)
そんな #define すること自体が目的化したような定義やめてくださいホントお願いしますそのうち
int two = 5 ; // 3を代入
みたいになります。
Re: (スコア:0)
foreachとか、while(shift @ar)とかばっかで特殊なことやらないとfor文は使わないperl屋な私。
loopとその害毒 (スコア:1)
実際, 配列相手みたいな「空間的」繰り返しと, 計算結果を次の処理の入力とするような「時間的」繰り返しを区別できない計算機言語が前時代的なんでしょうね.
なもんだから, コンパイラがコードの意図を推論して並列化しないといけないはめに.
いちおう貼っておきますね (スコア:1)
---- -------- -------
1 12536894 0
2 9174613 if
3 7211215 1
4 6344625 return
5 5777769 int
6 5284984 0x00
7 5210612 define
8 5084560 struct
9 3769638 void
10 3714602 i
11 3284344 const
12 3077231 static
13 2882689 2
14 2667224 t
15 2661897 this
16 2595296 type
17 2403928 n
18 2374491 dev
19 2206270 typename
20 2118588 public
---- -------- -------
単語を分離する条件 (スコア:1)
スネークケースだと語が分離されるが、
キャメルケースでは分離されないですね。
この辺り、キャメルケースが主流な言語だと統計結果に差が出そう。
しかし、キャメルケースを分離すると今度はシステムハンガリアンのuやらszやらが多くなりそう?
それとも今時はもうシステムハンガリアンは少ないのかな。
興味深いです。
int (スコア:0)
intが5位に入っていてなんとなく安心した
Re:int (スコア:1)
いや、暗黙に頼らずちゃんと宣言やキャストしているようで良かった、ということじゃない?
Whitespaceの場合 (スコア:0)
スペースとTabのどっちが多く使われるんだろう。
Re:Whitespaceの場合 (スコア:3)
TAB禁止って所もあった事だし
Re: (スコア:0)
WhitespaceでTabを禁止されたら何もできなくなってしまいます。
lispの場合 (スコア:1)
(と)のどっちが多く使われるんだろう
Re:lispの場合 (スコア:2)
1: ( および )
2: '
3: #'
4: let
5: cond
6: lambda
7: lst
8: setf
9: loop
10: defun
11: &optional
12: &rest
どっちの括弧が多いか知りませんが、もしランキング作るならこんな感じでしょうかね。
新人。プログラマレベルをポケモンで言うと、コラッタぐらい
Re:lispの場合 (スコア:1)
] で全部の((()(を閉じてくれるのは処理系依存の実装だと思っていたがそうでもなかったのか。1980年代初めかそれよりちょっと前に作られたULISPみたいな名前の処理系でそっちより構造エディタが楽しかった。スーパー閉じ括弧は構造エディタの副産物だったのだろう。
0も単語扱いだったんですね (スコア:0)
ifフラグ判定する前に初期化
forループする前に初期化
確かに考えてみればってところだね
Re:0も単語扱いだったんですね (スコア:1)
FORTHなんかだと, 実装にも依存するのですが“0”, “1”等が数値リテラルではなく, 独立したワードとして登録してあることがあります. その方が処理コストが小さいんだとか.
tってなに? (スコア:0)
14位のtってなんでしょうか?
一瞬lispかと思いましたが、C, C++でよく使われているようです。
変数名にしても、iとかnとかは分かりやすいけど。
Javascriptだと、a,b,c,d,eがこの順でランクインしているし、数字もランクインしています。
変数名は適当にaから順番に使って、数字もハードコーディングしまくり、
ということでしょうか。
Re:tってなに? (スコア:5, すばらしい洞察)
構造体などの定義で hogehoge_t としているからだと思う。
HIRATA Yasuyuki
Re: (スコア:0)
言われてみれば、そうとしか思えない
Re:tってなに? (スコア:2)
私は、“temporary”の頭文字ということで、大した用のない一時的な変数にtという名前を付けることがあります(同じ理由でtmpやtempも使う)。同様の考えの人が多いのかなと思いました。
Re:tってなに? (スコア:1)
別コメントでもありましたが、JavaScriptでminifyスクリプトを使うと、
元の変数名が何であってもaとかbとかに変換されます
(名前が短い方が転送量が減るので)。
だから、「a,b,c,d,eがこの順でランクインしている」んでしょうね。
Re: (スコア:0)
時間関連の変数でtを使うことがありますね。
time関数のマンページとか「time_t time(time_t *t)」になってますし。
# ループ変数のlより多い気がしないですけど
忘れていないか? (スコア:0)
空白の方が多いぞ。
でなきゃWhitespaceなんて参加もできないじゃないか?
人生是、 while(1) 也。[T/O] (スコア:0)
#どうどうめぐりとよむ
予想 (スコア:0)
#if 0 //とりあえず
#endif
こんなのが大量に埋まっているのを想像しました。orz
返り血 (スコア:0)
return 0;
をちゃんと書いたあるってことじゃ
Re:返り血 (スコア:1)
>返り血
うぎゃーっ