ハッカーのたのしみ: 本物のプログラマはいかにして問題を解くか

  • エスアイビー・アクセス
3.38
  • (10)
  • (11)
  • (58)
  • (1)
  • (0)
本棚登録 : 460
感想 : 16
本ページはアフィリエイトプログラムによる収益を得ています
  • Amazon.co.jp ・本 (321ページ)
  • / ISBN・EAN: 9784434046681

作品紹介・あらすじ

超A級プログラマの秘密の「技」を公開。

感想・レビュー・書評

並び替え
表示形式
表示件数
絞り込み
  • レジスタのフィールド値から意味へのデコーディング、および、値からフィールド値へのエンコーディングに使えるビット演算のテクニック記載されている。
    Armv7のDBGBCR.BASのデコーディングで、trailing 0’sを消し、次に、2の冪乗-1であることを検査して、最後に、1であるビットの数を求めるのに本書のテクニックを使った。

  • 論理演算と算術演算、ビット演算を駆使して、少しでも計算効率の良いコードを書くための数々のテクニックを紹介している本。

    内容的に難しいだけでなく、文章としても読み難いため、一度読んだだけではすぐにピンと来ないものが多い。また、現代のプログラミングでは、このような可読性も保守性も低いコードは嫌われるため、実用的でもない。それだけに、タイトル通りハッカーのたのしみといえる内容になっている。

    読みながら、20数年前、高校生時代に機械語でコーディングしていた頃のことや、大学で課題をいかに短くコーディングするかを競っていた頃のことを懐かしく思い出した。もっとも、本書に出ているような高度なことはほとんどやっていなかったが。

  • 【由来】


    【期待したもの】

    ※「それは何か」を意識する、つまり、とりあえずの速読用か、テーマに関連していて、何を掴みたいのか、などを明確にする習慣を身につける訓練。

    【要約】


    【ノート】

  • 超マニアックプログラミング集。なるほどいう技法もあるが、可読性は最悪。可読性、保守性を重んじる現在のプログラミングでは、とりあえず役に立たない。が、面白い。

  • アルゴリズム本。きちんと数学的思考で、難しめ。

  • パリティチェックや平方根計算など、ライブラリのライブラリに相当する演算で、いかにCPUフレンドなコードを実装するか(実装しているか)、という本。CPUへの命令数をなるべく減らし、負荷の小さいアルゴリズムを作っていくのは勉強になる。実際にこうした実装をすることはほぼないだろうけど、ビット演算は超重要。

  • この本に載っているトリッキーなコードが研究で必要になるとは思わなかった.

  • 要再読

  • 一時ネガティブな言葉として定着しそうになった「ハッカー」という言葉も、昨今ではほぼ完全に復権しているが、それだけにあまりに幅広い範囲で使われるようになったが、本書「ハッカーのたのしみ」におけるハックは、「Binary Hacks」よりさらに一段下のレベル、すなわちアセンブラー一命令単位のハックである。

    目次
    推薦の辞[和田英一]
    序文[Guy L. Steele, Jr.]
    まえがき
    第1章 序論
    第2章 基本操作
    第3章 2の冪乗の境界
    第4章 算術的な境界
    第5章 ビットの数え上げ
    第6章 ワードの探索
    第7章 ビットやバイト単位の並べ替え
    第8章 乗算
    第9章 整数除算
    第10章 整数定数による除算
    第11章 いくつかの初等関数
    第12章 数の表現のための一風変わった基数
    第13章 グレイコード
    第14章 ヒルベルト曲線
    第15章 浮動少数点
    第16章 素数に関する式
    付録A 4ビットマシンのための算術表
    付録B ニュートン表
    参考文献
    索引
    邦訳が出た際に、「404 Blog Not Found:C - でも一番右端の立っているビット位置を求めてみた」のようなことがちょっと流行ったが、本書に出てくるdelightはこういう「バイナリーハッカーにしかわからない」ものだけではない。

    たとえば、除算。ただの割り算。人間にとっても四則演算のうちで最も難解なこれは、計算機にとっても苦手な作業の一つであり、本書はこのためだけに二章を割いている。本書の中で著者が最も力を注いでいるのもここだ。

    計算機がどれほど割り算を苦手としているかは、以下のベンチマークを走らせてみればわかる。

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/time.h>

    typedef unsigned long long U64;

    double timeu(){
    struct timeval now;
    gettimeofday(&now, NULL);
    return now.tv_sec + now.tv_usec/1e6;
    }

    int main (int argc, char **argv){
    U64 i, q = 0, count = 0;
    double t;
    if (argc > 1){
    count = (U64)atof(argv[1]);
    printf("count = %lld\n====\n", count);
    for (t = timeu(), i = 1; i <= count; i++);
    printf("nop :%.6gs (q=%lld)\n", timeu() - t, q);
    for (t = timeu(), i = 1; i <= count; i++) q = count + i;
    printf("add +:%.6gs (q=%lld)\n", timeu() - t, q);
    for (t = timeu(), i = 1; i <= count; i++) q = count - i;
    printf("sub -:%.6gs (q=%lld)\n", timeu() - t, q);
    for (t = timeu(), i = 1; i <= count; i++) q = count * i;
    printf("mul *:%.6gs (q=%lld)\n", timeu() - t, q);
    for (t = timeu(), i = 1; i <= count; i++) q = count / i;
    printf("div /:%.6gs (q=%lld)\n", timeu() - t, q);
    }
    return 0;
    }
    以下はいずれも count = 1e9 = 10億での結果。

    速くなったのはわかった。しかしいったいこれはなんなのだ!?

    本書の第10章を見れば、わかる。

    見てのとおり、このトリックをGCCは知っている上、ユーザーに見えない形で活用している。単なるユーザーは、本書の知見をほとんど必要としないだろう。コンパイラーがよきにはからってくれるのだから。しかし一流の大工たちは、仕事を始める前にまず刃物を研ぐ。刃先を使い捨てに出来る時代にあってもそうしている。

    その意味で、本書はプログラマーにとっての砥石なのである。

    使い捨ての刃先に頼る、使い捨てのプログラマーに満足できないあなたにとって、これほどのよろこびがあるだろうか。

  • 20100827購入。買う市 株式会社@アマゾン。

全16件中 1 - 10件を表示

ヘンリーS.ウォーレンジュニアの作品

  • 話題の本に出会えて、蔵書管理を手軽にできる!ブクログのアプリ AppStoreからダウンロード GooglePlayで手に入れよう
ツイートする
×