Поиск по сайту:

Ядро Linux 7.2 достигло 43 миллионов строк: проверено с помощью 4 счётчиков кода


Ядро Linux достигло ещё одной важной вехи. Последнее развитие дерева Linux 7.2 содержит примерно 43,2 миллиона строк во всех отслеживаемых файлах, или около 42,6 миллиона строк с учётом языка согласно инструментам tokei и scc.

Мы независимо проверили эти данные на официальном теге v7.2-rc1, используя 4 различных инструмента для подсчёта кода. Согласно нашим измерениям, это самая большая на сегодняшний день исходная кодовая база ядра Linux.

На первый взгляд, это число может показаться огромным. Но это не означает, что Linux стал раздутым. Вместо этого оно показывает две вещи: сколько аппаратного обеспечения поддерживает Linux сегодня и насколько активно продолжает развиваться ядро.

Давайте посмотрим, что изменилось.

Linux 7.2 превышает отметку в 42 миллиона строк

Я измерил Git-дерево Linux 7.2-rc1 с помощью нескольких инструментов подсчета кода. В демонстрационных целях я использовал точный коммит с тегом v7.2-rc1 (dc59e4fea9d8).

ostechnix@fedora:~/linux$ git log --oneline -1
dc59e4fea9d8 (HEAD -> master, tag: v7.2-rc1, origin/master, origin/HEAD) Linux 7.2-rc1
ostechnix@fedora:~/linux$ git describe --tags
v7.2-rc1
ostechnix@fedora:~/linux$ git rev-parse HEAD
dc59e4fea9d83f03bad6bddf3fa2e52491777482

Вот что нашёл каждый инструмент:

ИнструментФайлыОбщее количество строкСтроки кодаКомментарииПробелы
cloc v2.0882 30940 416 24230 509 9814 840 4695 065 792
часы89 04242 584 52632 359 8964 893 1475 331 483
scc88 98842 582 36732 451 0894 807 5735 323 705
wc -l (все файлы)-43 179 595---

Я запустил все четыре инструмента в одной сессии Fedora VM против одного и того же состояния Git-репозитория (dc59e4fea9d8), используя одинаковые версии инструментов. Это делает результаты непосредственно сопоставимыми и воспроизводимыми.

Ранее тестирование с cloc v1.96 дало почти идентичное общее количество строк — 40,414,638. Небольшая разница обусловлена улучшениями в cloc v2.08, который распознает несколько дополнительных форматов файлов, таких как Jinja Template и Snakemake.

Tokei и scc почти полностью совпадают, оба сообщают о 42,58 миллиона строк. Их независимые результаты различаются всего на 2 159 строк (около 0,005%), что делает их самыми согласованными измерениями исходного кода Linux с учётом языка.

Для сравнения, стандартный запуск cloc недооценивает количество строк в ядре примерно на 2,17 миллиона, потому что по умолчанию он не распознает исходные файлы Linux Device Tree (.dts/.dtsi). Я это проверил, запустив cloc снова с:

cloc --force-lang="C",dts --force-lang="C",dtsi .

Это увеличило общие показатели cloc примерно на 2,1 миллиона строк, приведя его результаты в тесное соответствие с tokei и scc.

Я воспроизвел такое же поведение как на Linux 7.1, так и на 7.2-rc1, подтвердив, что расхождение возникает из-за стандартного распознавания языка cloc, а не из-за изменений в самом ядре.

Как получен заголовок «43 миллиона»

Сырые данные wc -l по каждому отслеживаемому файлу в репозитории дают 43,179,595 строк. Именно отсюда появляется заголовок «43 миллиона строк».

Существует разрыв примерно в 597 000 строк между этой цифрой и суммами, указанными в tokei и scc. Эта разница возникает потому, что wc -l подсчитывает каждую строку во всех отслеживаемых файлах, тогда как инструменты, учитывающие язык программирования, намеренно исключают или классифицируют многие несредовые файлы иначе. Примеры включают документацию, метаданные, изображения, сертификаты и другие несредовые или нераспознанные форматы по всему репозиторию.

Стоит отметить, что чистая проверка исходного кода ядра Linux через Git содержит ни одного скомпилированного бинарного файла .dtb и нет каталога firmware/ (прошивки поддерживаются отдельно в репозитории linux-firmware). Следовательно, эти файлы не влияют на это различие.

Короче говоря, заголовок 43 миллиона технически точен, так как отражает каждую строку, хранящуюся в дереве Git. Тем не менее, цифра 42,58 миллиона, указанная в tokei и scc, является более точной оценкой исходного кода ядра.

Linux 7.2 Продолжает рост ядра

