Логотип

Linux Kernel 7.2 содержит 43 миллиона строк: проверено с помощью wc, tokei, scc и cloc

Linux Kernel 7.2 содержит 43 миллиона строк: проверено с помощью wc, tokei, scc и cloc

Ядро Linux достигло еще одной важной вехи. В последней версии дерева разработки Linux 7.2 теперь содержится приблизительно 42,6 миллиона строк исходного кода, комментариев и пустых строк. Эти данные подтверждены независимыми проверками как в официальном репозитории tokei, так и sccв официальном v7.2-rc1репозитории. Это делает его самым большим деревом исходного кода ядра Linux из когда-либо измеренных.

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

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

 

В Linux 7.2 преодолена отметка в 42 миллиона строк кода.

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

andreyex@fedora:~/linux$ git log --oneline -1 
dc59e4fea9d8 (HEAD -> master, tag: v7.2-rc1, origin/master, origin/HEAD) Linux 7.2-rc1

 

Вот что показали результаты работы каждого инструмента:

ИнструментФайлыВсего строкКодовые строкиКомментарииПустые ячейки
cloc82,30940,416,24230,509,9814 840 4695 065 792
tokei89,04242,584,52632,359,8964,893,1475,331,483
scc88,98842,582,36732,451,0894 807 5735 323 705
wc -l (все файлы)43,179,595

 

Наши собственные измерения показывают, что tokeiи sccсовпадают почти точно, составляя около 42,58 миллионов строк в общей сложности для Linux v7.2-rc1. В отличие от этого, clocv2.08 сообщает о примерно 40,42 миллионах строк, что примерно на 2,16 миллиона меньше. Исследование показывает, что clocv2.08 не учитывает исходные файлы дерева устройств ядра ( .dts.dtsi). Дерево Linux v7.2-rc1 содержит 6347 таких файлов, и оба tokei и scc насчитывают в них 2 095 900 строк, что составляет почти 97% разницы.

Общее wc -lколичество файлов, равное 43 179 595, и послужило основанием для заголовка «43 миллиона». Разница примерно в 597 000 строк между этим значением и цифрой tokei/scc представляет собой количество файлов прошивки, скомпилированных бинарных файлов .dtb, сертификатов и других нетекстовых файлов, которые не должны включаться в счетчик исходного кода. Таким образом, заголовок технически точен, но не отражает количество исходного кода.

Для сравнения, Linux 7.1 содержал приблизительно 42,1 миллиона строк кода . За один цикл разработки ядро ​​пополнилось примерно полумиллионом дополнительных строк.

Хотя это звучит впечатляюще, такой рост ожидаем. Тысячи разработчиков вносят свой вклад в каждый релиз Linux, и они поддерживают огромное количество оборудования. Если вы не в курсе, над ядром Linux 7.1 работало более 2000 разработчиков, в том числе более 300 человек, которые внесли свой вклад впервые.

 

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

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

Читать  Выпущен Linux Kernel 6.13 RC4: небольшой рождественский подарок от разработчиков ядра

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

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

 

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

Ответ: Drivers.

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

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

 

AMDGPU по-прежнему является крупнейшим драйвером.

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

Объединенный драйвер AMDGPU и AMDKFD содержит около 6 356 056 строк кода, что делает его самым большим драйвером во всем ядре Linux.

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

 

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

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

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

 

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

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

# Полное клонирование (~5 ГБ) — используйте --depth=1 для поверхностного клонирования (~1,5 ГБ) 
git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
cd linux

 

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

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

# Установка 
sudo apt install cloc # Debian/Ubuntu 
sudo dnf install cloc # Fedora/RHEL 
sudo pacman -S cloc # Arch 

# Запуск 
cloc --progress=1 . 

# Для измерения прогресса только графического драйвера AMD: 
cloc drivers/gpu/drm/amd

cloc на обработку целого дерева может уйти от 15 до 30 минут .

 

Метод 2: токей (Быстрее и точнее — Рекомендуется)

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

# Установка

cargo install tokei 

# или

sudo apt install tokei / brew install tokei 

tokei .

 

Читать  Использование Curl для выполнения запросов REST API

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 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точности и дополнительно сообщает о цикломатической сложности для каждого языка, что полезно для понимания того, какие части ядра сложнее всего поддерживать.

# Установка (скачайте бинарный файл из релизов GitHub или:) 
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)
───────────────────────────────────────────────────────────────────────────────

On the v7.2-rc1 tree, scc also estimates the cost to develop the kernel from scratch at approximately $1.47 billion using the COCOMO organic model, a rough but striking number.

 

Читать  Что такое ошибка ERR_CONNECTION_RESET и как её исправить?

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

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

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

 

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

43179595

 

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

 

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

ИнструментСкоростьЯзыковой анализПримечания
wc -lСамый быстрыйПодсчитывает все файлы, включая бинарные.
tokeiОчень быстроОптимальный баланс скорости и точности.
sccБыстрыйТакже сообщается о цикломатической сложности.
clocМедленно (15–30 м)Отсутствуют файлы дерева устройств; недоучет ядра.

 

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

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

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

 

Как появился заголовок «43 миллиона».

Проверка wc -lкаждого файла в репозитории (включая файлы прошивки, скомпилированные бинарные файлы дерева устройств .dtbи сертификаты) выдает 43 179 595 строк.

Инструменты, учитывающие исходный код, такие как tokeiи , sccпоказывают результат около 42,58 миллионов, поскольку они корректно исключают файлы, не являющиеся исходным кодом. Разница в ~597 000 строк между двумя цифрами точно соответствует этим бинарным и нетекстовым файлам.

 

Заключение

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

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

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

 

Источник:

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Редактор: AndreyEx

Рейтинг: 5 (1 голос)
Если статья понравилась, то поделитесь ей в социальных сетях:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

5 + одиннадцать =

Это может быть вам интересно


Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала