Редактировать: я больше не поддерживаю эту позицию. В качестве отличной причины для использования вкладок прочтите эту статью: https://www.reddit.com/r/javascript/comments/c8drjo/nobody_talks_about_the_real_reason_to_use_tabs/

Это сообщение о коммите, которое я оставил пару дней назад в ответ на выбор табуляции вместо пробелов в editorconfig нового проекта. Это похоже на крайнюю позицию. Я не сторонник крайних позиций, поэтому, конечно, в этом утверждении есть некоторая гипербола. Но действительно. Никогда не используйте вкладки. Вот почему.

Пробелы всегда важны

Есть несколько языков (наиболее ярким примером является Python), в которых «значительные пробелы». Другими словами, отступы являются частью структуры кода. Итак, тогда как в Ruby вы можете определить функцию (да, да, они называются методами в Ruby) следующим образом:

def hello_world
  puts “hello world”
end

В Python вы можете написать:

def hello_world:
  print("hello world")

В примере с Python закрывающий тег end не требуется. Скорее отступ указывает на тело функции; и изменение отступа «сбрасывает» или закрывает тело функции. Языки такого рода называются «значительными пробелами».

Когда компилятор (или интерпретатор) оценивает эту функцию, он подсчитывает символы пробела, чтобы понять, когда функция заканчивается, поэтому смесь табуляции и пробелов создает проблемы с пониманием того, сколько символов с отступом просматривает компилятор в данный момент. Поскольку в то время как tab-space-space выглядит так, будто код имеет отступ в четыре столбца в нашем редакторе, для компилятора это только 3 символа пробела.

Но беда в том, что во всех языках есть значительные пробелы. Если вы мне не верите, попробуйте открыть консоль javascript и запустить:

functionfoo(){console.log(‘foo’)}

А затем сравните это с:

function foo(){console.log(‘foo’)}

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

Достаточно одного пробела

Пробелы — это пробелы, если только вы не компилятор, а табуляция и пробел — это два отдельных символа ASCII. Чтобы иметь вескую причину выбрать два символа, которые означают одно и то же, но отображаются по-разному на компьютере, вам нужно доказать, по крайней мере мне, что есть разница в семантике между табуляцией и двумя пробелами. Это равносильно тому, чтобы сказать:

«Этот белый цвет отличается от другого белого цвета»

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

Выберите пространства

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