Анализ степени дублирования кода на GitHub
Проанализировано 4.5 млн различных проектов (без форков репозиториев), включающих более 428 млн файлов с кодом на языках Java, C++, Python и JavaScript. Представлены результаты изучения дублирования кода в общем объёме исходных текстов, размещённых на GitHub. 80% кода на GitHub являются копиями других файлов. Из этих файлов лишь 85 млн оказались уникальными, т.е.
Определение дубликатов выполнялось несколькими методами: путём сравнения хэшей файлов (полные копии), хэшей сгруппированного набора токенов из файла (не учитывает форматирование и комментарии) и оценки частичного заимствования кода при помощи SourcererCC (определён отредактированный код с 80% общих токенов).
94% файлов являются полными клонами 6% файлов), 5% не совпадают по хэшу набора токенов и 2% отличаются с учётом редактирования кода. Наиболее часто дубликаты встречаются в коде на языке JavaScript, для которого лишь 6% файлов не совпадают (т.е. Для C++ эти показатели составляют 27%, 23% и 10%, а для Python — 29%, 27% и 9%. Наименьшее число дубликатов выявлено для кода на языке Java, для которого не повторяется 60% файлов, 56% наборов токенов и 26% отличаются с учётом редактирования кода.
Но игнорирование при проверке мелких файлов, в которых встречаются менее 50 токенов, почти не сказывается на уровне совпадений: Наиболее часто повторяющимся стал пустой файл, размером 0 байт, который встречается 2.2 млн раз.
Например, около 15% проектов на JavaScript являются полными клонами других проектов, 31% проектов копируют более 80% кода из других проектов, а 48% копируют более 50% кода. Распределение языков по уровню дублирования кода также сохраняется, если провести сравнение не на уровне файлов, а на уровне проектов. Для Java эти показатели составляют 6%, 9% и 14%.
Например, для JavaScript очень велика доля копий библиотек, распространяемых через NPM. Попытки разобраться почему степень дублирования кода столь велика показали, что наиболее частой причиной появление дубликатов, является включение в репозитории проектов кода из сторонних библиотек и фреймворков, вместо подключения их как внешних зависимостей. Несмотря на то, что только 6% проектов включают каталог node_modules, 70% из всех дубликатов на JavaScript связаны с копированием модулей NPM.
Кроме NPM-модулей достаточно часто в проект включается библиотека jQuery. В среднем в JavaScript-проект включается 63 зависимости, а уровень вложенности зависимостей составляет 5 (максимальное зафиксированное число зависимостей — 1261, максимальный уровень вложенности — 47). В Java чаще остальных дублируются компоненты ActionBarSherlock и Cordova, в C/C++ — boost и freetype, в Python копирование распределено более равномерно по разнообразным библиотекам.
Например, для Java чаще всего совпадения выявлялись в коде, сгенерированном при помощи Apache Axis, Android SDK и JAXB, для Python при помощи Django, а для JavaScript — Angular. Совпадения на уровне изменённого кода (частичное совпадение при проверке SourcererCC)чаще всего оказались вызванными использованием «копипастинга», а также ненамеренным копированием кода или автогенерацией кода в процессе применения типовых фреймворков.
Определение дубликатов выполнялось несколькими методами: путём сравнения хэшей файлов (полные копии), хэшей сгруппированного набора токенов из файла (не учитывает форматирование и комментарии) и оценки частичного заимствования кода при помощи SourcererCC (определён отредактированный код с 80% общих токенов).
Проанализировано 4.5 млн различных проектов (без форков репозиториев), включающих более 428 млн файлов с кодом на языках Java, C++, Python и JavaScript. Представлены результаты изучения дублирования кода в общем объёме исходных текстов, размещённых на GitHub. 80% кода на GitHub являются копиями других файлов. Из этих файлов лишь 85 млн оказались уникальными, т.е.
94% файлов являются полными клонами 6% файлов), 5% не совпадают по хэшу набора токенов и 2% отличаются с учётом редактирования кода. Наиболее часто дубликаты встречаются в коде на языке JavaScript, для которого лишь 6% файлов не совпадают (т.е. Для C++ эти показатели составляют 27%, 23% и 10%, а для Python — 29%, 27% и 9%. Наименьшее число дубликатов выявлено для кода на языке Java, для которого не повторяется 60% файлов, 56% наборов токенов и 26% отличаются с учётом редактирования кода.
Но игнорирование при проверке мелких файлов, в которых встречаются менее 50 токенов, почти не сказывается на уровне совпадений: Наиболее часто повторяющимся стал пустой файл, размером 0 байт, который встречается 2.2 млн раз.
Например, около 15% проектов на JavaScript являются полными клонами других проектов, 31% проектов копируют более 80% кода из других проектов, а 48% копируют более 50% кода. Распределение языков по уровню дублирования кода также сохраняется, если провести сравнение не на уровне файлов, а на уровне проектов. Для Java эти показатели составляют 6%, 9% и 14%.
Кроме NPM-модулей достаточно часто в проект включается библиотека jQuery. В среднем в JavaScript-проект включается 63 зависимости, а уровень вложенности зависимостей составляет 5 (максимальное зафиксированное число зависимостей — 1261, максимальный уровень вложенности — 47). В Java чаще остальных дублируются компоненты ActionBarSherlock и Cordova, в C/C++ — boost и freetype, в Python копирование распределено более равномерно по разнообразным библиотекам.
Например, для JavaScript очень велика доля копий библиотек, распространяемых через NPM. Попытки разобраться почему степень дублирования кода столь велика показали, что наиболее частой причиной появление дубликатов, является включение в репозитории проектов кода из сторонних библиотек и фреймворков, вместо подключения их как внешних зависимостей. Несмотря на то, что только 6% проектов включают каталог node_modules, 70% из всех дубликатов на JavaScript связаны с копированием модулей NPM.
Например, для Java чаще всего совпадения выявлялись в коде, сгенерированном при помощи Apache Axis, Android SDK и JAXB, для Python при помощи Django, а для JavaScript — Angular. Совпадения на уровне изменённого кода (частичное совпадение при проверке SourcererCC)чаще всего оказались вызванными использованием «копипастинга», а также ненамеренным копированием кода или автогенерацией кода в процессе применения типовых фреймворков.
Дата публикации: 20-11-2017
Ещё новости
19.10.2022 Вышел Node.js 19.0
19.04.2023 «Старший брат» «Москвича 3»: в России начались «живые» продажи 180-сильного JAC JS6
По габаритам он сопоставим с Haval F7 и Nissan X-Trail: они составляют 4605?1890 х 1700 мм при колесной базе 2720 мм. JAC JS6 — это «старший брат» JS4, который выпускают в России под названием «Москвич...
26.08.2022 Huawei Mate 50 Pro удивит своим экраном: вырез такой же, как у iPhone 13 Pro
Зачем Huawei понадобилось расширять вырез, когда большинство флагманов обходятся обычными врезанными камерами, — вопрос. В Сети появились новые изображения будущего флагмана Huawei Mate 50 Pro, и...
20.11.2022 Многие производители кабелей Lightning уже закрылись: из-за перехода iPhone на USB-C закроется до 80% таких компаний
Он заявил в своем посте, что скорость проводной передачи новых смартфонов существенно увеличится. Известный аналитик Минг-Чи Куо заявил на прошлой неделе, что все смартфоны серии iPhone 15 получат разъёмы...
26.08.2022 Народные GeForce RTX 4060 и RTX 4060 Ti будут работать на частоте свыше 2,6 ГГц. Производительность RTX 4060 Ti окажется на уровне RTX 3080
Согласно данным информатора, старшая модель набирает около 8600 баллов, средняя частота ее GPU — около 2,6 ГГц, а потребление энергии при этом составляет 270–280 Вт. Инсайдер опубликовал результаты...
Все новости