Chromiumの規模を確認する その1 全体像を把握する

# 目的
Chromium は[大規模ソフトウェアだと言われている](https://akaria.hatenablog.com/entry/2017/11/01/194502)が、実際にどのくらい巨大なのか？

# 結論
Chromiumのバージョン89 (Chromium M89)を対象に調査した結果
C, C++, Assembly, Java の4つの言語分で 1458万LOC 規模のソフトウェアであることがわかる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/258a2b68-b930-c76d-874f-2e9815c6f7b2.png)

# 前提
- git はシステムにインストール済み

## cloc のセットアップ
Lines of Code を確認するために cloc を利用する

[cloc-1.88](https://github.com/AlDanial/cloc/releases/tag/1.88) をダウンロード
~/work ディレクトリに展開する
~/work/cloc-1.88/cloc
 を利用して確認を進める

```shell-session
$ cd ~/work/cloc-1.88/
$ ls 
cloc  Dockerfile  Dockerfile.build  LICENSE  README.md  release_notes-1.88.txt  sqlite_formatter  tests  Unix
$ ~/work/cloc-1.88/cloc --quiet ~/work/cloc-1.88/ | head

github.com/AlDanial/cloc v 1.88  T=0.75 s (686.8 files/s, 77031.0 lines/s)
----------------------------------------------------------------------------------------
Language                              files          blank        comment           code
----------------------------------------------------------------------------------------
Perl                                      8           1661           2828          25471
YAML                                    263             11            265           6373
Markdown                                  2            278             31           2649
ANTLR Grammar                             2            200             59           1012
R                                         3             95            312            698

```

# ワークディレクトリの作成
```shell-session:
$ mkdir ~/work
$ cd ~/work
```

~/work ディレクトリをワークディレクトリとして利用する


# Chromium のソースコードを取得

```shell-session:
$ time git clone https://chromium.googlesource.com/chromium/src.git
Cloning into 'src'...
remote: Sending approximately 24.26 GiB ...
remote: Counting objects: 382855, done
remote: Finding sources: 100% (2000/2000)
remote: Total 15358388 (delta 11470578), reused 15357784 (delta 11470578)
Receiving objects: 100% (15358388/15358388), 24.24 GiB | 16.21 MiB/s, done.
Resolving deltas: 100% (11470578/11470578), done.
Checking out files: 100% (350121/350121), done.

real	53m44.743s
user	69m10.111s
sys	12m31.795s
```
ニューロ光のマンション契約(2Gbpsベストエフォート)で一時間弱


# Chromium のバージョン毎のタグ一覧を確認
```shell-session:
$ cd ~/work/chromium/src/
$ git tag | sort  -V -r | awk  -F'.' '!colname[$1]++{print}'
```
最新の一覧だけ確認したければ

```shell-session:
$ git tag | sort  -V -r | awk  -F'.' '!colname[$1]++{print}' | head

pre_blink_merge
89.0.4388.4
88.0.4324.91
87.0.4280.151
86.0.4240.261
85.0.4183.162
84.0.4147.142
83.0.4103.122
82.0.4085.28
81.0.4044.156
```

# Chromium の Lines of Code (LOC) を確認

## 対象とするタグ
後で再現可能なように現時点での最新のタグ(89.0.4388.4)のソースを利用して確認する


```shell-session:
$ git checkout 89.0.4388.4
```

## ファイル使用量
LOC確認の前にファイル使用量を確認

| 種別 | サイズ |
|:-:|:-:|
| ソースコード | 3.8Gbyte |
| gitリポジトリ | 25Gbyte |

```shell-session
$ du -sh ./ 
29G	./
$ du -sch ./* | grep total
3.8G	total
$ du -scmh ./.[^.]* | sort -rh
25G	total
25G	./.git
20K	./.git-blame-ignore-revs
16K	./.gn
12K	./.vpython
12K	./.gitignore
4.0K	./.yapfignore
4.0K	./.vpython3
4.0K	./.gitattributes
4.0K	./.eslintrc.js
4.0K	./.clang-tidy
4.0K	./.clang-format
```

## Lines of Code (LOC) を確認
cloc を使って LOC を測る

```shell-session
$ cd ~/work/chromium
$ time ~/work/cloc-1.88/cloc --timeout=60 --quiet --csv src/ | tail +2 > ../cloc_chromium.csv

real	7m48.491s
user	6m48.471s
sys	0m38.958s

$ cat ../cloc_chromium.csv | head
files,language,blank,comment,code,"github.com/AlDanial/cloc v 1.88  T=467.54 s (507.7 files/s, 76413.4 lines/s)"
47069,C++,1970819,1278644,10111955
81049,HTML,398626,80545,3620880
41008,C/C++ Header,823045,1048798,2722502
19048,JavaScript,412960,772606,2404686
10090,XML,130155,22365,2294151
3974,JSON,3635,0,1881341
7920,Java,202940,264064,1045148
5416,Python,180546,237202,729130
3748,Objective-C++,105525,74753,508202
```

全言語トータルで2700万LOCを超えている

|files|language|blank|comment|code|
|--:|:-:|--:|--:|--:|
|47069|C++|1970819|1278644|10111955|
|81049|HTML|398626|80545|3620880|
|41008|C/C++ Header|823045|1048798|2722502|
|19048|JavaScript|412960|772606|2404686|
|10090|XML|130155|22365|2294151|
|3974|JSON|3635|0|1881341|
|7920|Java|202940|264064|1045148|
|5416|Python|180546|237202|729130|
|3748|Objective-C++|105525|74753|508202|
|1082|C|83319|103703|475527|
|188|Assembly|20562|8538|229407|
|3156|SVG|8907|12172|157712|
|1769|Markdown|42821|5|140597|
|225|C#|11340|16854|118294|
|2375|XHTML|3388|2916|113824|
|2301|IDL|14248|1|100310|
|1231|CSS|12690|5993|71603|
|127|Objective-C|8515|8123|56855|
|796|Protocol Buffers|14217|32043|54752|
|1164|Mojo|13325|34607|43445|
|425|reStructuredText|21435|15833|37497|
|684|YAML|2603|1732|27378|
|740|PHP|4170|9833|26776|
|392|Bourne Shell|4752|6581|22143|
|184|Perl|4111|5454|20371|
|57|JSON5|430|1617|16928|
|26|Windows Module Definition|75|76|12849|
|81|make|1884|1717|11639|
|153|diff|1407|6993|11333|
|19|DTD|2079|2387|9728|
|68|CMake|772|735|8528|
|40|Bazel|697|599|8057|
|33|m4|1034|427|7742|
|132|SQL|180|348|7526|
|32|Ruby|947|439|5830|
|122|INI|1156|2|3166|
|18|MSBuild script|34|33|2506|
|46|Bourne Again Shell|572|615|2313|
|79|XSLT|155|117|2224|
|16|Vuejs Component|168|186|1556|
|43|DOS Batch|323|94|1539|
|13|Maven|77|37|1501|
|1|TeX|2|11|1441|
|33|Jinja Template|121|25|1292|
|26|Windows Resource File|265|591|1237|
|20|Dockerfile|165|169|1225|
|3|Groovy|101|138|1126|
|16|Pascal|884|5060|1078|
|9|XSD|192|171|961|
|4|CoffeeScript|118|32|920|
|8|Swift|95|133|699|
|7|Go|83|61|683|
|5|JSX|112|60|677|
|1|WiX source|95|64|650|
|6|Starlark|105|122|646|
|7|Lisp|143|207|462|
|18|TypeScript|94|109|462|
|1|yacc|47|41|402|
|2|Elm|114|29|399|
|7|TOML|52|1|263|
|6|vim script|52|95|191|
|1|Gradle|33|35|177|
|2|Haxe|25|5|137|
|7|Sass|25|0|131|
|1|EJS|1|0|126|
|3|Dart|20|7|102|
|8|PowerShell|14|15|95|
|1|ANTLR Grammar|33|0|94|
|6|Mako|29|13|93|
|7|Handlebars|0|0|88|
|3|HLSL|8|9|63|
|1|SWIG|14|28|56|
|3|GLSL|17|32|48|
|1|TNSDL|16|0|48|
|1|awk|5|3|17|
|2|sed|11|20|17|
|1|Standard ML|1|0|9|
|1|Arduino Sketch|4|5|8|
|1|Gencat NLS|0|0|1|
|1|WebAssembly|0|0|1|
|237,370|SUM|4,513,740|4,067,078|27,145,576|

## C, C++, Java, Assembly に注目
HTMLやJavaScript等はテスト用途のコードが多い
ソフトウェアの実際の実装に利用されているであろう主要な4言語 (C, C++, Java, Assembly) だけに注目する
４言語のみで 1458万LOC 規模のソフトウェアである

|language| code |
|:-:|--:|
|C++	|10,111,955 |
|C/C++ Header	|2,722,502|
|C	|475,527|
|Java	|1,045,148|
|Assembly|	229,407|
|総計	|14,584,539|

[
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1017489/258a2b68-b930-c76d-874f-2e9815c6f7b2.png)
](https://docs.google.com/spreadsheets/d/e/2PACX-1vTh5MguLJDi9wCrvhVaBoDLF68znkVIqT3EEWHJkuUcPr8Fv87w3FHK_va7MGStH_rYFo3xiw-LPYUm/pubchart?oid=193490040&format=interactive)