2007-09-02

"BINARY HACKS" 高林哲 他4名 著

憂鬱である。買ったはいいが、処理しきれていない専門書が20冊ほど積みあがっている。アル中ハイマーにはネット注文でついでに専門書をもぐらせるという悪い癖がある。更に悪いことに専門書を読むのがおもいっきり遅い。1ページを理解するのに下手すると半日かかることもある。右脳は酔っ払っているが左脳はもう死んでいる。論理的思考などはるか彼方へいってしまっているのだ。
本屋ではこんな行動パターンもある。高価な分厚い専門書を立ち読みしていると欲しい情報を数ページ見つける。これだけのために一冊買うのはもったいない。必死に目に焼きつける。帰って実践すると微妙に記憶が辿れない。そして、翌日買いに行く羽目になる。記憶プロセスもはるか彼方へいってしまっているのだ。
温泉旅行の前に数冊でも片付けないと落ち着かない。まずは目の前のオライリー君を本棚深く沈めてしまおう。
ただ、アル中ハイマーにとって専門書の良書をブログの記事にするのは最悪だろう。だって、自分自身の無能ぶりをさらけ出すようなものである。だからと言って隠し立てをすることもないだろう。もっと恥ずかしいことを普段からさらけ出しているではないか。あんなことや、こんなことまで。それを記事にすると思えば、恥ずかしさなどはるか彼方へいってしまうのだ。どっかの本ではないが、歳をとると鈍感力が養われるものである。

それにしても、なになにhacksという本が随分と増えたものである。hacksという言葉は、技術レベルを高めてくれるような異様な香りがする。しかし、こう多いとありがたみを感じないものである。
本書は低レイヤ(ハードウェアに近い領域)のプログラミング技術を紹介してくれる。gccの最適化手法からセキュアプログラミング、OSやプロセッサの機能を利用したものなど満載である。ただ、ド素人のアル中ハイマーがここまではやることはないだろう。
西田亙氏の「GNU Development Tools」を読んだ時はなかなか味わいがあった。本書はなかなかこくがある。
さっそく忘れないうちに、思い立ったところを摘んでおこう。

1. gccのビルトイン関数による最適化の項
文字列リテラルへポインタを宣言する時の注意点として、即値が埋め込まれずに高速化されない場合の例を示してくれる。
その中で気になる一文がある。
「最近のプログラム手法として、#defineはなるべく使わないようにする。というものがある。」
なぜだろう?その理由は書かれていない。確かに、マクロ展開そのものはエラー診断をわかりにくくしたり、引数があると意図した形に展開されないなど注意はいろいろとありそうだ。

2. TLS(スレッドローカルストレージ)という技を紹介
複数のスレッドで同じ名前の変数を共有しても、格納する場所はスレッド毎に独立できる。

3. ヒープ上に置いたコードを実行できる
最近のプロセッサやOSはメモリ保護がしっかりしているから、まずやることはないだろう。
ただ、mprotectシステムコールを使えばやれる。その延長上で自分自身の挙動を書き換えるプログラム例を紹介してくれる。ちょっと遊んでみると、これがなかなかおもしろい。アル中ハイマーは調子に乗って作ったものをウェブで公開しようと思ったが、こんなもんはメモリリークのテロリストのようなものだ。

4. プロセッサのメモリオーダーリングの話はおもしろい
複数のスレッドがクリティカルセクションに入る時、CPUの仕組みによって同時進入の可能性を紹介してくれる。最近のプロセッサではほとんどの場合問題になるようだ。パフォーマンス向上のために命令順とは異なるメモリアクセスを認めているからである。メモリアクセスのためのWAR,RAWなどの機構がそれである。これはマルチスレッドのプログラムを作る時は意識しなければならない。対処方法として、メモリバリア、アトミック命令を使った例を紹介してくれる。現在では、C/C++言語レベルではインラインアセンブラや組み込み関数でしか対応できないようだ。今後言語レベルやAPIでサポートされることを期待するとある。

5. ランタイムHack
elfバイナリが実際に実行されるまでの手順や、システムコールの呼び出し手順などを解説してくれる。このあたりは読み物としてもおもしろい。

本書は全般的に知っていて損はないだろう。アル中ハイマーが避けていたマルチスレッドの勉強でも、少しはやってみようかと思ってしまう。スレッド間のメモリ共有などは酔っ払いには辛い。まさしくチャンポンで悪い酔いしそうである。
また、細かいところで、アル中ハイマーは結構抜けたことをやっていることに気づかされる。もしかしたら、過去に作ったものの中に偶然動いてるものがあるかもしれない。なんとなく煙臭い。いや、そこに熟成されたスコッチがあるからだ。

0 コメント:

コメントを投稿