Чтобы измерить, насколько ядро выросло за этот цикл разработки, я повторил те же измерения на финальном выпуске Linux 7.1, используя ту же виртуальную машину Fedora, версии инструментов и методологию.

МетрическаяLinux 7.1Linux 7.2-rc1Рост
часы42 021 67742 584 526+562,849
scc42 019 63442 582 367+562,733
wc -l42 606 91843 179 595+572,677

Результаты показывают замечательное согласие между всеми тремя методами измерения. Как tokei, так и scc показывают, что Linux приобрёл примерно 563 000 строк кода, учитывающих языковые особенности, между версиями Linux 7.1 и 7.2-rc1, что составляет примерно 1,3% рост за один цикл разработки. Сырая команда wc -l показывает аналогичное увеличение — 572 677 строк.

Звучит драматично, но это вполне ожидаемо. Каждый выпуск ядра Linux добавляет поддержку новых процессоров, платформ, файловых систем, драйверов, технологий виртуализации и улучшений безопасности, одновременно продолжая совершенствовать существующие подсистемы.

Согласно финальным заметкам о выпуске Linux 7.1, более 2 000 разработчиков внесли изменения, включая более 300 новичков. Постоянные вклады в таком объеме естественно приводят к стабильному росту дерева исходного кода с течением времени.

Linux продолжает развиваться даже после удаления старого кода

Одним из удивительных аспектов этого рубежа является то, что код ядра Linux продолжает расти, даже при удалении устаревшего кода.

Linux 7.1 начал прекращать поддержку процессоров Intel i486, удалив более 140 000 строк устаревшего кода, включая устаревшие контроллеры PCMCIA и драйверы ISDN. Linux 7.2 продолжает эту очистку, удаляя дополнительный код, связанный с i486, вместе с несколькими устаревшими драйверами и устаревшими компонентами x86.

Другими словами, разработчики Linux постоянно балансируют между добавлением и удалением. В то время как поддержка нового оборудования, архитектур, драйверов, файловых систем и функций безопасности расширяет ядро, устаревший код регулярно выводится из эксплуатации, чтобы уменьшить нагрузку на обслуживание и сохранить проект современным.

Почему ядро Linux такое большое?

Ответ: водители.

Ядро Linux поддерживает невероятное разнообразие оборудования. Каждая видеокарта, контроллер хранения данных, сетевой адаптер, функция ноутбука, USB-устройство и встроенная платформа требует поддержки ядра.

По мере того как новое оборудование выходит на рынок, разработчики добавляют новые драйверы. В то же время они поддерживают совместимость с существующими устройствами. Из-за этого большая часть роста ядра происходит за счет поддержки оборудования. Очень небольшой рост приходится на основной код планирования или управления памятью ядра.

AMDGPU остаётся крупнейшим драйвером

Наибольшим вкладом по-прежнему является графическая подсистема AMD.

Комбинированный драйвер AMDGPU и AMDKFD содержит примерно 6,35 миллиона строк кода. Это делает его крупнейшим драйвером во всём ядре Linux.

Линус Торвальдс указал на нечто интересное. Примерно треть одного большого запроса на внесение изменений состояла из файлов определения регистров GPU AMD. Эти файлы в основном содержат сгенерированные данные. Они помогают Linux взаимодействовать с современным графическим оборудованием AMD.

Больше не значит медленнее

Многие люди считают, что больше строк кода означает более медленное программное обеспечение. Но в ядре Linux это не так.

Большая часть дополнительного кода существует для поддержки оборудования, которое многие пользователи никогда не будут иметь. Большая часть этого кода находится в загружаемых модулях. Эти модули активируются только тогда, когда присутствует соответствующее оборудование.

В результате ядро продолжает совершенствоваться, одновременно расширяя совместимость с аппаратным обеспечением. Это относится к настольным компьютерам, серверам, ноутбукам, встроенным системам, облачным платформам и суперкомпьютерам.

Посчитайте общее количество строк в коде ядра Linux

Любой человек может клонировать репозиторий ядра Linux и измерить его. Сначала получите исходный код ядра:

git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git  
cd linux

Полный клон занимает около 5 ГБ. Вы можете добавить --depth=1 к команде git для поверхностного клонирования (около 1,5 ГБ):

git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

Для этого руководства я использовал полный клон.

Метод 1: cloc (широко цитируемый справочный инструмент)

cloc является наиболее часто используемым инструментом для подсчета строк в ядре.

# Install
sudo apt install cloc        # Debian/Ubuntu
sudo dnf install cloc        # Fedora/RHEL
sudo pacman -S cloc          # Arch

Теперь запустите:

