目的
Chromium は大規模ソフトウェアだと言われているが、実際にどのくらい巨大なのか?
結論
Chromiumのバージョン89 (Chromium M89)を対象に調査した結果
C, C++, Assembly, Java の4つの言語分で 1458万LOC 規模のソフトウェアであることがわかる
前提
- git はシステムにインストール済み
cloc のセットアップ
Lines of Code を確認するために cloc を利用する
cloc-1.88 をダウンロード
~/work ディレクトリに展開する
~/work/cloc-1.88/cloc
を利用して確認を進める
$ 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
ワークディレクトリの作成
$ mkdir ~/work
$ cd ~/work
~/work ディレクトリをワークディレクトリとして利用する
Chromium のソースコードを取得
$ 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 のバージョン毎のタグ一覧を確認
$ cd ~/work/chromium/src/
$ git tag | sort -V -r | awk -F'.' '!colname[$1]++{print}'
最新の一覧だけ確認したければ
$ 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)のソースを利用して確認する
$ git checkout 89.0.4388.4
ファイル使用量
LOC確認の前にファイル使用量を確認
種別 | サイズ |
---|---|
ソースコード | 3.8Gbyte |
gitリポジトリ | 25Gbyte |
$ 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 を測る
$ 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) だけに注目する
4言語のみで 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 |