kiyokaのブログアーカイブ

Archive of old blog posts

ソーシャル化するOSS開発者たちを読んだ

Subversionとgitについて書かれている。 私はまだgitを使ったことが無いのだけど、そんなに速いのか。

ソーシャル化するOSS開発者たち サーバが不要で、いくつかコマンドを叩くだけで、手軽にブランチが作れて、 しかも非常に速い。単に新しくブランチを作るだけなら、1つあたり41バイト のファイルが生成されるだけなので、ブランチングは処理的にも心理的にもコ ストが低い。 . . 0.5秒で差分が取れるのか、同じ作業に30秒かかるのかでは、まったく仕事の やり方が変わってくるという。例えばPythonで書かれたMercurialというもの がある。これはGitと同様の分散ソースコード管理ツールでリーナスも評価は しているのだが、パフォーマンスの点でGitがベターだと訴える。「コミット や差分作成に30秒かかるかもしれない。30秒というと、そんなに悪くないと 思うかもしれないけど、まじめな話、10分の1秒というのに慣れてしまったら 30秒なんて最低なんです」

一体どんな顔をしているのかgitのソースコードをダウンロードしてチラ見しておいた。 スゲー。 LinusのコーディングスタイルはLinuxとgitでほとんど同じだ。 カーネル(Linux)とアプリケーション(git)は、おそらく違うスタイルで書かれているんだろうと思っていたのだが。

例えば、gitの中のsha1値をhexに変換する関数

char *sha1_to_hex(const unsigned char *sha1)
{
        static int bufno;
        static char hexbuffer*4**50*;
        static const char hex[] = "0123456789abcdef";
        char *buffer = hexbuffer*3 & ++bufno*, *buf = buffer;
        int i;

        for (i = 0; i < 20; i++) {
                unsigned int val = *sha1++;
                *buf++ = hex*val >> 4*;
                *buf++ = hex*val & 0xf*;
        }
        *buf = '\0';

        return buffer;
}

20とか50とか即値が使われまくり。

この関数もgitとは思えない。カーネルの中身みたいな雰囲気。

unsigned long unpack_object_header_buffer(const unsigned char *buf,
                unsigned long len, enum object_type *type, unsigned long *sizep)
{
        unsigned shift;
        unsigned char c;
        unsigned long size;
        unsigned long used = 0;

        c = buf*used++*;
        *type = (c >> 4) & 7;
        size = c & 15;
        shift = 4;
        while (c & 0x80) {
                if (len <= used || sizeof(long) * 8 <= shift) {
                        error("bad object header");
                        return 0;
                }
                c = buf*used++*;
                size += (c & 0x7f) << shift;
                shift += 7;
        }
        *sizep = size;
        return used;
}

ちなみに、Linusがなんで C++ で書かないのと言われて反論しているメッセージが見つかった。 Gmane – Mail To News And Back Again

When I first looked at Git source code two things struck me as odd:

  1. Pure C as opposed to C++. No idea why. Please don’t talk about portability, it’s BS.

YOU are full of bullshit.

C++ is a horrible language. It’s made more horrible by the fact that a lot of substandard programmers use it, to the point where it’s much much easier to generate total and utter crap with it. Quite frankly, even if the choice of C were to do nothing but keep the C++ programmers out, that in itself would be a huge reason to use C. . . .

ところで、BS(bullshit)ってどれくらい強い言いまわしなの? 気の弱い私はちょっと心配になるよー。 さて、git本体のソースコードの話は置いといて、GitHubには興味を持ったので、emacsの良いgit-modeを見つけたら一度つかってみよう。 pcl-svn.elと似たキーバインドの奴があるとうれしいんだけど。