Греческий исследователь 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