ソースコードの行数を簡単にカウントする方法は?推定コスト・必要人数・期間等も瞬時に算出!

プログラムソースコードの行数を簡単にカウントする方法は? Linux

開発完了したシステムであったり、開発中のシステムの規模を算出しようとした場合、ソースコードの行数を算出する場面が非常に多いです。ソースコードには各プログラミング言語毎にコメント記法が異なっていたり、言語によってはコードを複数行に渡って記述されている場合もあります。実質的なソースコードの行数やコメント行数などを算出するのは大変です。そのような場合にソースコードを解析して、プログラミング言語毎にソースコードの行数を算出してくれるツールを利用しましょう。

様々なツールが存在していますが、この記事で紹介する「scc」という無料のツールが最も使い勝手が良く、結果が分かりやすかったので使い方や、実際にシステムを解析した結果を共有します。私が実際に携わったプロジェクトのソースコードもほぼ正確に解析できていましたので、非常に信頼できるツールだと思います。

Sloc Cloc and Code (scc)というソースコード解析ツール

「Sloc Cloc and Code (scc)」というツールは、ソースコードの行数を計算し、推定されるソースコードの複雑さに基づいて開発工数や所要期間を見積もってくれるツールです。開発工数や期間を見積もるのにCOCOMO (ココモ法)が利用されています。COCOMO (ココモ法)というのは、 ソフトウェアのソースコードを基にシステムの工数や期間を見積もる手法のことです。これによってソースコードを解析すると共に、推定される工数と期間も表示してくれるツールです。

GitHub - boyter/scc: Sloc, Cloc and Code: scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written in pure Go
Sloc, Cloc and Code: scc is a very fast accurate code counter with complexity calculations and COCOMO estimates written ...

sccツールのインストール

Windows / MacOS / Linux のいずれのプラットフォームでもsccツールは利用可能です。インストール方法は公式サイトにも記載されていますが、いくつかのプラットフォームでのインストールは次の通りです。

Ubuntuにインストールする場合、snap経由でインストールできます。

$ sudo snap install scc

MacOSであればHomebrewで次のようにインストール可能です。

$ brew install scc

Windowsの場合にはインストール方法はいくつかありますが、主要なものを記載します。

# Scoopでインストールする場合

scoop install scc


# Chocolateyでインストールする場合

choco install scc


WinGetコマンドでインストールする場合

winget install --id benboyter.scc --source winget

sccツールの使い方

実際に何らかのプロジェクトを用意して、ソースコードの行数を数えてみます。公式サイトでも紹介されていますが、Redisというメモリ上でデータを管理するインメモリデータべースのプロジェクトのソースコードをダウンロードして解析してみます。

Redisプロジェクトのソースコードをダウンロードする

まずはRedisプロジェクトのソースコードをダウンロードします。

$ git clone https://github.com/redis/redis.git

これでローカルマシンにredisというディレクトリが作成され、その中にRedisプロジェクトのソースコードが保存されます。

sccツールを実行してみる

それではsccツールを使ってRedisプロジェクトのソースコードを計算させてみましょう。Redisプロジェクトのソースコード容量は、2024年12月18日時点で162MBです。sccコマンドの引数に、解析させたいディレクトリ名を指定することで、そのディレクトリ内のソースコードを解析してくれます。

$ scc redis
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
C                          425    253709    29425     42638   181646      45460
JSON                       402     24651        2         0    24649          0
C Header                   283     47977     5412     10745    31820       2900
TCL                        212     62480     6854      4055    51571       3586
Shell                       75      1624      239       343     1042        185
Markdown                    24      3635      913         0     2722          0
Autoconf                    22     11729     1123      1419     9187       1015
Lua                         20       525       68        70      387         65
Makefile                    19      1799      342       150     1307         83
YAML                        18      2561      138        47     2376          0
Plain Text                  10      1106      193         0      913          0
gitignore                   10       174       18         0      156          0
Ruby                         9       813       73       101      639        123
C++                          8       546       85        43      418         43
Python                       7      1609      125        54     1430        157
HTML                         5      9658     2928        12     6718          0
License                      3        90       17         0       73          0
CMake                        2       298       53         5      240         14
CSS                          2       107       16         0       91          0
Systemd                      2        80        6         0       74          0
BASH                         1       143       16         5      122         38
Batch                        1        28        2         0       26          3
C++ Header                   1         9        1         3        5          0
Extensible Styleshe…         1        10        0         0       10          0
JavaScript                   1        31        1         0       30          5
MSBuild                      1        11        0         0       11          0
Module-Definition            1     11239     2094         0     9145        167
SVG                          1         1        0         0        1          0
Smarty Template              1        44        1         0       43          5
m4                           1       951      218        64      669          0
───────────────────────────────────────────────────────────────────────────────
Total                     1568    437638    50363     59754   327521      53849
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $11,819,427
Estimated Schedule Effort (organic) 35.16 months
Estimated People Required (organic) 29.87
───────────────────────────────────────────────────────────────────────────────
Processed 15463675 bytes, 15.464 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────

Redisプロジェクトのソースコードを解析結果が表示されるまでに、私の環境では1秒もかかりませんでしたので非常に高速にソースコードが解析できました。

sccツールの結果の見方

それではこの結果の一部を詳しく見ていきます。一番左列の「Language」はプログラミング言語を指しています。Redisプロジェクトでは様々なプログラミング言語を使用しています。下記に一部抜粋した情報を記載していますが、C言語、JSONデータ、Ruby言語、Python言語、HTMLなどなど、様々な言語が使用されています。

───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
C                          425    253709    29425     42638   181646      45460
JSON                       402     24651        2         0    24649          0
Ruby                         9       813       73       101      639        123
Python                       7      1609      125        54     1430        157
HTML                         5      9658     2928        12     6718          0
(一部省略)

次に「Files」列には、プログラミング言語毎に検出されたファイル数が表示されています。C言語であれば425ファイル存在しています。次に「Lines」列ですが、これは各プログラミング言語毎の行数の総計です。C言語で記述された425ファイルの総行数ということになります。ですのでC言語で記述されたソースコード行数は、253,709行ということになります。この中には空行やコメント行も含まれていますので、空行は「Blanks」という列に表示され、コメント行は「Comments」列にそれぞれの合計数が表示されています。この「Blanks」と「Comments」以外の残りが実際のプログラムコードが書かれた行数になります。それが「Code」という列に表示されており、C言語の場合は45,460行です。

まとめると、C言語の場合、425ファイル存在し、総合計行数は253,709行、その中の空行の合計数は29,425行、さらにコメント行数は42,638行、空行とコメントを除いたプログラムのコード行数は181,646行となります。

最後の列の「Complexity」はCOCOMO(ココモ法)で開発工数や期間などを見積もるための複雑さの情報が表示されています。RedisプロジェクトのC言語の複雑さの値は45,460となっています。

COCOMO(ココモ法)の詳細については本記事では詳しく触れませんが、sccツールではCOCOMO(ココモ法)で算出した推定される開発コスト、開発所要期間、必要人数も同時に表示してくれます。

───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $11,819,427
Estimated Schedule Effort (organic) 35.16 months
Estimated People Required (organic) 29.87
───────────────────────────────────────────────────────────────────────────────

Redisプロジェクトをの場合、推定される開発コストは$11,819,427ドル(日本円で約18億円くらい[1ドル=150円の場合])、推定される開発期間は35.16ヶ月、必要人数は29.87人ということになります。

これらの結果にはそれぞれ「organic」と表示されています。organicとは、COCOMO法のプロジェクトタイプの中の1つで、比較的小規模な体制で行うもので熟練した開発者が携わったりすることのあるプロジェクトタイプです。sccツールではorganic以外にも、semi-detached, embeddedというプロジェクトタイプを指定することもできます。

organic小規模の開発チームによる開発
embedded大規模な開発チームによる開発
semi-detachedorganicとembeddedの中間規模の開発チームによる開発

見積もり方法を変更するには、sccコマンドに「–cocomo-project-type embedded」あるいは「–cocomo-project-type semi-detached」というオプションを付けると見積もりタイプを変更できます。以下はそれぞれのCOCOMO法におけるプロジェクトタイプを変更した場合の結果です。それぞれのプロジェクトタイプによって、推定開発コストや推定開発期間、推定必要人数が大きく変わることが分かります。

