C
C++
勉強
コードリーディング
gtags

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

あなたは勉強のために、ある製品のソースコードを読みたいとします。
その時、どうやって読んで行きますか?
今回紹介するGNU GLOBALは、あなたの今のやり方から更にリーディングを加速する方法を提供してくれます。

GNU GLOBALとは? 利点は?

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

GNU GLOBALの導入手順

1. インストール

  • Windowsの方
    1. 配布サイトより、最新版のバイナリをダウンロード
    2. 適当なフォルダに解凍し、環境変数でパスを通す
  • Linuxの方

    1. 公式サイトより、ソースコード global-x.x.x.tar.gz を適当なフォルダにダウンロード
      • 例: ~/Downloads/global-x.x.x.tar.gz
    2. 下記コマンドを順に実行する

      $ cd ~/Downloads
      $ tar zxvf global-x.x.x.tar.gz
      $ cd global-x.x.x
      $ ./configure --disable-gtagscscope
      $ make
      $ sudo make install
      
  • Macの方

    1. 下記でインストールできるようです

      $ 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 )

  1. 例としてQuake 2のコードで試してみましょう

    $ cd ~/Documents
    $ git clone https://github.com/id-Software/Quake-2.git
    
  2. 下記コマンドを実行します

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

    $ ls G*
    GPATH     GRTAGS    GTAGS
    

3. 中間ファイルからhtmlを生成( htags )

  • 下記コマンドを先と同じフォルダで実行します

    $ htags -vsnaw --tabs 4 --title "Quake 2"
    
    • この規模のソフトウェアであれば、生成は2分程度で完了します
  • 注) 文字化け対策 (通常不要)
    日本語のコメントなどがUTF-8以外で保存されている場合、ブラウザで開いたときに文字化けしてしまいます。その対策です:

    1. 下記の内容を持つhtmlファイルをコードのフォルダに作成します (e.g. header.html )

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

      $ 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を紹介しました
  • 本記事の使い方を読めば、今日から導入できるはずです
  • 読む速度を上げて、更に成長を加速させましょう💪