LoginSignup
20
35

More than 5 years have passed since last update.

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

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
35