Сравнение качества кода ядер ОС 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