« トラバをいただいたので | Main | 俺涙目(笑) »

September 16, 2007

もう少しだけ

粘着してみる(笑)。

# キモかったら言ってください。やめます。

アトミック

末尾再帰最適化なんてそれこそたいしたことないと思うけど、この例がたいしたこと無いのはその通りで、実際問題として大変なのはもとのコードと機械語の命令が1対1対応するわけではないことだったりする。で、その場合に生成されるコードを想像してデバッグしないといけない状態ってなんなんでしょ。排他制御はまさにそういう例だとは思うけど、こういうバッドノウハウ的なコード生成は関係なくて、要するにどういう処理がアトミックにできるのかという話だよね、多分。ということで、「生成されるコードを想像できないといけない」というのは言いすぎだと思うのだ。

ちょっと引用長すぎたかな?

プロシージャコールがループに変わってしまう末尾最適化を"たいしたことない"と言い切ってしまう強さには敬服します。多分コンパイラによる最適化の話をしたときに、書いたコードと吐き出されるコードのセマンティックな距離が最大になる例のひとつだと個人的には思うけどね。

アトミック云々に限定しすぎるのもどうかとは思うけど、例えば"どういう処理がアトミックにできるか"を認識するためには自分が書いたコードがアトミックにできる処理なのかそうでないのかの区別ができなきゃいけない。そして、区別するためには"バッドノウハウ的なコード"になるか、クリティカルなコードを含むか大体想像できてないといけない。だからこそ"コンパイラの出力を想像できるぐらいにはなっとかないとプロとしてはまずいと思う。"という発言をしたという訳。

で、前のエントリで"瑣末な部分に属する"としたのは、決して"関係ない"ということが言いたいわけじゃなくて、"(一見)難解そうに見えるけども一度CPUによる割算というものがわかれば自分の中でパターン化しておける"、つまり上のいい方にそろえると、"書いたコードと吐き出されるコードのセマンティックな距離はそんなにはなれていない"という意味と"一般的にレジスタ値は各コンテキストで閉じているので、レジスタオペレーションだけしか出てこないこれらの例はコンテキストローカルなものだと一見して認識できる"という意味を含んでいる。いや、要はこういう例を見て本気で"マシン語って恐いなぁ"とか思っちゃう人がいるとアレなので、"全然難しくないよ"ということが言いたかっただけなんですけどね。

アトミック

たとえば、この例でいうと「共有変数へのアクセスはアトミックに行うか、排他制御する必要がある」ということと、「インクリメントは読み出し、加算、書き込みを伴う処理でアトミックではない」ということを理解させればいいんじゃないかなぁ。いや、もちろん機械語レベルの知識があるならそれで説明するのが手っ取り早いだろうけど。

それって結局

The_Value++ ;

っていうコードは
mov The_Value, %eax
inc %eax
mov %eax, The_Value

という風にコンパイルされて、コンパイル後のコードそれぞれの行間でディスパッチ(割り込み)が起きうるよ、という話を日本語に翻訳しただけの話だよね。んで、これが本質である以上、いわゆるマシン語の知識は必須だよね、プロなら。

遠回りしても時間がかかっても自分なりの理解が得られればいいというのは、まぁそりゃそうなんだけど、かりにもプロであって、本質にかかわる理解を得る近道が存在することを認識したなら、その道をとれるように自分を鍛え上げておくのが当り前だと思うな。プロの端くれとして自戒の意味も込めて。

アトミック

あと、shiro さんのコメントを読んで気づいたんだけど、もしかして一部の人は無意識的に CISC プロセッサを前提にしているんじゃないだろうか。いや、もしかしてバイナリアンな人たちは RISC でもすいすいと読むのかな。

"一部の人"がどうだかは分からないけど、組込みやってるとARMやSHにはよくお目にかかる、というか最近はそんなのばっかりなので、基本的にはRISCの人です。まぁRISCでもCISCでもそんな変わんないですよ。遅延分岐とか癖もあったりするけど、それさえ押さえときゃ総命令数は少ない訳で。

アトミック

まぁ、なんというかモデルとしてコンピュータでの命令実行がどうなっているのか、という話は知っておいてしかるべきだとは思うんだけど、実装の泥臭いところまで知っているべきというのは、なんか違うと思うんだよね。

モデルとして一般論を"知っている"だけじゃなくて、"深く理解"して設計の基礎に置けるようになっておかないとプロとしてはいまひとつ使えませんぜ、という話だと思うんですよ。そのためには泥くさい所も含めてなんかひとつぐらいは具体的なターゲットを設定して経験積むのが近道ですよ、と。

さすがに今回のプロジェクトは初めてPowerPC使うからまずはアセンブラから、とかはやらなくてもいいと思うけどさ。ARMでもx86でも自分の持ってる具体的な理解をベースに、必要に応じてデータシートのコード表引っ張りだしてコンパイラの出力と見比べることで、自分の想像を補正しつつより確実なコーディングを行うことはまちがいなく可能だから、そのためにもなんかひとつはアセンブラレベルの経験(デバグでもプログラミングでもいいけど)をしておこうね、というのがもともとの主張なんではないかなぁ。

|

« トラバをいただいたので | Main | 俺涙目(笑) »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/91842/16464193

Listed below are links to weblogs that reference もう少しだけ:

» アトミック #2 [odz buffer]
プロシージャコールがループに変わってしまう末尾最適化を”たいしたことない”と言い切ってしまう強さには敬服します。 Blogging Boozer: もう少しだけ えー、違う違う。末尾呼び出し最適化は関数呼び出しをループじゃなくて、ジャンプに変換する。末尾呼び出しする関数が自... [Read More]

Tracked on September 16, 2007 at 09:44 PM

« トラバをいただいたので | Main | 俺涙目(笑) »