Главная » 2008»Май»17 » Сравнение качества кода ядер ОС Linux, Windows, OpenSolaris и FreeBSD
Сравнение качества кода ядер ОС Linux, Windows, OpenSolaris и FreeBSD
05:17
Греческие исследователь 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
% идентификаторов ошибочно определенных в глобальном контексте