Таби або прогалини? Аналіз 400 тисяч репозиторіїв GitHub, мільярди файлів, 14 ТБ коду



Для допитливих розробників до цих пір залишається актуальним питання використання табуляції та пропусків форматування коду. Можуть вони бути взаємозамінні: наприклад, через 2 інтервали на вкладку або 4? Але єдиного стандарту немає, тому іноді між розробниками виникає нерозуміння. Крім того, різні IDE і їх компілятори обробляють табуляцію також по-своєму.

Вирішенням питання зазвичай стає угода про правила форматування в рамках проекту або мови програмування в цілому.

Команда розробників з Google исследовала проекти в репозиторії Github. Вони проаналізували код, написаний на 14 мовах програмування. Метою дослідження було виявити співвідношення табуляцій і прогалин — тобто, найбільш популярний спосіб форматування тексту для кожної з мов.

Реалізація

Для аналізу використовувалася вже існуюча таблиця [bigquery-public-data:github_repos.sample_files], в яку записані найменування репозиторіїв Github.

Нагадаємо, що близько двох місяців тому весь відкритий код Github став доступний у формі таблиць BigQuery.

Однак для аналізу були обрані не всі репозиторії, а тільки верхні 400 тисяч репозиторіїв з найбільшим числом зірок, які вони отримали за період з січня по травень 2016 року.



З цієї таблиці були виділені файли, що містять код на 14 самих популярних мовах програмування. Для цього в якості параметрів sql-запиту були вказані розширення відповідних файлів – .java, .h, .js .c, .php, .html .cs, .json, .py, .cpp, .xml .rb, .cc, .go.

SELECT a.id id, size, content, binary, copies, sample_repo_name , sample_path
FROM (
SELECT id, FIRST(path) sample_path, FIRST(repo_name) sample_repo_name 
FROM [bigquery-public-data:github_repos.sample_files] 
WHERE REGEXP_EXTRACT(path, r'\.([^\.]*)$') IN ('java','h','js','c','php','html','cs','json','py','cpp','xml','rb','cc','go')
GROUP BY id
a
JOIN [bigquery-public-data:github_repos.contents] b
ON a.id = b.id

864.6 s elapsed, 1.60 TB processed
Запит виконувався досить довго. І це не дивно, так як необхідно було виконати операцію об'єднання (join) таблиці з 190 мільйонів рядків з таблицею в 70 мільйонів рядків. Всього було опрацьовано 1,6 ТБ даних. Результати запиту доступні за адресою.

В таблиці [contents] записані файли без своїх дублікатів. Нижче вказано загальну кількість унікальних файлів і їх загальний розмір. Дублікати файлів не враховувалися в ході аналізу.



Після цього залишалося тільки сформувати і запустити на виконання фінальний запит.

SELECT ext, tabs, spaces, countext, LOG((spaces+1)/(tabs+1)) lratio
FROM (
SELECT REGEXP_EXTRACT(sample_path, r'\.([^\.]*)$') ext, 
SUM(best='tab') tabs, SUM(best='space') spaces, 
COUNT(*) countext
FROM (
SELECT sample_path, sample_repo_name, IF(SUM(line=' ')>SUM(line='\t'), 'space', 'tab') WITHIN RECORD best,
COUNT(line) WITHIN RECORD c
FROM (
SELECT LEFT(SPLIT(content, '\n'), 1) line, sample_path, sample_repo_name 
FROM [fh-bigquery:github_extracts.contents_top_repos_top_langs]
HAVING REGEXP_MATCH(line, r'[ \t]')
)
HAVING c>10 # at least 10 lines that start with space or tab
)
GROUP BY ext
)
ORDER BY countext DESC
LIMIT 100

16.0 s elapsed, 133 GB processed
Аналіз кожної з рядків 133 Гб коду зайняв 16 секунд. Досягти такої швидкості допоміг все той же BigQuery.


Найчастіше табуляція зустрічається в мові С, а прогалини в Java.

Хоча для когось співвідношення тих чи інших керуючих символів не має значення, а суперечки на цю тему здаються надуманими. Це не має значення і для деяких IDE, які зберігають табуляцію як деяку кількість прогалин. Також існують IDE, у яких це кількість можна налаштовувати вручну.

Деякий час тому ця проблема була обіграна в серіалі «Кремнієва долина». Хлопець і дівчина не зійшлися в питанні форматування. В результаті старий холівар не тільки привів до непорозуміння в професійному плані, але і створив проблеми в особистих відносинах.



Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.