LLVM系列第二十五章:简单统计一下LLVM源码行数

系列文章目录

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)

flex&bison系列



前言

在此,记录下用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的源代码,看看其规模有多大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值