ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか ジュニア,ヘンリー・S. ウォーレン (著)を読んでいる。
タイトルのx | ( x – 1)はこの本に出てきた例。
ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか ジュニア,ヘンリー・S. ウォーレン (著)
この本は、某所で有名なHacker’s Delightの訳本である。
Hacker’s Delight Henry S. Warren (著)
この本を読むまでHAKMEMという文書を知らなかった。1970年ごろのMITのAI Labで書かれた、Hacks Memos の省略形、HAKMEMという文書である。当時のコンピュータ(AI Labにあったのは、PDP-10)は非常にメモリが少ないという制約があったため、プログラムを短くする必要があった。そのときに考え出された、まさに神業的テクニックが収められているのがHAKMEMという文書である。ちなみに、HAKMEMには、Marvin MinskyやRichard Stallmanなどのそうそうたる名前が載っている。
HAKMEMに代表される、さまざまな神業的テクニックをいろいろ集めたのが、このHacker’s Delightである。
下から見て、最初にフラグが立っているところまで、フラグを立てる。例えば、11011000の場合、11011111を返すのが、x | ( x – 1)
この本にはこの手のHackが一杯載っている。先人、恐るべし。ありえないような凝縮の結果がいっぱい詰まっている。swapやるのに、レジスタ使いたくないからって、xorやるか?
ぶっちゃけて言ってしまえば、こんなテクニック、仕事ではよっぽどのことがないと使えねぇ。こんなコード書く状況になったら、こっぴどくコメントを残しておかないと、それこそ、このテクニックの証明をコメントで残しておくくらいの根性がないと使えない。後から見た人は、まったくもって、何やってるのかわからん、になるのが目に見えている。
最近の風潮として、富豪的プログラミングが流行である。その正反対の一番端っこにあるテクニックがこれらのHackであろう。メモリも膨大にあり、CPUクロックも恐ろしい速さでまわる現在において、これらのテクニックが活用されることは、まれであろうと思われる。コードを詰めることよりもデータのキャッシュミスを減らす方が高速化のテクニックとしては有効であったり、そんなことよりも、開発効率が重要視される時代である。
ぶっちゃけて言えば、ここまでコードを詰めることにどれだけの価値が見出せるかということである。今の時代だと、なかなか難しいんだろうなぁ。それでも、価値を認める分野ってのは、必ず存在するわけで。というか実際にこの手の最適化が必要になることも、経験としてないわけじゃないし。
いざというときのために、知識の幅を広げるために、アイデアの幅を広げるために、勉強しておいたほうがいい。ある意味、歴史の勉強みたいなもんだ。先人の知恵をいかし、その上に何をつくるのかを考えなければならない。
ということで、いろいろ読んでいくとなんとなく、アイデアの根底にあるものが見えてくる。ルービックキューブの解法というか戦略を見つけたときのように、根底にある考え方が見えてくる。これがこの本を読む上で重要な点だ。どこに視点をおくと、何が見えてくるのか。ちょっと視点を変えてみることを考えさせられる本である。
でもこのテクニックは今の仕事には使えねぇなぁ。よっぽど困ったときのために封印しておいたほうがいいのかも。