400 тысяч GitHub-репозиториев, 1 миллиард файлов, 14 ТБ кода пробелы или табуляция


digitech

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

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

Решением вопроса обычно становится соглашение о правилах форматирования в рамках проекта или языка программирования в целом.

Команда разработчиков из Google исследовала проекты в репозитории Github. Они проанализировали код, написанный на 14 языках программирования. Целью исследования было выявить соотношение табуляций и пробелов — то есть, наиболее популярный способ форматирования текста для каждого из языков. Читать дальше →

400 тысяч GitHub-репозиториев, 1 миллиард файлов, 14 ТБ кода: пробелы или табуляция?

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1

После прочтения топиков Пора завязывать использовать символы табуляции в коде и Пора завязывать использовать пробелы вместо табуляции в коде в очередной раз убедился, что люди — любители сами себе создавать сложности. И захотелось поделиться нехитрым способом, который достаточно давно позволяет мне с коллегами избегать подобных «разборок» и, при этом, не изменять собственным предпочтениям.

Для сохранения нервных клеток друг друга нам потребуются:

— Git (не сомневаюсь, что подобное можно реализовать и в других VCS)

— GnuWin, если вы пользователь Windows

Git имеет систему атрибутов. Более подробно с атрибутами и способами их установки можно ознакомиться в документации, но, если кратко, то атрибуты описываются в файлах:

  1. $GIT_DIR/info/attributes — атрибуты для конкретного локального репозитория
  2. .gitattributes внутри проекта — атрибуты репозитория будут под контролем VCS и, соответственно, делегированы всем пользователям
  3. файл, заданный в секции core.attributesfile пользовательского конфига (

/.gitconfig) — атрибуты будут применены ко всем локальным репозиториям для данного пользователя

  • $(prefix)/etc/gitattributes — атрибуты будут применены ко всем локальным репозиториям для всех пользователей в системе

  • Атрибуты, описанные первым способом, имеют наивысший приоритет. Описанные четвёртым способом — наинизший.

    Нам потребуется всего один атрибут: фильтр (filter) — название фильтра, применяемого к файлам. Фильтры имеют два параметра:

    smudge — команда, применяемая к файлам при их получении

    clean — команда, применяемая к файлам при их сохранении

    То есть на диск будут помещены не исходные файлы, а стандартный вывод заданной команды, применённой к попадающим под данный фильтр файлам.

    Описываем атрибуты любым приглянувшимся способом. Я предпочитаю 3-ий способ, так как нет необходимости возиться с каждым репозиторием в отдельности, и нижеприведённые примеры относятся к нему. Для остальных способов принцип тот же самый, только необходимо использовать иные файлы для конфигурации. В общем, спрашивайте, если возникнут затруднения.

    Задаём файл с «глобальными» атрибутами:

    git config —global core.attributesfile

    Добавляем в файл

    /.gitattributes интересующие нас файлы при помощи любого текстового редактора:

    *.c filter=treatspaces
    *.txt filter=treatspaces

    И теперь, собственно, сам фильтр:

    если в репозитории пробелы, а вы привыкли к табам:

    git config —global filter.treatspaces.smudge ‘unexpand -tХ’
    git config —global filter.treatspaces.clean ‘expand -tХ’

    если в репозитории табы, а вы привыкли к пробелам:

    git config —global filter.treatspaces.smudge ‘expand -tХ’
    git config —global filter.treatspaces.clean ‘unexpand -tХ’
    Х – «размер» таба: сколько непрерывных пробелов заменять на таб и наоборот


    expand/unexpand — утилиты для замены tabs spaces

    Теперь при каждом получении/сохранении файлов, табы и пробелы будут прозрачно трансформироваться друг в дружку.

    И заключительный штрих дабы перестать мучатьсятрансформировать все файлы незамедлительно:

    git checkout —force

    expand/unexpand — стандартные утилиты Linux/FreeBSD/Mac OS (я не настолько суров, чтоб проверять в других *nix-системах). Windows-фанам буду признателен за подсказку нативных консольных аналогов (если таковые имеются), дабы не приходилось тянуть GnuWin.

    Любители пробелов победили сторонников табуляции в споре об отступах!

    Для удобочитаемости программного кода подавляющее большинство программистов использует форматирование отступами — это позволяет выделить в коде отдельные блоки. При этом одни разработчики создают отступ несколькими пробелами, в то время как другие пользуются табуляцией. Основная проблема такого подхода заключается в том, что при работе над одним проектом нескольких человек, использующих разные отступы, форматирование сбивается и код становится трудно читаемым.

    Фелипе Хоффа решил определить, какие отступы используются чаще, для чего использовал аналитический сервис BigQuery. С помощью сервиса автор отобрал и обработал 400 тысяч репозиториев, получивших наивысшую оценку пользователей на GitHub за период с января по май 2020 года, объем обрабатываемых данных при этом составил 14 терабайт.

    Проблема разных отступов существует достаточно давно и часто является причиной безрезультатных споров в профессиональной среде. Фактически, вопрос «пробелы или табуляция» представляет собой образцовый холивар, в котором у обеих сторон есть свои аргументы(1, 2), но никто не намерен переходить на другую сторону. Явление также нашло отражение в современной культуре — например, одна из сцен в сериале «Кремниевая долина» строится именно вокруг проблемы «пробелы или табуляция».

    Любители пробелов победили сторонников табуляции в споре об отступах

    Разработчик из Google Фелипе Хоффа по итогам анализа более миллиарда файлов из 400 тысяч репозиториев на GitHub выяснил, что форматирование кода с помощью пробелов в общем случае используется чаще, чем форматирование с помощью табуляции. Об этом автор рассказал в блоге на Medium.

    Для удобочитаемости программного кода подавляющее большинство программистов использует форматирование отступами — это позволяет выделить в коде отдельные блоки. При этом одни разработчики создают отступ несколькими пробелами, в то время как другие пользуются табуляцией. Основная проблема такого подхода заключается в том, что при работе над одним проектом нескольких человек, использующих разные отступы, форматирование сбивается и код становится трудно читаемым.

    Фелипе Хоффа решил определить, какие отступы используются чаще, для чего использовал аналитический сервис BigQuery. С помощью сервиса автор отобрал и обработал 400 тысяч репозиториев, получивших наивысшую оценку пользователей на GitHub за период с января по май 2020 года, объем обрабатываемых данных при этом составил 14 терабайт.

    Проблема разных отступов существует достаточно давно и часто является причиной безрезультатных споров в профессиональной среде. Фактически, вопрос «пробелы или табуляция» представляет собой образцовый холивар, в котором у обеих сторон есть свои аргументы(1, 2), но никто не намерен переходить на другую сторону. Явление также нашло отражение в современной культуре — например, одна из сцен в сериале «Кремниевая долина» строится именно вокруг проблемы «пробелы или табуляция».

    Jekins / Markdown-docs.md

    Настоящий документ предназначен для ознакомления пользователя с функциональными возможностями языка разметки Markdown. Markdown – это облегченный язык разметки, который является инструментом преобразования кода в HTML. Главной особенностью данного языка является максимально простой синтаксис, который служит для упрощения написания и чтения кода разметки, что, в свою очередь, позволяет легко его корректировать. Теперь рассмотрим более подробно функции языка разметки Markdown.


    Markdown не является заменой HTML. Синтаксис Markdown достаточно ограничен, и соответствует лишь небольшому подмножеству элементов HTML. Он включает в себя следующие элементы:

    Более подробно с перечисленными функциями можно ознакомиться в разделе «Описание синтаксиса».

    Параграфы и разрывы строк

    Для того, чтобы создать параграф с использованием синтаксиса языка Markdown, достаточно отделить строки текста одной (или более) пустой строкой (пустой считается всякая строка, которая не содержит в себе ничего, кроме пробелов и символов табуляции). Для того, чтобы вставить видимый перенос строки (элемент
    ) необходимо окончить строку двумя пробелами и нажатием клавиши «Enter». Многие элементы синтаксиса Markdown выглядят и работают гораздо лучше в случае, когда их форматируют с помощью «жесткого перевода строк» (разделение строк, осуществленное самим пользователем, а не программой автоматически). К таким элементам относятся цитаты, списки и пр.

    Язык разметки Markdown поддерживает 2 стиля обозначения заголовков: подчеркивание и выделение символом («#»). Выделение заголовков с помощью подчеркивания производится знаками равенства («=») в случае, если заголовок первого уровня, и дефисами («-») в случае, если заголовок второго уровня. Количество знаков подчеркивания не ограничивается. При выделении заголовков с помощью символа («#») используется от одного до шести данных символов, которые устанавливаются в начале строки (перед заголовком). В данном случае количество символов соответствует уровню заголовка. Кроме того, заголовок возможно снабдить закрывающимися символами («#»), хотя это и не является обязательным. Количество закрывающихся символов не обязано соответствовать количеству начальных символов. Уровень заголовка определяется по количеству начальных символов.
    Заголовки первого и второго уровней, выполненные с помощью подчеркивания, выглядят следующим образом:

    Заголовки первого, третьего и шестого уровней, выполненные с помощью символа («#»), выглядят следующим образом:

    Приведенные выше заголовки, выполненные с помощью символа («#») тождественны следующим:

    В результате на экран выводится следующее:

    Заголовок первого уровня

    Заголовок второго уровня

    Заголовок первого уровня

    Заголовок третьего уровня

    Заголовок шестого уровня

    Для обозначения цитат в языке Markdown используется знак «больше» («>»). Его можно вставлять как перед каждой строкой цитаты, так и только перед первой строкой параграфа. Также синтаксис Markdown позволяет создавать вложенные цитаты (цитаты внутри цитат). Для их разметки используются дополнительные уровни знаков цитирования («>»). Цитаты в Markdown могут содержать всевозможные элементы разметки. Цитаты в языке Markdown выглядят следующим образом:

    Вложение цитаты в цитату выглядит следующим образом:

    В результате на экран выводится следующее:


    Это пример цитаты, в которой перед каждой строкой ставится угловая скобка.

    Это пример цитаты, в которой угловая скобка ставится только перед началом нового параграфа.

    Первый уровень цитирования

    Уровень цитирования не может превышать 15-й.

    Markdown поддерживает упорядоченные (нумерованные) и неупорядоченные (ненумерованные) списки. Для формирования неупорядоченный списков используются такие маркеры, как звездочки, плюсы и дефисы. Все перечисленные маркеры могут использоваться взаимозаменяемо. Для формирования упорядоченных списков в качестве маркеров используются числа с точкой. Важной особенностью в данном случае является то, что сами номера, с помощью которых формируется список, не важны, так как они не оказывают влияния на выходной HTML код. Как бы ни нумеровал пользователь список, на выходе он в любом случае будет иметь упорядоченный список, начинающийся с единицы (1, 2, 3…). Эту особенность стоит учитывать в том случае, когда необходимо использовать порядковые номера элементов в списке, чтобы они соответствовали номерам, получающимся в HTML. Упорядоченные списки всегда следует начинать с единицы. Маркеры списков обычно начинаются с начала строки, однако они могут быть сдвинуты, но не более чем на 3 пробела. За маркером должен следовать пробел, либо символ табуляции. При необходимости в список можно вставить цитату. В этом случае обозначения цитирования ( «>» ) нужно писать с отступом. Упорядоченные списки выглядят следующим образом:

    Неупорядоченные списки выглядят следующим образом:

    На выходе всех трех перечисленных вариантов имеется один и тот же результат. В результате на экран выводится следующее:

    Цитата, вставленная в список, выглядит следующим образом:

    В результате на экран выводится следующее:

    Элемент списка с цитатой:

    Это цитата внутри элемента списка.

    Второй элемент списка

    При вставке цитат в элементы списка важно учитывать, что элементы списка должны находиться на одном уровне, а цитаты должны указываться с отступом. В случае, если правило с единым уровнем списка не соблюдается, следующий после цитаты элемент списка будет автоматически нумероваться цифрой «1.». Кроме того, при необходимости в список можно вставить исходный код. В этом случае его нужно писать с двойным отступом – 8 пробелов или 2 символа табуляции.

    Элемент списка, содержащий исходный код

    Отформатированные блоки кода используются в случае необходимости процитировать исходный код программ или разметки. Для создания блока кода в языке Markdown необходимо каждую строку параграфа начинать с отступа, состоящего из четырех пробелов или одного символа табуляции. Блок кода продолжается до тех пор, пока не встретится строка без отступа (или конец текста). Внутри блока кода амперсанды («&») и угловые скобки (« ») автоматически преобразуются в элементы HTML разметки. Кроме того, следует отметить, что внутри блоков кода обычный синтаксис Markdown не обрабатывается. Блок кода в Markdown выглядит следующим образом:

    Это обычный параграф:


    Горизонтальные линии (разделители)

    Для того чтобы создать горизонтальную линию с использованием синтаксиса языка Markdown, необходимо поместить три (или более)дефиса или звездочки на отдельной строке текста. Между ними возможно располагать пробелы. Горизонтальные линии в Markdown выглядят следующим образом:

    В результате на экран выводится следующее:

    Первая часть текста, который необходимо разделить

    Вторая часть текста, который необходимо разделить

    При использовании данного инструмента важно помнить, что после первой части текста и перед второй необходимо оставлять пустую строку. Данное правило необходимо соблюдать только при использовании дефисов. Если его не соблюдать, на экран будет выведен заголовок второго уровня и строка обычного текста. При использовании символа звездочки данным правилом можно пренебречь.

    Markdown поддерживает два стиля оформления ссылок:

    • Гиперссылка, с немедленным указанием адреса (внутритекстовая);
    • Гиперссылка, подобная сноске.

    Подразумевается, что помимо URL-адреса существует еще текст ссылки. Он заключается в квадратные скобки. Для создания внутритекстовой гиперссылки необходимо использовать круглые скобки сразу после закрывающей квадратной. Внутри них необходимо поместить URL-адрес. В них же возможно расположить название, заключенное в кавычки, которое будет отображаться при наведении, но этот пункт не является обязательным.

    В результате на экран выводится следующее: пример При ссылке на локальную директорию возможно использование относительного пути (от текущей страницы, сайта и т.п.)

    При создании сносной гиперссылки вместо целевого адреса используется вторая пара квадратных скобок, внутри которых помещается метка, идентификатор ссылки (id).

    Также, можно использовать пробел, чтобы отделять 2 пары квадратных скобок:

    В этом случае возможно определить идентификатор в любом месте документа:

    В результате на экран выводится следующее: [пример] [id] [id]: http://example.com/ «Необязательная подсказка» Иными словами, она состоит из следующих элементов:

    • Идентификатор ссылки, окружённый квадратными скобками (которым может предшествовать необязательный отступ от одного до трёх пробелов);
    • Двоеточие;
    • Один или несколько пробелов (или символов табуляции);
    • URL гиперссылки;
    • Необязательный заголовок (подсказка к изображению, которая всплывает при наведении на него) гиперссылки, заключённый либо в двойные или одиночные кавычки, либо в скобки.


    Идентификаторы ссылок могут состоять из букв, цифр, пробелов и знаков пунктуации, однако они не чувствительны к регистру. То есть эти два варианта эквивалентны:

    Markdown позволяет также использовать неявно выраженный идентификатор (сокращенный). В этом случае метка не приводится, вместо неё текст гиперссылки используется и в качестве её имени, а вторая пара квадратных скобок остаётся пустою. Например, чтобы сделать слово «Example» гиперссылкой, ведущей на сайт http://example.com/, достаточно написать:

    и затем определить гиперссылку:

    В результате на экран выводится следующее: [Example][] [Example]: http://example.com/

    Markdown воспринимает звёздочки «*» и символы подчёркивания «_» как признаки смыслового выделения текста:

    • Текст, окружённый одиночными «*» или «_», будет заключен в HTML-тэг .
    • Текст, окружённый двойными «*» или «_», будет заключен в HTML-тэг .

    Иными словами, текст, окруженный одинарными символами, выделяется курсивным шрифтом, а текст, окруженный двойными символами, выделяется полужирным шрифтом. Также, выделенный фрагмент может находиться в любой части слова. Текст, выделенный курсивом с использованием синтаксиса языка Markdown, выглядит следующим образом:

    Текст, выделенный полужирным шрифтом с использованием синтаксиса языка Markdown, выглядит следующим образом:

    Пример

    Текст, выделенный курсивным полужирным шрифтом с использованием синтаксиса языка Markdown выглядит следующим образом:

    Пример

    Все приведенные выше примеры аналогичны следующим:

    Кодовые фрагменты строк

    Чтобы отметить фрагмент строки, содержащий код, необходимо окружить его обратными апострофами «`». При использовании кодовых фрагментов строк текст будет отображаться в виде моноширинного шрифта. В отличие от блоков кода, кодовый фрагмент позволяет поместить код внутрь обычного абзаца текста. Кодовый фрагмент строки в языке Markdown выглядит следующим образом:


    Используйте оператор if

    В Markdown существует 2 способа вставки изображений в документ:

    a. С помощью непосредственного указания URL-адреса изображения. Синтаксис данной команды выглядит следующим образом:

    Иными словами, он состоит из следующих элементов:

    • восклицательный знак;
    • квадратные скобки, в которых указывается альтернативный изображению текст (он станет содержимым атрибута в элементе img);
    • круглые скобки, содержащие URL-адрес или относительный путь изображения, а также (необязательно) всплывающую подсказку, заключённуе в двойные или одиночные кавычки.

    b. С помощью метки-идентификатора. Синтаксис данной команды записывается следующим образом:

    где «id» — имя определённой метки изображения. Метки изображений определяются при помощи синтаксиса, совершенно идентичного меткам гиперссылок:

    Важной особенностью является то, что Markdown не позволяет задать размеры изображения (ширину, высоту).

    Может употребляться в Markdown перед специальными символами для того, чтобы они воспринимались в их буквальном (а не служебном) значении. Полный список данных символов приводится ниже:

    «_» — символ подчеркивания;

    Markdown поддерживает упрощённый порядок автоматического создания ссылок для URL-адресов и адресов электронной почты. Для этого достаточно поместить URL-адрес или почтовый адрес в угловые скобки, и Markdown сделает его гиперссылкой. В отличие от вышеописанных стилей, в данном случае сам же URL-адрес или почтовый адрес становится и текстом гиперссылки. Автоматические ссылки на адреса электронной почты работают аналогично. Автоматические ссылки в языке Markdown выглядят следующим образом

    В результате на экран выводится следующее: http://example.com/

    Автоматическая ссылка на адрес электронной почты в Markdown выглядит следующим образом

    400,000 GitHub repositories, 1 billion files, 14 terabytes of code: Spaces or Tabs?

    Tabs or spaces. We are going to parse a billion files among 14 programming languages to decide which one is on top.


    The rules:

    • Data source: GitHub files stored in BigQuery.
    • Stars matter: We’ll only cons >No small files: Files need to have at least 10 lines that start with a space or a tab.
    • No duplicates: Duplicate files only have one vote, regardless of how many repos they live in.
    • One vote per file: Some files use a mix of spaces or tabs. We’ll count on which s >Top languages: We’ll look into files with the extensions (.java, .h, .js, .c, .php, .html, .cs, .json, .py, .cpp, .xml, .rb, .cc, .go).

    Numbers

    How-to

    I used the already existing [bigquery-public-data:github_repos.sample_files] table, that lists the files of the top 400,000 repositories. From there I extracted all the contents for the files with the top languages extensions:

    That query took a relative long time since it involved joining a 190 million rows table with a 70 million rows one, and over 1.6 terabytes of contents. But don’t worry about having to run it, since I left the result publicly available at [fh-bigquery:github_extracts.contents_top_repos_top_langs].

    In the [contents] table we have each unique file represented only once. To see the total number of files and size represented:

    Then it was time to run the ranking according to the previously established rules:

    Analyzing each line of 133 GBs of code in 16 seconds? That’s why I love BigQuery.

    Программисты, отделяющие код пробелами, зарабатывают больше тех, кто использует Tab

    Сайт Stack Overflow подвел итоги опроса разработчиков и выявил забавную закономерность. По данным исследования, те программисты, которые оформляют свой код с помощью клавиши пробела, зарабатывают больше тех, кто использует для этих целей клавишу Tab. Разница в медиане зарплат превышает $15 000.


    Согласно опросу, у «пробельщиков» медиана зарплаты равна $59 140, тогда как аналогичная медиана дохода у «таберов» равна $43 750.

    В опросе по зарплате приняли участие более 64 000 программистов. Тогда как на вопросы о предпочтениях в оформлении кода ответили 12 426 специалистов.

    В прошлом году со своим исследованием этого вопроса выступил разработчик Google Фелип Хоффа. Он изучил 400 000 примеров кода, которые хранятся в популярном репозитории GitHub, и пришел к выводу, что программисты чаще используют пробел.

    digitech

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

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

    Решением вопроса обычно становится соглашение о правилах форматирования в рамках проекта или языка программирования в целом.

    Команда разработчиков из Google исследовала проекты в репозитории Github. Они проанализировали код, написанный на 14 языках программирования. Целью исследования было выявить соотношение табуляций и пробелов — то есть, наиболее популярный способ форматирования текста для каждого из языков. Читать дальше →

    400 тысяч GitHub-репозиториев, 1 миллиард файлов, 14 ТБ кода: пробелы или табуляция?

    Копирование материала разрешено только с обязательной обратной активной индексируемой ссылкой! Пример.

    Источник: pravdu.ru

    Осознание того, что нужно делать в этой Жизни, пытается прийти ко Всем и не раз, но ко Многим, оно доходит именно в день их Смерти. И что именно Правда, и что именно Делать в этой жизни, придется выбирать именно Тебе. Мы можем пожелать только Удачи! © Группа «Знай Правду»

    Андроид, финты ушами.

    Мыши плакали, кололись, но продолжали грызть кактус.

    понедельник, 11 марта 2013 г.

    Табуляция или пробелы?

    Различия в поведении пробелов и табов

    Рассмотрим следующий показательный фрагмент кода:

    1. Используйте отступы стандартного де-факто размера. Для Java, Pascal, C, C++ и т.п. стандартом де-факто является отступ в 4 символа, как бы нам ни хотелось использовать другой размер.
    2. Если соблюдён пункт 1, то абсолютно неважно, чем вы будете делать отступы. Если вы сделаете их пробелами, то будет хорошо — ваш код везде будет выглядеть читаемо, и никогда ничего не поползёт. Другие программисты при чтении вашего кода будут привыкать к правильному форматированию. Если же вы сделаете отступы табуляцией, то будет ещё лучше — вы дадите другим программистам выбор — включить в редакторе правильный размер табуляции и читать правильно отформатированный код, или читать его с привычными им отступами, но поползшими комментариями и отдельными строками, в которых применялось выравнивание.
    3. Выбор в пункте 2 можно осуществлять в зависимости от того, как ваш код будет использоваться в дальнейшем. Если его блоки будут вставляться в чужой код, тогда точно имеет смысл выбрать табуляцию, чтобы вставляющему проще было подогнать форматирование. Если исходник предназначен для публикации в Интернете, где табуляция либо съедается, либо зафиксирована на 8 символов, то тогда можно выбрать пробелы, чтобы исключить дополнительный шаг подготовки исходника к публикации. Если же в вашей организации уже установлены определённые правила форматирования, то выбора у вас уже нет 🙂

    Что касается Notepad из состава Windows, который не имеет настройки размера табуляции, и прочих подобных редакторов, делающих табуляцию принудительно в 8 символов, то я не могу себе представить причину, по которой программист открывал бы мой код именно в них, тогда как уже давно для всех ОС существуют удобные специализированные редакторы для исходного кода.

    Работать в блокноте не круто. Круто работать в шестнадцатеричном редакторе 🙂

    Мастер Йода рекомендует:  Как обеспечить защиту сайта
    Добавить комментарий