本邦の伝統的な企業、いわゆるJTCにてプログラミングに従事していると、お客さんや偉い人から「ステップ数を出せ!」と言われることありますよね。いまどきステップ数(LOC)がいったい何の役にたつのか不明ではありますが、積極的にケンカを売ってもいいことないのでささっと数えて終わらせたいところです。
目視で数えると日が暮れてしまうのでツールを使うわけですが、Windows なら「かぞえチャオ!」というソフトが有名ですね。
http://ciao-ware.c.ooco.jp/ft_manu.html
これでももちろんいいですのが Windows だけでなくLinux や Mac でもつかえる便利ツール cloc を今回は紹介したいと思います。
インストール
Linux や WSL ならパッケージマネージャ経由でインストールするのが楽だと思います。例えばUbuntu なら下記のようにすればOKです。
$ sudo apt install cloc
Windows なら exe ファイルをダウンロードするのが楽だと思います。公式サイトのの下記のところに各バージョンの実行可能ファイル(.exe)が置いてあるのでダウンロードします。
Mac なら HomeBrew でインストールできます。
基本的な使い方
基本的な使い方は引数でファイルもしくはディレクトリを指定するだけです。下記では例として ccache というソフトのコードのステップ数を調べています。各言語ごとにステップ数が集計されて表示されます。
$ git clone https://github.com/ccache/ccache.git $ cd ccache $ cloc . 366 text files. 365 unique files. 21 files ignored. github.com/AlDanial/cloc v 1.82 T=0.47 s (736.4 files/s, 253444.8 lines/s) -------------------------------------------------------------------------------- Language files blank comment code -------------------------------------------------------------------------------- Assembly 12 106 82 26265 C/C++ Header 104 5536 6578 25049 C++ 99 4069 3139 23322 Bourne Again Shell 47 1731 676 6615 C 16 559 607 5696 AsciiDoc 4 1675 0 3829 CMake 27 186 164 1113 Python 6 107 46 607 YAML 4 65 17 364 Markdown 9 84 0 271 Bourne Shell 8 51 28 201 Dockerfile 9 16 8 167 CSS 1 9 3 38 -------------------------------------------------------------------------------- SUM: 346 14194 11348 93537 --------------------------------------------------------------------------------
もし Excel などで集計したい場合は –csv オプションが便利です。下記のように CSV で出力してくれます。
$ cloc --csv . 366 text files. 365 unique files. 21 files ignored. files,language,blank,comment,code,"github.com/AlDanial/cloc v 1.82 T=0.50 s (694.0 files/s, 238861.7 lines/s)" 12,Assembly,106,82,26265 104,C/C++ Header,5536,6578,25049 99,C++,4069,3139,23322 47,Bourne Again Shell,1731,676,6615 16,C,559,607,5696 4,AsciiDoc,1675,0,3829 27,CMake,186,164,1113 6,Python,107,46,607 4,YAML,65,17,364 9,Markdown,84,0,271 8,Bourne Shell,51,28,201 9,Dockerfile,16,8,167 1,CSS,9,3,38 346,SUM,14194,11348,93537
もしファイルごとに結果が欲しい場合は –by-file オプションを使います。
$ cloc --by-file . 366 text files. 365 unique files. 21 files ignored. github.com/AlDanial/cloc v 1.82 T=0.49 s (711.5 files/s, 244884.5 lines/s) ----------------------------------------------------------------------------------------------------------------- File blank comment code ----------------------------------------------------------------------------------------------------------------- ./src/third_party/doctest.h 1030 559 5227 ./src/third_party/httplib.cpp 936 376 5011 ./src/third_party/xxhash.h 552 2222 2806 ./src/third_party/blake3/blake3_avx512_x86-64_windows_msvc.asm 8 10 2616 ./src/third_party/blake3/blake3_avx512_x86-64_windows_gnu.S 8 0 2607 ./src/third_party/blake3/blake3_avx512_x86-64_unix.S 7 16 2562 ./src/third_party/fmt/core.h 419 334 2483 ./src/third_party/fmt/format.h 339 347 2418 ./src/third_party/blake3/blake3_sse2_x86-64_windows_msvc.asm 17 4 2329 ./src/third_party/blake3/blake3_sse2_x86-64_windows_gnu.S 5 0 2327 ./src/third_party/blake3/blake3_sse2_x86-64_unix.S 7 16 2268 ./src/third_party/fmt/format-inl.h 200 210 2233 ./src/third_party/blake3/blake3_sse41_x86-64_windows_msvc.asm 19 4 2066 ./src/third_party/blake3/blake3_sse41_x86-64_windows_gnu.S 5 0 2064 ./src/third_party/blake3/blake3_sse41_x86-64_unix.S 7 16 2005 ./src/third_party/nonstd/expected.hpp 484 175 1833 ./src/third_party/blake3/blake3_avx2_x86-64_windows_gnu.S 2 0 1815 ./src/third_party/blake3/blake3_avx2_x86-64_windows_msvc.asm 15 0 1813 ./src/third_party/blake3/blake3_avx2_x86-64_unix.S 6 16 1793 ./src/ccache.cpp 271 346 1746 ./doc/NEWS.adoc 1085 0 1560 ./doc/MANUAL.adoc 410 0 1458 以下略
これだけでも充分使えますがほかにも機能が盛り沢山です。やりたいことはたいていあるので cloc –help で調べてみてください。
Git との連携
cloc のいろんな機能でとくにおすすめなのがGitとの連携です。
ある時点でのステップ数を計測
引数に Git コミットID を渡すことでその時点でのステップ数を計測してくれます。下記の例は最初のコミット時点でのステップ数です。渡すのはコミットIDでなくタグ名でもかまいません。
$ git log | tail -n10 Date: Tue Mar 26 16:11:48 2002 +0100 - use subdirs - better status handling commit f42859a15c39f0efd28382e7e7031895247cc085 Author: Andrew Tridgell <tridge@samba.org> Date: Tue Mar 26 15:46:43 2002 +0100 first version of C compilercache $ cloc --git f42859a15c39f0efd28382e7e7031895247cc085 10 text files. 10 unique files. 0 files ignored. github.com/AlDanial/cloc v 1.82 T=0.02 s (496.8 files/s, 44858.6 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- C 7 162 62 578 C/C++ Header 2 26 17 47 make 1 3 0 8 ------------------------------------------------------------------------------- SUM: 10 191 79 633 -------------------------------------------------------------------------------
変更差分のステップ数を計測
修正差分のステップ数も簡単に計測できます。 オプション–diff を使用します。下記の例では最新のコミットの差分を計測しています。下記のようにHEAD や HEAD^ も指定できます。
$ cloc --git --diff HEAD^ HEAD 1 text file. 1 text file. 0 files ignored. github.com/AlDanial/cloc v 1.82 T=0.07 s (14.9 files/s, 14.9 lines/s) ------------------------------------------------------------------------------- Language files blank comment code ------------------------------------------------------------------------------- AsciiDoc same 0 0 0 1558 modified 1 0 0 2 added 0 0 0 0 removed 0 0 0 0 ------------------------------------------------------------------------------- SUM: same 0 0 0 1558 modified 1 0 0 2 added 0 0 0 0 removed 0 0 0 0 -------------------------------------------------------------------------------
Jenkins との連携
上記の使い方でも充分便利ですが、Jenkins と組み合わせればコード量の推移をグラフにして可視化できます。Jenkinsのプラグイン SLOCCount を使えば簡単です。使い方は下記のプラグインのサイトを参照してください。XML形式で計測結果を出力してそれを SLOCCount に渡せばいいだけです。
まとめ
今回は Linux, Windows, Mac で使えるステップ数計測ツール Cloc の紹介でした。単純な計測だけでなく Git と連携できることがすごいと思います。さらに XML 形式で出力すれば Jenkins でコード量の推移を監視できます。ほかにも色んな使い方があると思うのでいろいろためしてみてください!
コメント