« 本を引き取ってくれる人募集中 | Main | 今日の日記 »

2007.08.11

Short Coding

Short Codingざっと読みました。読み物として面白かったけど、本当に面白いのは手を動かしてから。雰囲気的には、ハッカーのたのしみよりも、Binary Hacksよりも、エキスパートCプログラミングに近い。こう書いてもエラーじゃないんだよ。そして、何が起こると思う?みたいなのり。両方ともコンテストのルールをHackする例ものっているしね。

Short Codingって、省略したらintとか、グローバル変数は0で初期化されてるとか、for文にいろいろ詰め込むとか、せいぜい「配列の先にこのデータがあるはず、でスタックにアクセスする」くらいだと思っていたんだけど、それはウォーミングアップの範囲。関数の戻り値がレジスタに残っていることを期待とか、笑うしかないようなテクニックが満載だった。アセンブラの最適化に近い物がある。xor a,a でaを0にするとコード領域が小さくなるとか、フラグレジスタの値をどこまで引き回すかとか、関数コールではなく内部割り込みで飛ぶとフラグレジスタが自動的に復帰するとか、そういう楽しさがある。アスキーで入力されたデータをアスキーのまま演算して、'0'で引くとか良く使う手だ。gccっていうワンクッションがその楽しさを増やしているんだと思う。もうちょっとバイナリな技が無いかなといろいろ考えてしまった。PCI BIOSを使って特定の値(IntelのベンダーID 0x8086)を取り出すとかね。

違う違う、こんな事を書きたかったんじゃない。一番書きたかったことを忘れていた。僕的サブタイトルは「gets()とscanf()の技法」、これほどまでにこの2つの関数が愛された本はあるだろうか。for(;~scanf(...);)が、perlのwhile(<>)くらい基本テクニックとして使われている。おすすめは2-3 ライブラリ関数を使いこなせ。ここの解説は、電車の中で声を出して笑ってしまった。一例を挙げておくと、
int abs(int n):整数の絶対値を求める関数です。地味ですが関数名が短く、意外なところで活躍するかもしれません。
こんな感じで、今までに見たこともない視点からの標準関数の解説があります。

この本を読んでから身近な事が問題に見えてきて困る。時刻表見ていると、なんとなく、scanf()で読み込んだ戻り値-1がその時間の電車の本数だよね、とか。

正直、今からgolfに参入してなんかできるとは思わないんだけど、この本のコードは自分で動かしてみたい。

P294 細かい誤植 括弧閉じてないです。

|

« 本を引き取ってくれる人募集中 | Main | 今日の日記 »

Comments

Post a comment



(Not displayed with comment.)




TrackBack

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

Listed below are links to weblogs that reference Short Coding:

« 本を引き取ってくれる人募集中 | Main | 今日の日記 »