コードリーディングを圧倒的に加速させる一方法 ― GNU GLOBAL

あなたは勉強のために、ある製品のソースコードを読みたいとします。
その時、どうやって読んで行きますか？
今回紹介する[GNU GLOBAL](https://www.gnu.org/software/global/global.html)は、あなたの今のやり方から更にリーディングを加速する方法を提供してくれます。

## GNU GLOBALとは？ 利点は？
* ソースコードタグ付けシステムの一つ
* ✅ タグ付けにより、下記が可能になります
    * 関数名や変数名、マクロから、他の参照されている箇所にジャンプする
    * ソフトウェアのエントリポイントを列挙する
    * 変数名や関数名による索引機能、また検索する
* ✅ タグデータは多くのエディタでサポート（Vim, Emacs, Atom, VSCode, etc...）    
    * 更に、**HTML出力もできます**
        * これによりウェブ上で **スマホでもコードリーディング** を行えるのです！
* ✅ 対応言語が多い
    * C, C++, Javaはもちろんのこと、プラグインによりJavaScriptやPython, Rubyなどもサポート[するよう](https://www.gnu.org/software/global/)です
* ウェブ版のサンプルは[こちら (Linux-3.12 Tour!)](http://www.tamacom.com/tour/kernel/linux/)。

## GNU GLOBALの導入手順
### 1. インストール
* Windowsの方
    1. [配布サイト](http://adoxa.altervista.org/global/)より、最新版のバイナリをダウンロード
    2. 適当なフォルダに解凍し、環境変数でパスを通す
* Linuxの方
    1. [公式サイト](https://www.gnu.org/software/global/download.html)より、ソースコード `global-x.x.x.tar.gz` を適当なフォルダにダウンロード
        * 例： `~/Downloads/global-x.x.x.tar.gz`
    1. 下記コマンドを順に実行する

        ```bash
        $ cd ~/Downloads
        $ tar zxvf global-x.x.x.tar.gz
        $ cd global-x.x.x
        $ ./configure --disable-gtagscscope
        $ make
        $ sudo make install
        ```
* Macの方
    1. 下記でインストールできるようです
    
        ```bash
        $ brew install global
        ```
* 下記コマンドでインストールを確認できます

    ```bash
    $ gtags --version
    gtags (GNU GLOBAL) 6.5.3
    Copyright (c) 2016 Tama Communications Corporation
    License GPLv3+: GNU GPL version 3 or later <http://www.gnu.org/licenses/gpl.html>
    This is free software; you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    ```

### 2. ソースコードから中間ファイルを生成( `gtags` )
1. 例として[Quake 2](https://github.com/id-Software/Quake-2)のコードで試してみましょう

    ```bash
    $ cd ~/Documents
    $ git clone https://github.com/id-Software/Quake-2.git
    ```
2. 下記コマンドを実行します
    - オプションの引数一覧は[こちら](http://www.gnu.org/software/global/globaldoc.html#gtags)

    ```bash
    $ cd ~/Documents/Quake-2
    $ gtags -v
    ```
3. 次の3つのファイルが生成されるはずです

    ```bash
    $ ls G*
    GPATH     GRTAGS    GTAGS
    ```

### 3. 中間ファイルからhtmlを生成( `htags` )
* 下記コマンドを先と同じフォルダで実行します
    * オプションの引数一覧は[こちら](http://www.gnu.org/software/global/globaldoc.html#htags)

    ```bash
    $ htags -vsnaw --tabs 4 --title "Quake 2"
    ```
    * この規模のソフトウェアであれば、生成は2分程度で完了します
* 注) 文字化け対策 (通常不要)
日本語のコメントなどがUTF-8以外で保存されている場合、ブラウザで開いたときに文字化けしてしまいます。その対策です：
    1. 下記の内容を持つhtmlファイルをコードのフォルダに作成します (e.g. `header.html` )

        ```bash:header.html
        <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" />
        ```
    2. 生成時は下記コマンドを代わりに実行します

        ```bash
        $ htags -vsnaw --tabs 4 --title "TITLE" --html-header=./header.html
        ```

### 4. 完了
生成された `HTML` フォルダの `index.html` を開けばOKです。お疲れ様でした。
また、適当なウェブサーバーに上記 `HTML` フォルダを配置すれば、簡単にウェブ経由でのアクセスが可能になります。

## リーディングの方法
GNU GLOBALを用いたコードリーディング方法には、主に2つあります。

1. エントリポイントから攻める
    * GNU GLOBALは、 `index.html` にエントリポイントを列挙してくれる（`MAINS` セクション）
        * これを用いてエントリポイントとなる関数に飛び、アプリケーションが起動してからの処理を追う、という方法
    * ✅ まず全体の流れを把握できる、トップダウンな方法
    * ❌ イベント駆動なソフトウェアでは、あまり有効な方法ではない


2. 名前から攻める
    * GNU GLOBALは、変数名・関数名を索引化してくれる（`DEFINITIONS` セクション）
        * これを用いて、気になる処理に関わりそうな関数名や変数名を予測し、それらの宣言されている場所に直接飛ぶ、という方法
    * ✅ 興味のある部分から読み始められる、ボトムアップな方法
    * ❌ 読みたい処理をどこでしているかを探すのが困難な場合もある

それぞれ長所短所あるので、状況に応じて方法を使い分けると良いでしょう。

## まとめ
* コードリーディング体験を向上する手段として、GNU GLOBALを紹介しました
* 本記事の使い方を読めば、今日から導入できるはずです
* 読む速度を上げて、更に成長を加速させましょう💪