cloc --progress=1 .

Обратите внимание на точку (.) в конце. Это означает, что мы инструктируем cloc анализировать текущий каталог.

В зависимости от вашего оборудования, cloc может занять несколько минут на сканирование полного исходного дерева Linux. На моей виртуальной машине Fedora это завершилось примерно за 3-4 минуты.

Пример вывода:

   94718 text files.
   82309 unique files.                                          
   12415 files ignored.
github.com/AlDanial/cloc v 2.08  T=276.85 s (297.3 files/s, 145986.6 lines/s)
----------------------------------------------------------------------------------------
Language                              files          blank        comment           code
----------------------------------------------------------------------------------------
C                                     36898        3801120        2908960       19610084
C/C++ Header                          26648         791061        1600637        8405094
JSON                                    833              2              0         553530
reStructuredText                       4011         197901          81994         540661
YAML                                   5675         104970          25957         518427
Assembly                               1343          47625          99191         230030
Bourne Shell                           1321          40912          27301         159379
Rust                                    473          15277          52795         114347
Python                                  428          21148          18854          90203
Text                                    975          19724              0          89632
make                                   3188          12948          13377          60578
SVG                                      87             98           1311          56094
Perl                                     69           6811           4558          34796
XML                                      32           1514           1706          23049
yacc                                     10            723            442           4848
PO File                                   7           1106           1269           4336
Bourne Again Shell                       63            631            416           2584
lex                                      10            366            355           2219
C++                                       9            356            143           1917
awk                                      16            374            480           1743
CSV                                      11            126              0           1413
Jinja Template                          102             69             98            794
NAnt script                               2            167              0            610
Logos                                     4            115              0            547
Markdown                                  9            162              3            514
XML (Qt/GTK)                              1             50              0            486
XSD                                       1             46              9            349
CSS                                       4             71             96            244
Cucumber                                  1             40             97            199
TeX                                       1              6             73            155
TNSDL                                     2             33              0            140
Windows Module Definition                 2             20              0            137
Linker Script                             5             25             11            126
Snakemake                                 5             15             13            125
Clojure                                  36              1              0             95
m4                                        1             15              1             95
XSLT                                      5             13             26             61
BitBake                                   5             65            178             58
Umka                                      2             20              0             54
TOML                                      3              9             12             36
MATLAB                                    1             17             37             35
INI                                       3              6              0             34
sed                                       2             23             52             31
vim script                                1              3             12             27
HTML                                      2              4              5             25
Ruby                                      1              4              0             25
Velocity Template Language                1              0              0             15
----------------------------------------------------------------------------------------
SUM:                                  82309        5065792        4840469       30509981
----------------------------------------------------------------------------------------

Подсчитайте общее количество строк в коде ядра Linux с помощью утилиты Cloc

Примечание: cloc не распознаёт исходные файлы Device Tree (.dts/.dtsi). Это одна из причин, по которой оно занижает количество строк ядра (см. разбор ранее в этом руководстве).

Чтобы измерить только драйвер графики AMD, выполните:

cloc drivers/gpu/drm/amd

Метод 2: tokei (быстрее и точнее, рекомендуется)

tokei значительно быстрее, чем cloc. Он также корректно подсчитывает файлы Device Tree. Это делает его более точным выбором для ядра Linux.

Сначала убедитесь, что Rust установлен в вашей системе. А затем установите tokei с помощью пакетного менеджера cargo:

cargo install tokei

tokei также доступен в официальных репозиториях некоторых дистрибутивов, поэтому вы можете установить его с помощью стандартного менеджера пакетов, как показано ниже:

sudo apt install tokei
brew install tokei

Теперь запустите:

tokei .

