めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

「Gitポケットリファレンス」を活用してカーネルソースを読んでみよう!

Gitポケットリファレンス

Gitポケットリファレンス

こちらの書籍を著者様より献本いただきました。ありがとうございます!

本書は、GitHubなどの既存の共有リポジトリの使用を前提として、これから開発に参加しようという読者を想定しているため、「どういうシーンでどのgitコマンドを使えばいいのか」が明確で、わかりやすい構成になっています。実用面にフォーカスしたGitの解説書としては、今のところベストな1冊ではないでしょうか。

ところで・・・・

ちなみに私の場合は、ソースコードを書く時間よりは、読む時間の方がずっと長いのですが、実は「ソースを読むツール」としてもGitは有用です。

Gitリポジトリにはソースコードの過去の全ての変更履歴が残されていますので、

・「いまのコードがどうなっているのか」

だけではなく、

・「どんな歴史をたどっていまのコードができあがったのか」

を読み解くことができます。

これにより、ソースを書いてきた開発者たちが「何を考えて」「何のために」「何をめざして」いまのコードを作り上げたのかを明確に理解することができます。下手なドキュメントを読むよりは、ソフトウェアに対する理解が数倍は深まります。

Gitを利用したソースコードリーディングは、おおきくは次の流れになります。

(1)「git clone」でリポジトリからcloneしてきたコードを読む。
(2) ある部分の処理の意味(何のためにこの処理が入っているのか)が分からなくなる。
(3)「git blame」でその処理を書いた犯人(=commit)を特定する。
(4)「git show」で犯人の言い訳(=commit log)を聞いてみる。
(5)「git checkout」で犯人が悪さをする前のコードに時代を巻き戻して、コードを読み直す。

これを続けることで、現在から過去にさかのぼって、ソースコードの歴史をひもといていくことができます。

例えば、プロのための Linuxシステム・10年効く技術 (Software Design plus)の第4章で紹介した、次のLinuxカーネルソースのコメントの謎(カーネルのバージョン文字列部分が固定でないといけない理由)

      1 /*
      2  *  linux/init/version.c
      3  *
      4  *  Copyright (C) 1992  Theodore Ts'o
      5  *
      6  *  May be freely distributed as part of Linux.
      7  */
      8 
・・・
     40 /* FIXED STRINGS! Don't touch! */  ←ココ
     41 const char linux_banner[] =
     42         "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
     43         LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
     44 
     45 const char linux_proc_banner[] =
     46         "%s version %s"
     47         " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
     48         " (" LINUX_COMPILER ") %s\n";

は、次のgitコマンドを駆使することで、解き明かされます。

$ git blame init/version.c
$ git show c71551ad
$ git checkout c71551ad^

$ git blame init/version.c
$ git show 3eb3c740
$ git checkout 3eb3c740^

$ git blame fs/proc/proc_misc.c
$ git show 8993780a

このコメントを書いた犯人(?)はLinusなのですが、彼の説明は、GitリポジトリのCommit Logで確認することができます。

というわけで、みなさんも早速「Gitポケットリファレンス」を購入して、まずは下記のページに目を通してみましょう。

・第1章 → 全体をよんでGitの考え方をざっくり理解する。

・第2章 → 次のコマンドを理解する。
 p.53 「git clone」の説明
 p.170 「git blame」の説明
 p.168「git show」の説明
 p.115「git checkout」の説明

これで、Gitを活用したソースコードリーディングの準備はばっちりです。

ちなみに、Mainlineカーネルのcloneはこちらからどうぞ。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git