Сравнение качества кода ядер ОС Linux, Windows, OpenSolaris и FreeBSD
Греческий исследователь Diomidis Spinelli (автор книги “Code Quality: The Open Source Perspective“) опубликовал отчет “A Tale of Four Kernels“, в котором провел сравнение качества кода операционных систем Linux (2.6.18), Windows (исходные тексты частей ядра Microsoft Windows XP x64/Server 2003 SP1 можно загрузить для образовательных целей), OpenSolaris (сборка от 2007-08-28) и FreeBSD (6.1).
На оценку качества кода влияние оказали следующие факторы: организация файлов, структура кода, стиль оформления кода, использование директив препроцессинга, организация данных.
В итоге, автор не смог выделить явного победителя или проигравшего, у каждой системы были свои сильные и слабые стороны. Так в Linux отлично организована структура кода, но хромает его стиль. Solaris и Windows отличились хорошим использованием средств препроцессора и хорошим стилем кодирования. Сильная сторона FreeBSD – четкое разделение пространства имен и структур данных в функциях. Подробнее итоги изложены в сводной таблице. Дампы данных, полученные в результате парсинга исходных текстов, для СУБД MySQL (размер дампа около 8Гб) и список аналитических запросов представлены на данной странице.
Ниже представлена таблица с основными характеристиками ядер (↓ – чем меньше, тем лучше, ↑ – чем больше, тем лучше):
| Характеристика |
|
FreeBSD |
Linux |
Solaris |
WRK |
| A . Обзор |
| Строк кода (тысяч) |
|
2,599 |
4,150 |
3,000 |
829 |
| Объем комментариев (тысяч) |
|
232 |
377 |
299 |
190 |
| Число операторов (тысяч) |
|
948 |
1,772 |
1,042 |
192 |
| Число файлов |
|
4,479 |
8,372 |
3,851 |
653 |
| Число слинкованных модулей |
|
1,224 |
1,563 |
561 |
3 |
| Число функций |
|
38,371 |
86,245 |
39,966 |
4,820 |
| Макроопределений |
|
727,410 |
703,940 |
136,953 |
31,908 |
| B . Организация файлов (в среднем) |
| Число файлов в директории |
↓ |
6.8 |
20.4 |
8.9 |
15.9 |
| Число заголовочных файлов на 1 исходник |
≅ 1 |
1.05 |
1.96 |
1.09 |
1.92 |
| Средняя связность структур в файлах |
↓ |
2.2 ×1014 |
1.3 ×1013 |
5.4 ×1012 |
2.6 ×1013 |
| C . Структура кода |
| % глобальный функций/td> |
↓ |
36.7 |
21.2 |
45.9 |
99.8 |
| % аккуратно структурированных функций |
↑ |
27.1 |
68.4 |
65.8 |
72.1 |
| % labeled statements |
↓ |
0.64 |
0.93 |
0.44 |
0.28 |
| Среднее число параметров в функциях |
↓ |
2.08 |
1.97 |
2.20 |
2.13 |
| Средняя глубина максимальной вложенности |
↓ |
0.86 |
0.88 |
1.06 |
1.16 |
| Число элементов в языковой инструкции |
↓ |
9.14 |
9.07 |
9.19 |
8.44 |
| % повтора кода |
↓ |
4.68 |
4.60 |
3.00 |
3.81 |
| Средняя связность структур в функциях |
↓ |
7.1 ×104 |
1.3 ×108 |
3.0 ×106 |
6.6 ×105 |
| D . Стиль кодирования |
| % соответствующих общему стилю строк |
↑ |
77.27 |
77.96 |
84.32 |
33.30 |
| % соответствующих общему стилю typedef идентификаторов |
↑ |
57.1 |
59.2 |
86.9 |
100.0 |
| % соответствующих общему стилю совокупных тэгов (aggregate tags) |
↑ |
0.0 |
0.0 |
20.7 |
98.2 |
| Число символов в строке |
↓ |
30.8 |
29.4 |
27.2 |
28.6 |
| % цифровых констант в операндах |
↓ |
10.6 |
13.3 |
7.7 |
7.7 |
| % небезопасных функции-подобных макросов |
↓ |
3.99 |
4.44 |
9.79 |
4.04 |
| % опечаток в комментариях |
↓ |
33.0 |
31.5 |
46.4 |
10.1 |
| % уникальных слов с опечатками в комментариях |
↓ |
6.33 |
6.16 |
5.76 |
3.23 |
| E . Препроцессинг |
| % директив препроцессора в заголовочных файлах |
↓ |
22.4 |
21.9 |
21.6 |
10.8 |
| % не-#include директив в Си файлах |
↓ |
2.2 |
1.9 |
1.2 |
1.7 |
| % директив препроцессора в функциях |
↓ |
1.56 |
0.85 |
0.75 |
1.07 |
| % условных директив препроцессора в функциях |
↓ |
0.68 |
0.38 |
0.34 |
0.48 |
| % функции-подобных макросов в “defined” функциях |
↓ |
26 |
20 |
25 |
64 |
| % макросов среди уникальных идентификаторов |
↓ |
66 |
50 |
24 |
25 |
| % макросов среди идентификаторов |
↓ |
32.5 |
26.7 |
22.0 |
27.1 |
| F . Организация данных |
| % деклараций переменных в глобальной области |
↓ |
0.36 |
0.19 |
1.02 |
1.86 |
| % операндов переменных в глобальной области |
↓ |
3.3 |
0.5 |
1.3 |
2.3 |
| % идентификаторов ошибочно определенных в глобальном контексте |
↓ |
0.28 |
0.17 |
1.51 |
3.53 |
| % деклараций переменных ограниченных файлом |
↓ |
2.4 |
4.0 |
4.5 |
6.4 |
| % операндов переменных ограниченных файлом |
↓ |
10.0 |
6.1 |
12.7 |
16.7 |
| Переменных в typedef или aggregate |
↓ |
15.13 |
25.90 |
15.49 |
7.70 |
| Элементов данных в aggregate или enumeration |
↓ |
8.5 |
10.0 |
8.6 |
7.3 |
http://www.opennet.ru/opennews/art.shtml?num=15914
Related posts