Пример вывода:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Language              Files        Lines         Code     Comments       Blanks
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 AWK                      13         2805         1923          500          382
 Alex                      4          662          547            0          115
 ASN.1                    15          656          441           87          128
 Assembly                 11         5781         5445            0          336
 GNU Style Assembly     1337       371255       270423        56888        43944
 Autoconf                  6          459          395           30           34
 Automake                  3           31           23            3            5
 BASH                     62         3038         2094          437          507
 Bazel                    81         1829         1474           54          301
 Bitbake                   3           13            4            6            3
 C                     36910     26320472     19615926      2909605      3794941
 C Header              26813     10822880      8416361      1615212       791307
 C++                       7         2291         1969           81          241
 C++ Header                2          125           59           55           11
 CSS                       4          411          244           97           70
 Device Tree            6343      2097441      1724154        92401       280886
 Forge Config             15         1352          321          744          287
 Gherkin (Cucumber)        1          336          199           97           40
 Happy                    10         6013         5290            0          723
 HEX                       2          173          173            0            0
 INI                       2           13            6            5            2
 Jinja2                  149         1187          966          145           76
 JSON                   1043       607008       607006            0            2
 Lex                      10         2940         2218          356          366
 LD Script                13          552          427           40           85
 Makefile               3203        87274        60667        13531        13076
 Module-Definition         2          157          137            0           20
 Objective-C               1           89           72            0           17
 Pacman's makepkg          1          134           91           13           30
 Perl                     61        43189        33862         4009         5318
 PO File                   7         6711         3346         2259         1106
 Python                  439       130209       102002         8291        19916
 RPM Specfile              1          215          174           14           27
 ReStructuredText       4011       820556       622655            0       197901
 Ruby                      1           29           25            0            4
 Shell                  1172       219683       153221        27411        39051
 Snakemake                 5          153          125           13           15
 SVG                      87        57503        56094         1311           98
 SWIG                      1          252          154           27           71
 TeX                       1          234          155           73            6
 Plain Text              981       109702            0        89924        19778
 TOML                      3           57           36           12            9
 Unreal Script             5          618          371          156           91
 Apache Velocity           1           15           15            0            0
 Vim Script                1           42           33            6            3
 XSL                      10          200          122           52           26
 XML                      32        26269        23572         1452         1245
 YAML                   5673       648526       529448        23888        95190
─────────────────────────────────────────────────────────────────────────────────
 HTML                      2           29           25            0            4
 |- JavaScript             1            7            7            0            0
 (Total)                               36           32            0            4
─────────────────────────────────────────────────────────────────────────────────
 Markdown                  9          534            0          385          149
 |- BASH                   1            2            2            0            0
 |- C                      1           20           12            6            2
 |- Rust                   1           98           76           13            9
 |- YAML                   1           25           22            0            3
 (Total)                              679          112          404          163
─────────────────────────────────────────────────────────────────────────────────
 Rust                    473       143187       114374        13573        15240
 |- Markdown             351        39084          913        29885         8286
 (Total)                           182271       115287        43458        23526
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 Total                 89042     42584526     32359896      4893147      5331483
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Это заканчивается менее чем за минуту и довольно точно соответствует результатам scc (См. следующий раздел).

Метод 3: scc (самый быстрый, с метриками сложности)

scc соответствует точности tokei. Он также сообщает о цикломатической сложности по языкам. Это полезно для понимания, какие части ядра труднее всего поддерживать.

Убедитесь, что Golang установлен в вашей системе, а затем выполните следующую команду для установки scc:

go install github.com/boyter/scc/v3@latest

Теперь запустите:

scc .

Пример вывода:

───────────────────────────────────────────────────────────────────────────────
Language            Files       Lines    Blanks  Comments       Code Complexity
───────────────────────────────────────────────────────────────────────────────
C                  36,910  26,320,472 3,795,058 2,909,421 19,615,993  2,566,279
C Header           26,813  10,822,880   791,303 1,614,799  8,416,778     66,444
Device Tree         6,343   2,097,441   280,886    92,367  1,724,188         36
YAML                5,672     648,427   104,949    25,934    517,544          0
ReStructuredTe…     4,011     820,556   197,878         0    622,678          0
Makefile            3,203      87,274    13,076    13,531     60,667        464
Assembly            1,348     377,036    41,691    49,680    285,665      3,505
Shell               1,174     220,250    37,034    26,897    156,319     12,925
JSON                1,043     607,008         2         0    607,006          0
Plain Text            981     109,702    19,777         0     89,925          0
Rust                  473     182,419    15,156    52,407    114,856     10,808
Python                439     130,209    15,774    13,048    101,387     15,323
Jinja                 149       1,187        76       145        966        193
SVG                    87      57,503        98     1,311     56,094          2
Perl                   67      46,073     6,048     4,183     35,842      5,246
BASH                   63       3,399       513       413      2,473        324
DOT                    36       1,261        81        62      1,118          0
XML                    32      26,269     1,465     1,755     23,049          0
AWK                    17       3,102       311       232      2,559        532
CSV                    11       1,539       126         0      1,413          0
Extensible Sty…        10         200        26         0        174          0
Happy                  10       6,013       723         0      5,290          0
LEX                    10       2,940       366       355      2,219          0
Markdown                9         679       162         0        517          0
LD Script               8         390        60        29        301          0
C++                     7       2,291       241        81      1,969        332
Autoconf                6         459        34        30        395         11
License                 5         422        84         0        338          0
Snakemake               5         153        15        13        125          0
Unreal Script           5         618        91       156        371         21
Alex                    4         662       115         0        547          0
CSS                     4         411        70        97        244          0
Raku                    3         213        19        21        173         33
Systemd                 3         167        25        63         79          0
TOML                    3          57         8        12         37          0
Bazel                   2         777       167       177        433          6
C++ Header              2         125        11        55         59          2
HEX                     2         173         0         0        173          0
HTML                    2          34         4         5         25          0
INI                     2          13         2         5          6          0
Module-Definit…         2         157        20         0        137          4
bait                    2          64         4        15         45          9
sed                     2         106        23        53         30          0
CloudFormation…         1          99        17         2         80          0
Gherkin Specif…         1         336        40        97        199          0
MATLAB                  1          89        17        37         35          3
Ruby                    1          29         4         0         25          1
Scallop                 1           3         0         0          3          0
TeX                     1         234         6        73        155          0
Vim Script              1          42         3        12         27          5
XML Schema              1         404        46         0        358          0
───────────────────────────────────────────────────────────────────────────────
Total              88,988  42,582,367 5,323,705 4,807,573 32,451,089  2,682,508
───────────────────────────────────────────────────────────────────────────────
Estimated Cost to Develop (organic) $1,473,621,894
Estimated Schedule Effort (organic) 219.99 months
Estimated People Required (organic) 595.12
───────────────────────────────────────────────────────────────────────────────
Processed 1595970277 bytes, 1595.970 megabytes (SI)
───────────────────────────────────────────────────────────────────────────────

