系列文章目录
LLVM系列第一章:编译LLVM源码
LLVM系列第二章:模块Module
LLVM系列第三章:函数Function
LLVM系列第四章:逻辑代码块Block
LLVM系列第五章:全局变量Global Variable
LLVM系列第六章:函数返回值Return
LLVM系列第七章:函数参数Function Arguments
LLVM系列第八章:算术运算语句Arithmetic Statement
LLVM系列第九章:控制流语句if-else
LLVM系列第十章:控制流语句if-else-phi
LLVM系列第十一章:写一个Hello World
LLVM系列第十二章:写一个简单的词法分析器Lexer
LLVM系列第十三章:写一个简单的语法分析器Parser
LLVM系列第十四章:写一个简单的语义分析器Semantic Analyzer
LLVM系列第十五章:写一个简单的中间代码生成器IR Generator
LLVM系列第十六章:写一个简单的编译器
LLVM系列第十七章:for循环
LLVM系列第十八章:写一个简单的IR处理流程Pass
LLVM系列第十九章:写一个简单的Module Pass
LLVM系列第二十章:写一个简单的Function Pass
LLVM系列第二十一章:写一个简单的Loop Pass
LLVM系列第二十二章:写一个简单的编译时函数调用统计器(Pass)
LLVM系列第二十三章:写一个简单的运行时函数调用统计器(Pass)
LLVM系列第二十四章:用Xcode编译调试LLVM源码
LLVM系列第二十五章:简单统计一下LLVM源码行数
LLVM系列第二十六章:理解LLVMContext
LLVM系列第二十七章:理解IRBuilder
LLVM系列第二十八章:写一个JIT Hello World
LLVM系列第二十九章:写一个简单的常量加法“消除”工具(Pass)
前言
在此,记录下用scc工具统计LLVM源码的过程,以备查阅。
关于如何下载LLVM源码,请参考第一章 《LLVM系列第一章:编译LLVM源码》。注意这里使用的是LLVM 12的源码。
源码统计
我们可以用一个名为"scc"的工具来统计LLVM的源码。该工具可以在GitHub上找到:
https://github.com/boyter/scc
代码统计工具:scc
在macOS上,我们可以使用brew工具来安装scc(示例):
# Install scc on macOS
brew install scc
# A quick check
scc --version
安装完成后,brew会输出相应的消息。可以看到,当前使用的scc版本为scc version 3.0.0
。
关于如何安装brew工具,请参考:https://docs.brew.sh/Installation。
安装成功以后,我们来简单地玩一玩这个命令:
# List all supported languages
scc -l
# Count all C/C++ code
scc -i c,ec,pgc,h,cc,cpp,cxx,c++,pcc,hh,hpp,hxx,inl,ipp
scc -i c,h,cc,cpp,cxx,c++,hh,hpp,hxx
# Count all C/C++/C#/Objective-C/Objective-C++/JavaScript/JSX/TypeScript/TSX code
scc -i c,ec,pgc,h,cc,cpp,cxx,c++,pcc,hh,hpp,hxx,inl,ipp,cs,csx,m,mm,js,mjs,jsx,ts,tsx,d.ts,tsx
以下是scc能统计的编程语言及对应的文件后缀名:
...
C (c,ec,pgc)
C Header (h)
C++ (cc,cpp,cxx,c++,pcc)
C++ Header (hh,hpp,hxx,inl,ipp)
C# (cs,csx)
...
Objective C (m)
Objective C++ (mm)
...
JavaScript (js,mjs)
JSX (jsx)
TypeScript (ts,tsx)
TypeScript Typings (d.ts)
TSX (tsx)
...
统计LLVM源码
安装好scc之后,我们可以用以下命令来进行统计(示例):
cd /path/to/llvm-project/llvm
scc
输出结果如下(示例):
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
LLVM IR 25779 6136861 512155 3235587 2389119 129713
Assembly 5375 1549245 340196 8252 1200797 20007
C++ 3178 2102945 260616 301694 1540635 341688
C Header 2481 585331 88209 151337 345785 23734
Plain Text 905 470252 138505 0 331747 0
ReStructuredText 686 145008 34719 0 110289 0
GN 517 19212 1050 809 17353 686
CMake 474 21061 2444 1942 16675 1356
YAML 438 54637 3610 16483 34544 0
Python 236 29463 2582 5171 21710 2438
C 93 9576 1243 1830 6503 529
OCaml 89 11142 1916 3232 5994 135
Module-Definition 62 12219 1070 86 11063 295
Autoconf 24 3013 641 1578 794 38
Shell 24 2862 254 331 2277 174
Go 22 4420 453 614 3353 175
Markdown 22 3725 811 0 2914 0
HTML 15 1682 209 1 1472 0
JSON 12 880 2 0 878 0
SVG 8 7804 0 0 7804 0
Vim Script 8 393 37 0 356 28
Objective C 6 298 35 194 69 0
CSS 5 1006 114 45 847 0
Perl 5 921 51 173 697 75
Dockerfile 3 132 14 57 61 18
Emacs Lisp 3 265 34 67 164 5
XML 3 451 6 7 438 0
gitignore 3 88 5 40 43 0
Alex 2 6 4 0 2 0
BASH 2 278 18 94 166 29
Batch 2 339 44 20 275 161
Swift 2 23 6 0 17 1
TypeScript 2 94 13 3 78 20
HEX 1 15 0 0 15 0
License 1 202 33 0 169 0
───────────────────────────────────────────────────────────────────────────────
Total 40488 11175849 1391099 3729647 6055103 521305
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $252,826,701
Estimated Schedule Effort (organic) 112.586618 months
Estimated People Required (organic) 199.504217
───────────────────────────────────────────────────────────────────────────────
Processed 463574299 bytes, 463.574 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
可以看到,LLVM的C++代码已经超过了200万行,大约是中小型规模的软件(库)。
统计LLVM-Project源码
llvm-project是llvm的父目录,它不仅包含了LLVM,还包含了clang、LLDB、lld、libc++等重要的工具或库,我们可以用以下命令来进行统计(示例):
cd /path/to/llvm-project
scc
输出结果如下(示例):
───────────────────────────────────────────────────────────────────────────────
Language Files Lines Blanks Comments Code Complexity
───────────────────────────────────────────────────────────────────────────────
LLVM IR 27320 6238418 527557 3272400 2438461 138440
C++ 22917 5961785 730332 966788 4264665 790043
C Header 8668 1630757 240273 376088 1014396 56076
Assembly 7716 1675672 353862 8733 1313077 21805
C 7134 1022144 106828 367642 547674 52174
Python 1840 256131 26385 26559 203187 15515
Objective C 1789 116821 19508 31683 65630 2316
CMake 1515 75766 8737 6321 60708 4331
ReStructuredText 1312 247077 60083 0 186994 0
Plain Text 1091 538868 140946 0 397922 0
YAML 881 98591 4663 21878 72050 0
Makefile 663 3735 1053 152 2530 3
FORTRAN Modern 595 38415 4037 12215 22163 610
GN 517 19212 1050 809 17353 686
Objective C++ 516 39305 6867 6657 25781 2203
Autoconf 355 30432 5659 13790 10983 962
Markdown 141 41453 7871 0 33582 0
Module-Definition 141 28293 2900 86 25307 741
Shell 140 105204 9650 11577 83977 7996
HTML 92 43756 3774 600 39382 0
OCaml 89 11142 1916 3232 5994 135
JSON 72 413927 12 0 413915 0
Swig 72 11212 2390 1 8821 0
FORTRAN Legacy 50 724 1 210 513 42
XML 47 882 22 7 853 0
m4 37 25321 2465 5445 17411 0
Flow9 35 140 0 0 140 0
C++ Header 32 12294 1103 901 10290 1016
Batch 31 1307 156 47 1104 439
CSS 29 4279 639 253 3387 0
Go 22 4420 453 614 3353 175
Perl 22 9022 807 1738 6477 583
SVG 20 11617 0 23 11594 0
gitignore 20 598 66 211 321 0
Scala 14 148 0 0 148 7
Vim Script 12 606 67 0 539 47
Expect 11 881 24 31 826 0
Emacs Lisp 10 1334 151 256 927 36
BASH 9 1263 123 192 948 139
Alex 8 13 4 0 9 0
C# 8 766 89 107 570 49
Dockerfile 8 413 66 136 211 66
CSV 7 1120 0 0 1120 0
License 6 477 80 0 397 0
Protocol Buffers 5 494 82 61 351 0
JavaScript 4 2053 145 376 1532 322
LaTeX 4 2267 151 5 2111 0
Patch 3 632 57 0 575 0
Rust 3 30 6 11 13 0
AWK 2 3739 111 102 3526 0
Go Template 2 81 0 0 81 0
Lua 2 8 2 0 6 0
Swift 2 23 6 0 17 1
TypeScript 2 94 13 3 78 20
D 1 18 2 0 16 0
Docker ignore 1 1 0 0 1 0
HEX 1 15 0 0 15 0
Julia 1 1335 164 451 720 124
LD Script 1 4 0 0 4 0
MSBuild 1 261 0 7 254 0
TOML 1 24 2 0 22 0
───────────────────────────────────────────────────────────────────────────────
Total 86050 18736820 2273410 5138398 11325012 1097102
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $487,905,743
Estimated Schedule Effort (organic) 144.537890 months
Estimated People Required (organic) 299.895629
───────────────────────────────────────────────────────────────────────────────
Processed 776562662 bytes, 776.563 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────
可以看到,llvm-project的C++代码已经接近600万行,大约是中大型规模的软件(库)。
总结
我们利用scc工具简单地统计了一下LLVM的源代码,看看其规模有多大。