Представлены (https://blog.acolyer.org/2017/11/20/dejavu-a-map-of-code-dup.../) результаты (https://dl.acm.org/ft_gateway.cfm?id=3133908&ftid=1914259&dw...) изучения дублирования кода в общем объёме исходных текстов, размещённых на GitHub. Проанализировано (http://mondego.ics.uci.edu/projects/dejavu/) 4.5 млн различных проектов (без форков репозиториев), включающих более 428 млн файлов с кодом на языках Java, C++, Python и JavaScript. Из этих файлов лишь 85 млн оказались уникальными, т.е. 80% кода на GitHub являются копиями других файлов.
Определение дубликатов выполнялось несколькими методами: путём сравнения хэшей файлов (полные копии), хэшей сгруппированного набора токенов из файла (не учитывает форматирование и комментарии) и оценки частичного заимствования кода при помощи SourcererCC (https://github.com/Mondego/SourcererCC) (определён отредактированный код с 80% общих токенов).
Наиболее часто дубликаты встречаются в коде на языке JavaScript, для которого лишь 6% файлов не совпадают (т.е. 94% файлов являются полными клонами 6% файлов), 5% не совпадают по хэшу набора токенов и 2% отличаются с учётом редактирования кода. Наименьшее число дубликатов выявлено для кода на языке Java, для которого не повторяется 60% файлов, 56% наборов токенов и 26% отличаются с учётом редактирования кода. Для C++ эти показатели составляют 27%, 23% и 10%, а для Python - 29%, 27% и 9%.
Наиболее часто повторяющимся стал пустой файл, размером 0 байт, который повторяется 2.2 млн раз. Игнорирование при проверке мелких файлов, в которых встречаются менее 50 токенов, почти не сказывается на уровне совпадений:
Распределение языков по уровню дублирования кода также сохраняется, если провести сравнению не на уровне файлов, а на уровне проектов. Например, около 15% проектов на JavaScript являются полными клонами других проектов, 31% проектов копируют более 80% кода из других проектов, а 48% копируют более 50% кода. Для Java эти показатели составляют 6%, 9% и 14%.
Попытки разобраться почему степень дублирования кода столь велика показали, что наиболее частой причиной появление дубликатов, является включение в репозитории проектов кода из сторонних библиотек и фреймворков, вместо подключения их как внешних зависимостей. Например, для JavaScript очень велика доля копий библиотек, распространяемых через NPM. Несмотря на то, что только 6% проектов включают каталог node_modules, 70% из всех дубликатов на JavaScript связаны с копированием модулей NPM.
В среднем в JavaScript-проект включается 63 зависимости, а уровень вложенности зависимостей составляет 5 (максимальное зафиксированное число зависимостей - 1261, уровень вложенности - 47). Кроме NPM-модулей достаточно часто в проект включается библиотека jQuery. В Java чаще остальные дублируются компоненты ActionBarSherlock и Cordova, в C/C++ - boost и freetype, в Python копирование распределено более равномерно по разнообразным библиотекам.
Совпадения на уровне изменённого кода (частичное совпадение) также чаще всего оказались вызванными использованием "копипастинга" или ненамеренным копированием кода и автогенерацией кода в процессе применения типовых фреймворков. Например, для Java чаще всего совпадения выявлялись в коде, сгенерированном при помощи Apache Axis, Android SDK и JAXB, для Python при помощи Django, а для JavaScript - Angular.
y.
URL: https://blog.acolyer.org/2017/11/20/dejavu-a-map-of-code-dup.../
Новость: http://www.opennet.ru/opennews/art.shtml?num=47596