あなたは勉強のために、ある製品のソースコードを読みたいとします。
その時、どうやって読んで行きますか?
今回紹介するGNU GLOBALは、あなたの今のやり方から更にリーディングを加速する方法を提供してくれます。
GNU GLOBALとは? 利点は?
- ソースコードタグ付けシステムの一つ
 - ✅ タグ付けにより、下記が可能になります
- 関数名や変数名、マクロから、他の参照されている箇所にジャンプする
 - ソフトウェアのエントリポイントを列挙する
 - 変数名や関数名による索引機能、また検索する
 
 - ✅ タグデータは多くのエディタでサポート(Vim, Emacs, Atom, VSCode, etc...)
- 更に、HTML出力もできます
- これによりウェブ上で スマホでもコードリーディング を行えるのです!
 
 
 - 更に、HTML出力もできます
 - ✅ 対応言語が多い
- C, C++, Javaはもちろんのこと、プラグインによりJavaScriptやPython, Rubyなどもサポートするようです
 
 - ウェブ版のサンプルはこちら (Linux-3.12 Tour!)。
 
GNU GLOBALの導入手順
1. インストール
- 
Windowsの方
- 配布サイトより、最新版のバイナリをダウンロード
 - 適当なフォルダに解凍し、環境変数でパスを通す
 
 - 
Linuxの方
- 
公式サイトより、ソースコード
global-x.x.x.tar.gzを適当なフォルダにダウンロード- 例: 
~/Downloads/global-x.x.x.tar.gz 
 - 例: 
 - 
下記コマンドを順に実行する
$ cd ~/Downloads $ tar zxvf global-x.x.x.tar.gz $ cd global-x.x.x $ ./configure --disable-gtagscscope $ make $ sudo make install 
 - 
 - 
Macの方
- 
下記でインストールできるようです
$ brew install global 
 - 
 - 
下記コマンドでインストールを確認できます
$ 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 )
- 
例としてQuake 2のコードで試してみましょう
$ cd ~/Documents $ git clone https://github.com/id-Software/Quake-2.git - 
下記コマンドを実行します
- オプションの引数一覧はこちら
 
$ cd ~/Documents/Quake-2 $ gtags -v - 
次の3つのファイルが生成されるはずです
$ ls G* GPATH GRTAGS GTAGS 
3. 中間ファイルからhtmlを生成( htags )
- 
下記コマンドを先と同じフォルダで実行します
- オプションの引数一覧はこちら
 
$ htags -vsnaw --tabs 4 --title "Quake 2"- この規模のソフトウェアであれば、生成は2分程度で完了します
 
 - 
注) 文字化け対策 (通常不要)
日本語のコメントなどがUTF-8以外で保存されている場合、ブラウザで開いたときに文字化けしてしまいます。その対策です:- 
下記の内容を持つhtmlファイルをコードのフォルダに作成します (e.g.
header.html)header.html<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" /> - 
生成時は下記コマンドを代わりに実行します
$ htags -vsnaw --tabs 4 --title "TITLE" --html-header=./header.html 
 - 
 
4. 完了
生成された HTML フォルダの index.html を開けばOKです。お疲れ様でした。
また、適当なウェブサーバーに上記 HTML フォルダを配置すれば、簡単にウェブ経由でのアクセスが可能になります。
リーディングの方法
GNU GLOBALを用いたコードリーディング方法には、主に2つあります。
- 
エントリポイントから攻める
- GNU GLOBALは、 
index.htmlにエントリポイントを列挙してくれる(MAINSセクション)- これを用いてエントリポイントとなる関数に飛び、アプリケーションが起動してからの処理を追う、という方法
 
 - ✅ まず全体の流れを把握できる、トップダウンな方法
 - ❌ イベント駆動なソフトウェアでは、あまり有効な方法ではない
 
 - GNU GLOBALは、 
 - 
名前から攻める
- GNU GLOBALは、変数名・関数名を索引化してくれる(
DEFINITIONSセクション)- これを用いて、気になる処理に関わりそうな関数名や変数名を予測し、それらの宣言されている場所に直接飛ぶ、という方法
 
 - ✅ 興味のある部分から読み始められる、ボトムアップな方法
 - ❌ 読みたい処理をどこでしているかを探すのが困難な場合もある
 
 - GNU GLOBALは、変数名・関数名を索引化してくれる(
 
それぞれ長所短所あるので、状況に応じて方法を使い分けると良いでしょう。
まとめ
- コードリーディング体験を向上する手段として、GNU GLOBALを紹介しました
 - 本記事の使い方を読めば、今日から導入できるはずです
 - 読む速度を上げて、更に成長を加速させましょう💪