В дереве v7.2-rc1 scc также оценивает стоимость полной реконструкции ядра с нуля. Оценка составляет около 1,47 миллиарда долларов, с использованием органической модели COCOMO. Вы можете увидеть эту информацию почти в конце вывода.

Метод 4: wc -l (быстрая проверка всех файлов на здравомыслие)

Команда wc считает каждую строку в каждом файле, независимо от типа. Это включает бинарные и нетекстовые файлы. Она дает наибольшее количество среди всех четырёх инструментов.

find . -not -path './.git/*' -type f \
  | xargs wc -l 2>/dev/null \
  | awk '/total/{sum += $1} END{print sum}'

Пример вывода:

43179595

Обратите внимание, что wc не является счетчиком кода, учитывающим язык. Но он предоставляет полезную верхнюю границу общего количества строк, хранящихся в дереве Git.

Примечание: Не добавляйте | tail -1 в конце. Когда файлов десятки тысяч, xargs разбивает их на несколько партий. Каждая партия выводит свою собственную строку total. Использование tail -1 захватывает только промежуточный итог последней партии. Это дает очень неправильный результат.

Сравнение инструментов

ИнструментСкоростьОсведомлённый о языкеЗаметки
wc -lСамый быстрый❌Считает все файлы, включая бинарные
часыОчень быстро✅Лучший баланс скорости и точности
sccБыстрый✅Также сообщает о цикломатической сложности
clocМедленно (15-30 мин)✅Недооценивает ядро; не распознает файлы Device Tree

Сводка статистики кода Linux 7.2

Измерено на коммите dc59e4fea9d8 (тег: v7.2-rc1), 30 июня 2026 года:

СтатистикаЗначение
Всего строк, все файлы (wc -l)43 179 595
Общее количество строк, с учётом исходного кода (tokei/scc)~42 583 000
Строки исходного кода~32 400 000
Комментарии строк~4 850 000
Пустые строки~5 327 000
Разница между wc -l и tokei/scc~597 000 строк (несорс-файлы и файлы, классифицированные иначе инструментами, распознающими язык)
Самый большой драйверAMDGPU + AMDKFD
Драйвер графики AMD~6,35 миллиона строк
Основной источник ростаДрайверы устройств
Очистка наследияПродолжение удаления кода Intel i486 и устаревших драйверов
Оценочная стоимость разработки~$1,47 миллиарда (COCOMO, через scc)

Заключение

Превышение 42 миллионов строк — это больше, чем просто интересная статистика. Это отражение масштаба одного из крупнейших совместных программных проектов в мире.

Сопровождающие ядро Linux продолжают добавлять поддержку нового оборудования. В то же время они удаляют код для платформ, срок службы которых подошел к концу. В результате получается ядро, которое растет там, где это необходимо, и становится чище там, где это возможно.

Для энтузиастов Linux этот этап является очередным напоминанием о том, как быстро развивается ядро. Он также показывает, сколько работы идет на поддержку всего, от крошечных встроенных плат до самых быстрых суперкомпьютеров в мире.

Источник:

  • Linux 7.2 Превысил Более 43 Миллионов Строк В Дереве Ядра