ソースコードのステップ数を計測する便利ツール cloc を紹介します。


本邦の伝統的な企業、いわゆるJTCにてプログラミングに従事していると、お客さんや偉い人から「ステップ数を出せ!」と言われることありますよね。 いまどきステップ数(LOC)がいったい何の役にたつのか不明ではありますが、積極的にケンカを売ってもいいことないのでささっと数えて終わらせたいところです。 目視で数えると日が暮れてしまうのでツールを使うわけですが、Windowsならかぞえチャオ!というソフトが有名ですね。

これでももちろんいいですのが Windows だけでなくLinux や Macでもつかえる便利ツール cloc を今回は紹介したいと思います。

インストール

Linux や WSL ならパッケージマネージャ経由でインストールするのが楽だと思います。例えばUbuntu なら下記のようにすればOKです。

1
sudo apt install cloc

Windows なら exeファイルをダウンロードするのが楽だと思います。 GitHub - AlDanial/cloc/releasesのところに各バージョンの実行可能ファイル(.exe)が置いてあるのでダウンロードします。Mac なら HomeBrew でインストールできます。

基本的な使い方

基本的な使い方は引数でファイルもしくはディレクトリを指定するだけです。 下記では例としてccacheというソフトのコードのステップ数を調べています。 各言語ごとにステップ数が集計されて表示されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ 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 で出力してくれます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ 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 オプションを使います。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$ 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でなくタグ名でもかまいません。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ git log | tail -n10
Date:   Tue Mar 26 16:11:48 2002 +0100

    - use subdirs
    - better status handling

commit f42859a15c39f0efd28382e7e7031895247cc085
Author: Andrew Tridgell &lttridge@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を使用します。 下記の例では最新のコミットの差分を計測しています。下記のようにHEADHEAD^ も指定できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$ 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 に渡せばいいだけです。 詳細はSLOCCountのサイトを参照してください。

まとめ

今回は Linux, Windows, Mac で使えるステップ数計測ツール clocの紹介でした。 単純な計測だけでなく Gitと連携できることがすごいと思います。 さらに XML 形式で出力すれば Jenkinsでコード量の推移を監視できます。ほかにもいろんな使い方があると思うのでいろいろためしてみてください!