GitHubで最も「醜いハック」が使われているのはC言語 84
ストーリー by headless
正直 部門より
正直 部門より
開発者の皆さんの中には、時間や知識が足りない場合や、ちょっと面倒だからといった理由で、間に合わせに自分でも最良とは思えない(が、目的は達せられる)コードを書いたことがある方もいるだろう。ITworldのPhil Johnson氏がGitHubのデータを調査したところ、このようなコードを書いている(少なくとも自らそれを認めている)開発者が最も多かったのはC言語の開発者だったそうだ(ITworldの記事、
本家/.)。
調査方法は、GitHubの検索機能を使って「ugly hack(醜いハック)」という文字列を含むコードファイルを検索するというもの。その結果、C言語では181,000ファイルがこの文字列を含んでいたという。これにPHP(79,000ファイル)、JavaScript(38,000ファイル)、C++(22,000ファイル)、Python(19,000ファイル)が続く。
さらに、Google BigQueryを用いてGitHub Archiveから2013年1月1日~2015年5月1日までに作成されたフォークされていないリポジトリの数を言語ごとに抽出。同期間で「ugly hack」を含むファイルを検索し、各言語でリポジトリ1件あたりの「ugly hack」出現回数を計算したところ、やはりC言語が圧倒的に多い0.4232回。2位のPHPの3倍以上、12位のJavaの50倍近い結果になったという。
ただし、修正された部分に「Fixed an ugly hack」といったコメントが付けられている場合や、1ファイルに複数の「ugly hack」が含まれている場合にも1回としてカウントされてしまう点が今回の調査方法の問題点だという。どちらにしても、C言語の開発者が最も多くugly hackを行っているか、C言語の開発者に正直者が多いかのどちらかだとしている。皆さんの場合はいかがだろうか。
調査方法は、GitHubの検索機能を使って「ugly hack(醜いハック)」という文字列を含むコードファイルを検索するというもの。その結果、C言語では181,000ファイルがこの文字列を含んでいたという。これにPHP(79,000ファイル)、JavaScript(38,000ファイル)、C++(22,000ファイル)、Python(19,000ファイル)が続く。
さらに、Google BigQueryを用いてGitHub Archiveから2013年1月1日~2015年5月1日までに作成されたフォークされていないリポジトリの数を言語ごとに抽出。同期間で「ugly hack」を含むファイルを検索し、各言語でリポジトリ1件あたりの「ugly hack」出現回数を計算したところ、やはりC言語が圧倒的に多い0.4232回。2位のPHPの3倍以上、12位のJavaの50倍近い結果になったという。
ただし、修正された部分に「Fixed an ugly hack」といったコメントが付けられている場合や、1ファイルに複数の「ugly hack」が含まれている場合にも1回としてカウントされてしまう点が今回の調査方法の問題点だという。どちらにしても、C言語の開発者が最も多くugly hackを行っているか、C言語の開発者に正直者が多いかのどちらかだとしている。皆さんの場合はいかがだろうか。
perl (スコア:5, おもしろおかしい)
Re:perl (スコア:1)
「本家/.」とか言えるのも今日明日までと思うと感慨深いですね。
Re:perl (スコア:1)
オフトピだが、本家からの転電ストーリーも無くなるのか興味深々。
Re:perl (スコア:3, 参考になる)
Re: (スコア:0)
今だってよそ様のサイトから勝手に引用している。本家のサイトから引用していたのが他所のサイトからの引用に変わるだけ。
//だと思います
Re: (スコア:0)
そうなるだろうね。移行ストーリーでも話題が出た。
http://slash.srad.jp/comments.pl?cid=2793345 [srad.jp]
Re: (スコア:0)
だね。
これって単に、「『醜いハック』が最も嫌われる(or 目立つ)言語はC」ってだけかと。
Re: (スコア:0)
言語的なサポートが少なくてハックしたくなるケースも多いんだろうけど、醜いハックに自覚的にならざるを得ない言語ですよね。
変な使い方を無自覚にやると爆死するだけだし、無茶なパラダイムを導入するとわかりやすくスパゲッティ化してくれる。
PHPだと…急場凌ぎとセキュリティホール対策で醜いハックが頻発するのかな。
C++とかJavaは……オブジェクト指向に変に染まった結果、無自覚ないハックや無駄にまみれてるコードが多いから、多分件数以上に醜いハックが氾濫してると思う。
もともと醜いハックであってもデザインパターンと呼べば許されかねない風潮があるしorz
Re: (スコア:0)
PHP は、ネット上に転がってる「ugly hack」って入っているコードスニペットを、そのままコピペしてるケースが多い予感。(偏見?)
Javaは、使用ライブラリのバージョンとか依存関係をねじ伏せたり、ライブラリのバグ回避のために hack が必要になることが多いイメージ。
後日バージョンが上がったとき、なんだっけ? てならないように、コメントしてる感じ?
JavaScript で 「foo = bar|0 」とか、「foo = +bar」 とか、「foo = bar && bar.baz 」 みたいのは、ugly hack に入るのかな?
Re: (スコア:0)
というより、単純にC言語を使ってるプロジェクトがそれだけ多いってだけかも。
Re: (スコア:0)
「リポジトリあたりの回数」ってあたりも、プロジェクト規模が影響してそうですね。
Re: (スコア:0)
これって酷いハックでもOKって文化があったということかも?
Cでも、ある程度歴史のある言語だと、今風の理路整然としたコードにしなければならないって意識は低いかも?
特に環境が悪い(少ないメモリなど)で動かさなければならないとかで、わざと汚いコードになってしまうってこともあるから
Re:perl (スコア:1)
最近の言語になるにつれて、ugly hackにならざるを得ない部分がライブラリや言語そのもので隠蔽されてきたということではないかと。
コンパイラがアセンブリ言語レベルの泥臭い最適化を隠蔽してるように。
アセンブラ (スコア:1)
レベルが低すぎるので、 hackにならないだけでは?
Cレベルではトリッキィなコードもアセンブラは当たり前なコード。
昔、サブルーチンの最後でのサブルーチン呼出しを、JMP命令にしたのは、
さすがにコメントに強く注意書きしたけど。
# スタックの消費が減って、ステップ数も減るが、ちょっと分かりにくい
# Cだと末尾最適化の対象か? アセンブラは手作業。
あっと、遅延分岐のあるCPUだと、分岐命令は基本、落とし穴。
命令セットそのものが、 ugly hack
更にJavascript(Re:perl (スコア:1)
そういえば、Javascript使う方面って、なんであんな汚いコードが蔓延してるんですかね。日本国内に限らず、海外のサイトでも。
凝ったことをやってるサイトは大抵可読性が悪くて読む気をなくすんですが。
二つの理由 (スコア:5, 興味深い)
一つめは, 何らかの理由でugly hackが必要だからC言語を使っていることが多いから. 今日日, 性能やフットプリントを気にしない用途ではCを使うことは少ないですから. 他にもハードのバグ(っぽいもの)を隠蔽するためにugly hackすることもありますし.
二つめは一つめと関連して, 書いている当人がugly hackであることを認識できているから, 注意書き的にコメントしておくんでしょう. これが初心者でよくある「おまじないをコピペ」では, それがugly hackであることも認識できずに感染拡大することになりますから.
Re: (スコア:0)
ハードやOSの不具合や制限に対応するためのコードを「ugly hack」と呼ぶことはありえますね。
その場合、必要だから行っているのであってプログラム自体の品質の問題ではないので、割り引いて考える必要はありそうな気がします。
ハックだと分かって書いてるならまだマシ (スコア:2)
おまじない的に入れてるだけやコピペで意味を理解せずに持ってきてることもあるから書いてあるだけ良心的かもしれない
CSS(オフトピック) (スコア:2)
「ハック」で思い出したけど、CSS にも「IE ハック」という
やつがありました(プログラミングじゃないけど)。
ブラウザ依存しないのが理想だけど、Internet Explorer(IE)
だけはどうにもならないことがけっこうあり…
早く IE には絶滅してほしいものです。
Makefile (11k) ? (スコア:0)
Makefileって、とりあえず動けばいいやって、適当に書くでしょ
最初から改善する気がないので醜いとは思わない?
Re:Makefile (11k) ? (スコア:1)
autotoolsに至っては存在自体がugly hackっぽいしなぁ
Re:Makefile (11k) ? (スコア:1)
Makefileだとプラットフォーム依存させない書き方がしにくいので、一時期autotoolsを使うかどうか検討した末に難解すぎて諦めたんですが(^_^;
ソースコード側への負担(要は、autotoolsの流儀に色々合わせないとまずくなる)も結構あるようだったし…
で、CMake [cmake.org]を専ら使ってますねー。面倒くささの多くがなくなるので。
Re: (スコア:0)
GNU Makeは綺麗に書くには不十分すぎる。
もしかして: やっつけ (スコア:0)
はい、クラス/構造体に入れるの面倒でグローバル転がしてテストしてそのまま
なんてのはよくやっちゃいます。
あとはデバッガで追いやすいようにローカルに使われるものを広域変数にしといてそのままとか、
ゼロ割発生直前でチェックして済ますとか(元から絶たない)
他になにかuglyな例はあるでしょうか。
Re:もしかして: やっつけ (スコア:2, すばらしい洞察)
さっさと引退してください・・・
Re: (スコア:0)
・引数を考えるのが面倒で大域変数で渡した
・引数が必要なのは明白だが、何をもらえばいいのかわからないのでvoid *にしておいた
・構造体の後ろにダミーをつけると落ちなくなった
Re: (スコア:0)
上のは8ビット時代の話だが、今でもやるのは引数に再代入してgotoか
Re:もしかして: やっつけ (スコア:1)
流石に、PICのようにスタック段数が貧困なプロセッサ相手なら仕方ないですが、普通はそういう真似はやらない気が…(-_-;
スタックに余り割けない環境であったとしても、関数を細分化するとか、タスク自体を減らすとかの方向に行くような。
# RTOSで8MBあれば普通はそういう事考えないで済む気がする。
Re:もしかして: やっつけ (スコア:1)
(Alfred Vaino) Aho なコンパイラ…そそる。じゅるる
醜い調査 (スコア:0)
問題点を認識しながらそのまま発表してしまうのはいかがなものか
Re: (スコア:0)
ここまで見事にネタにマジレス乙、があてはまるツッコミ、
なかなかトーシロさんに出来るもんじゃないぜ?
醜い (スコア:0)
だが、それが良い。
人口の問題 (スコア:0)
これって単純にCがよく使われていて、リソースも沢山ある言語だから、というだけの話ですよね?別に特段ストーリーにする必要性はないと思うのだけれども……まあ、ネタに困っているのかな。
Re: (スコア:0)
ファイル数が多いだけという可能性がありますよね。
何処かに書いてあるのかな?
Re: (スコア:0)
これ [namaristats.com]によると、GitHubにC言語のリソースが多いという訳ではないです。
ランクでvimLが3位にある事もそうですが、
1) 言語機能が貧弱で手を抜きがちな要素が多い。
2) それに気が咎める程度には判っている作者が多いこと。
で上位に立っているような気がしますね。
Cの場合は更に「性能の為に手を汚さざるを得ない」と言うこともありそうですが。
Re:人口の問題 (スコア:2)
別スレッドでも話題になってますが、大抵のuglyなコードは「クロスプラットフォームの流儀から外れる」「Cのコーディング作法を逸脱して書くよりない状況になってしまう」と言う話なんで。
ハードウェアに依存するコードを書かないといけないとか、OSの(主にリアルタイム性に関する)制約で不本意なコードを書かないといけないとか、
あとは仕様変更とか仕様の不備・果てはミドルウェア側の仕様の問題で「美しくない」コードでいくしかなくなったとか。
なので、言語機能が貧弱かどうかはあんまし関係ないでしょう。
他の高級言語ではミドルウェアがuglyなコードを書くのを代行してるだけで、本質的には余り変わらない気がします。
Re: (スコア:0)
手を抜きがち→泥臭い?
ダック・タイピングとかクロージャとか手抜きっつーより泥臭い実装になっちゃう。
Re: (スコア:0)
えっと、
例外処理がないので関数の成否をリターンステータスで返す -> 成功すると決めてかかる。
mallocしたメモリを自分で解放しなきゃいけない -> プロセスが終了すれば解放されるからそのまま。
データ型が貧弱 -> 配列で済ます。中間に挿入するときはmemcpyでずらす。
#ごめんなさいごめんなさい。
Re: (スコア:0)
使い勝手の悪い言語は何をするにも醜いハックで敢えて明言する必要も無いレベルだったり、
醜いハックであってもデザパタの名の元に常套手段としてしまいいちいち言及することもなかったり、
醜いハックであってもそれを書くかどうかは別の問題ですよね。
PHPやJavaScript(Node.js)とかのWeb系だと、セキュリティのための後付け要素で手を汚してる例も結構ありそう。
元記事のグラフの (スコア:0)
3番目の言語が読めないのですが…なんでしょうか。
http://www.itworld.com/article/2918583/open-source-tools/c-leads-the-w... [itworld.com]
Re:元記事のグラフの (スコア:1)
Vim scripting language [stackoverflow.com]を指す呼び方の一つなんじゃないでしょうかねえ。よくわからないけど。
Re: (スコア:0)
そんな呼び方があるのですね。長らくVimを使っていますが知りませんでした。
#stackoverflowにはなんでもあるなあ…。
コードの品質の問題ではない (スコア:0)
C言語を使う人は高い完成度を求めているということでは?
Re: (スコア:0)
もしくはレベルや意識が高いということも
(特に日本の)PHPなんかじゃ酷いコードでも本人に全く自覚がないなんてことも
C言語以外では表現が異なっているだけという可能性は? (スコア:0)
hack って低水準言語かそれに近い言語でよく使われるイメージがあるのだが。
Re: (スコア:0)
単にuglyで検索してもC言語がだんとつなんだよね
Re: (スコア:0)
想定してないんじゃね?ってことができるのがCで、なるべくできないようにして(安全にしてる)のが例示されてる他の言語だからの気がする
逆に考えるんだ (スコア:0)
自分のコードの酷さを認識できるプログラマが他の言語でどれほどいるというんだってね
1リポジトリ当りのファイル数や行数は? (スコア:0)
元の調査には書かれているのかもしれませんが。
> リポジトリ1件あたりの「ugly hack」出現回数
って事は単に、C言語が1リポジトリ当りのファイル数や行数が多いと言うだけかもしれません。
アグリィイラプション (スコア:0)
アグリィイラプションしても、冥界の蝶々のようなきれいなバイナリになればいいじゃん。