あなたは勉強のために、ある製品のソースコードを読みたいとします。
その時、どうやって読んで行きますか?
今回紹介する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を紹介しました
- 本記事の使い方を読めば、今日から導入できるはずです
- 読む速度を上げて、更に成長を加速させましょう💪