$ scc --cocomo-project-type embedded redis
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
C                          425    253709    29425     42638   181646      45460
JSON                       402     24651        2         0    24649          0
C Header                   283     47977     5412     10745    31820       2900
TCL                        212     62480     6854      4055    51571       3586
Shell                       75      1624      239       343     1042        185
Markdown                    24      3635      913         0     2722          0
Autoconf                    22     11729     1123      1419     9187       1015
Lua                         20       525       68        70      387         65
Makefile                    19      1799      342       150     1307         83
YAML                        18      2561      138        47     2376          0
Plain Text                  10      1106      193         0      913          0
gitignore                   10       174       18         0      156          0
Ruby                         9       813       73       101      639        123
C++                          8       546       85        43      418         43
Python                       7      1609      125        54     1430        157
HTML                         5      9658     2928        12     6718          0
License                      3        90       17         0       73          0
CMake                        2       298       53         5      240         14
CSS                          2       107       16         0       91          0
Systemd                      2        80        6         0       74          0
BASH                         1       143       16         5      122         38
Batch                        1        28        2         0       26          3
C++ Header                   1         9        1         3        5          0
Extensible Styleshe…         1        10        0         0       10          0
JavaScript                   1        31        1         0       30          5
MSBuild                      1        11        0         0       11          0
Module-Definition            1     11239     2094         0     9145        167
SVG                          1         1        0         0        1          0
Smarty Template              1        44        1         0       43          5
m4                           1       951      218        64      669          0
───────────────────────────────────────────────────────────────────────────────
Total                     1568    437638    50363     59754   327521      53849
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (embedded) $42,264,288
Estimated Schedule Effort (embedded) 34.82 months
Estimated People Required (embedded) 107.84
───────────────────────────────────────────────────────────────────────────────
Processed 15463675 bytes, 15.464 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
$ scc --cocomo-project-type semi-detached redis
───────────────────────────────────────────────────────────────────────────────
Language                 Files     Lines   Blanks  Comments     Code Complexity
───────────────────────────────────────────────────────────────────────────────
C                          425    253709    29425     42638   181646      45460
JSON                       402     24651        2         0    24649          0
C Header                   283     47977     5412     10745    31820       2900
TCL                        212     62480     6854      4055    51571       3586
Shell                       75      1624      239       343     1042        185
Markdown                    24      3635      913         0     2722          0
Autoconf                    22     11729     1123      1419     9187       1015
Lua                         20       525       68        70      387         65
Makefile                    19      1799      342       150     1307         83
YAML                        18      2561      138        47     2376          0
Plain Text                  10      1106      193         0      913          0
gitignore                   10       174       18         0      156          0
Ruby                         9       813       73       101      639        123
C++                          8       546       85        43      418         43
Python                       7      1609      125        54     1430        157
HTML                         5      9658     2928        12     6718          0
License                      3        90       17         0       73          0
CMake                        2       298       53         5      240         14
CSS                          2       107       16         0       91          0
Systemd                      2        80        6         0       74          0
BASH                         1       143       16         5      122         38
Batch                        1        28        2         0       26          3
C++ Header                   1         9        1         3        5          0
Extensible Styleshe…         1        10        0         0       10          0
JavaScript                   1        31        1         0       30          5
MSBuild                      1        11        0         0       11          0
Module-Definition            1     11239     2094         0     9145        167
SVG                          1         1        0         0        1          0
Smarty Template              1        44        1         0       43          5
m4                           1       951      218        64      669          0
───────────────────────────────────────────────────────────────────────────────
Total                     1568    437638    50363     59754   327521      53849
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (semi-detached) $22,160,175
Estimated Schedule Effort (semi-detached) 35.56 months
Estimated People Required (semi-detached) 55.37
───────────────────────────────────────────────────────────────────────────────
Processed 15463675 bytes, 15.464 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────

まとめ

これまで見てきたように、sccツールを使うと非常に高速に既存プロジェクトのソースコードを瞬時に解析してプログラミング言語毎のソースコード行数、コメント行数、空行数、複雑さの度合いを見ることが出来ます。さらにCOCOMO法による推定見積りも得られます。実際の開発現場でも利用できる無料ツールですので、非常に役に立つと思います。

タイトルとURLをコピーしました