トップ «前の日記(2007-09-11) 最新 次の日記(2007-09-13)» 編集

2007-09-12 [長年日記]

_ そりゃLL使いでも低レベルを知っているに越したことはないに決まっている

えーと、最近の一連の話はほとんど読んでませんが、C もアセンブラもかじった程度にだけ経験はあるけど BINARY HACKS はほとんど分からなかった*1 LL な人間として思うことは

絶対に知っとけとは言わないけど、知ってると勘は働くよ

ってことかなぁ。勘て書くと誤解を生みそうだけど。

C やマシン語をきちんとやらなきゃいけないって意味じゃーないんだけど、低レベルの動作がある程度想像できるようになっていると、例えばあまりに非効率な方法は実際に書いて動かしてみる前におかしいと気づきます。(なんつーか、これを詳細設計と呼ぶのかもしれない。知らんけど。)

例えば DB からデータを取得するときに、まるでテキストファイルを相手にするかのごとくシーケンシャルに一つずつ取ってくる*2とか、テキストファイルからデータを取得する際に OS のバッファリングなどに丸投げせずに自分で妙な技を開発しちゃうとか、そういうのはフツーあり得ないわけですけど、何がどうあり得ないのかきちんとマシン語レベルで説明できなくても、そりゃ効率悪いに決まってるやんとかは気づくわけです。なんとなくですけど。*3

同じように、アルゴリズムとデータ構造といった、いわゆるコンピュータサイエンスの基礎中の基礎に当たる部分もやっておくと、この場合にこんなデータ構造にするわけないじゃんとか、これは有名な○○のアルゴリズムをそのまま当てはめればいいし、それは標準関数のこれこれとかライブラリのどれそれですぐに実現できちゃうのに、なんでそんな力技を編み出そうとするの?とかいうのも、実際に書いて動かす前に気づけるわけです。*4

そういう意味での基礎体力というか、そんな感じで役に立ちます。もちろんそういう効率の悪いコードを書いてしまっても、それをきちんと計測して遅いから別な方法を採用した方がいいなと判断できる力があるならそれでも構わないとは思うんですが、残念ながらそんな、いい意味でアンバランスな人*5にはお目にかかったことがありませんし、書く前に気づけるならそれに越したことはないわけです。なまじっか動くものができちゃうとそれを壊したり直したりするのに抵抗が生まれたり*6するでしょ? 動くものができる前なら遠慮なく破棄できますから。

LL や Java など VM 上で動く言語を使う人間としてはそんなの知ったことかと思いたいわけですよ。そんなのお前らがいい具合に勝手に解釈しろと。まぁそこまで乱暴なことは言わないまでも、「コンピュータなんだからそれくらい良きに計らってよ」に近いことをぼんやりとですが、考えていたりするわけです。よく考えると「開発者」とか「技術者」を名乗るにはあり得ない発想だったりしますけど*7、まぁやっぱ基本的にプログラマは楽をしたいから苦労する人間なわけで、楽をしたいと思うこと自体は否定しちゃダメなのかなとも思います。

話がそれた。

とにかく、あんまりこと細かに具体的な話をするのは難しいんですが、知ってるに越したことはないよというのは間違いないです。そしてこれは特定の言語のクセとして慣れるのとは違うレベルでの力なので、言語を乗り換えても活きます。例えば「PHP のプログラムを高速化するための 10 の Tips」みたいなのってものすごく人気あるわけですけど、そういう知識は PHP を使わなくなったら役に立たなくなります。でも低レベルの知識は PHP だろうが Ruby だろうが役に立ちます。低レベルがガラッと変わっちゃうことはそうそうないですから。

ただまぁ、くり返しになりますが、優先順位はそんなに高くないと思います。

  • プロファイラがちゃんと使える
  • 論理演算というか集合がちゃんと分かる
  • テストをちゃんと書く
  • 黙ったまま作業しないでちゃんと commit する
  • 構成管理のツール(Trac とか)が入ってるならちゃんとそれを使う

とか、「上のレベル」で身につけなきゃいけないことが多いですし、少なくともここに挙げたものを満たさずにマシン語レベルの話が分かったからと言って大きな顔をするようなやつは廊下に立ってろですよ。*8

最後にこれものすごく疑問なのですが、例えば Perl のリファレンスとか Lisp の car, cdr なんかを、メモリアドレスとか C のポインタとかを知らずにどうやって理解するんでしょうか? そこら辺がどーも私にはピンときません。Perl ハッカーで C もアセンブラもさっぱりですという方がいたらご一報ください。お友達になりましょう。

cf.

*1 というかネタとして買った

*2 単にロックの仕方をちゃんと知らなくても安心して使えるストレージに成り下がっちゃってる

*3 例えば一回 C でファイルの読み書きを全部書いてみりゃどれだけコストがでかいかは実感できます。少なくともまともに動く C のソースを書き上げるだけで面倒です。Ruby なら File.open( moge ) { |f| } で一発なのに、とか思いながら書くのでますますうっとぉしいです。

*4 と、言いつつ自分はあんまりそういうのが役に立つようなことはしてないですし、どれだけの精度で自分に当てはまっているかについては自信はありません。ありませんけど、世の中にはそういうの全然分かってないのに自信満々な自称プロの方もいたりして、不思議だなーと思うことはあります。

*5 低レベルの知識ゼロなのにプロファイラ使いこなしてる人

*6 自分の心の抵抗じゃなくて外圧の場合もある

*7 それを実現するのが己らの仕事じゃねーのかよ

*8 くどいようだけど、これは低レベルの知識がなくても書ける LL を前提にした話ね。