LINUX.ORG.RU
ФорумTalks

Tabs vs Spaces: что по этому поводу думают linux kernel hackers

 , , , ,


1

4

Давненько тут не было холиваров по поводу извечного спора «табы или пробелы?..»

Залез тут давеча в исходники ядра и увидел, что отступы сделаны табами размером 8 символов (как и рекомендует code style), но при выравнивании аргументов функции иногда используется mix табов и пробелов, например, тут (drivers/cpufreq/cpufreq_conservative.c):

static ssize_t ignore_nice_load_store(struct gov_attr_set *attr_set,                                                                                                                         
<------><------><------><------>      const char *buf, size_t count)

Т.е. те, кто аргументируют преимущество табов возможностью самому настраивать длину таба, получат плохое выравнивание, например, в случае tab == 4 spaces:

static ssize_t ignore_nice_load_store(struct gov_attr_set *attr_set,                                                                                                                         
<--><--><--><-->      const char *buf, size_t count)                                                                                                                                    

Так почему же длина табов должна быть равна 8 пробелам?.. По мнению разработчиков ядра, вот почему:

Tabs are 8 characters, and thus indentations are also 8 characters. There are heretic movements that try to make indentations 4 (or even 2!) characters deep, and that is akin to trying to define the value of PI to be 3.
In short, 8-char indents make things easier to read, and have the added benefit of warning you when you're nesting your functions too deep. Heed that warning.

Почему в этом случае табы всё равно предпочтительнее пробелов?.. Разработчики ядра скромно умалчивают:

Outside of comments, documentation and except in Kconfig, spaces are never used for indentation, and the above example is deliberately broken.

Помимо описания проблемы выравнивания, в code style ядра содержатся также много других лулзов, в частности:

However, there is one special case, namely functions: they have the opening brace at the beginning of the next line...
Heretic people all over the world have claimed that this inconsistency is ... well ... inconsistent, but all right-thinking people know that (a) K&R are right and (b) K&R are right. Besides, functions are special anyway (you can't nest them in C).

В старых версиях code style (например, 4.10) также присутствовало следующее утверждение:

Encoding the type of a function into the name (so-called Hungarian notation) is brain damaged - the compiler knows the types anyway and can check those, and it only confuses the programmer. No wonder MicroSoft makes buggy programs.

Потом упоминание мелкософта убрали, видимо, под давлением корпораций... :)

Итак, лет зе холивар бегин: что лучше, фиксированные табы длиной 8 или пробелы?..

P.S. Кстати, последний опрос по этому поводу был аж 10 лет назад, можем повторить :) Tabs vs. Spaces

★★★★☆

Последнее исправление: Sahas (всего исправлений: 2)
Ответ на: комментарий от EXL

Она включается когда нужно посмотреть, в чём там траблы с разметкой.

Нет табов — нет траблов. Что может быть проще?

полезно и для пробелов, понять сколько их

Звучит как проблемы сениор ямл девелоперов %)

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

Нет табов — нет траблов. Что может быть проще?

C пробелами я не могу сделать отступы в 2 или 8 знакомест не изменяя код, а с табами легко. Ими просто нужно уметь пользоваться.

EXL ★★★★★
()
Ответ на: комментарий от EXL

Для меня это прежде всего скорость навигации слева от строки: одна стрелка влево-вправо – один отступ.

А кто там что будет настраивать – проблемы индейцев меня не колышат: 1 tab = 4 spaces и точка.

dimgel ★★★★★
()

В старых версиях code style (например, 4.10) также присутствовало следующее утверждение:

Encoding the type of a function into the name (so-called Hungarian notation) is brain damaged - the compiler knows the types anyway and can check those, and it only confuses the programmer. No wonder MicroSoft makes buggy programs.

Потом упоминание мелкософта убрали, видимо, под давлением корпораций... :)

Глянул, как это было (11.02.2021). Якобы, кто-то взял и убрал упоминание:

Yorick de Wid (ydewid /at/ gmail [dot] com):There is no need to need to name Microsoft. The point is clear without that context.

Jonathan Corbet: Yeah, the time for that has probably passed. Applied, thanks.

https://lore.kernel.org/all/87wnvepn9p.fsf@meer.lwn.net/

«docs: Remove the Microsoft rhetoric» (kernel.org, github.com mirror).

А упоминание это было закомичено давным-давно ещё до «Linux-2.6.12-rc2 Initial git repository build.» (17.04.2005) (kernel.org, github.com mirror).

gag ★★★★★
()
Последнее исправление: gag (всего исправлений: 2)
Ответ на: комментарий от EXL

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

Так я об этом и написал, про экономию байтов только в постскриптуме добавил.

CrX ★★★★★
()
Ответ на: комментарий от EXL

C пробелами я не могу сделать отступы в 2 или 8 знакомест не изменяя код, а с табами легко.

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

Особенно весело, когда ты не контролируешь все настройки просмотрщика, например, смотришь PR/MR на гитхаболабе. В итоге ты пушишь аккуратный кот, а ревьюеры видят кучу овна неизвестно что.

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

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от Nervous

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

Нет, ты всё неправильно понял. Если файл размечен правильно – TAB’ы использовались для отступов, а пробелы для выравнивания, то ты можешь менять ширину отступов в таком файле по своему усмотрению и удобству. К примеру, разбить экран вида «танковая щель» на 4 вертикальных сплита, а чтобы исходный текст влазил в колонки сделать отступы по 2 символа, а не 8.

когда ты не контролируешь все настройки просмотрщика, например, смотришь PR/MR на гитхаболабе.

Внезапно: https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-user-account-settings/managing-your-tab-size-rendering-preference

Фича и функциональность Гитхаболабов, которой «пробелоотступающие» лишены.

EXL ★★★★★
()
Unicode	HTML	Description	
U+0020	&#32	Space	                
U+00A0	&#160	No-Break Space	        
U+2000	&#8192	En Quad	                
U+2001	&#8193	Em Quad	                
U+2002	&#8194	En Space	        
U+2003	&#8195	Em Space	        
U+2004	&#8196	Three-Per-Em Space	
U+2005	&#8197	Four-Per-Em Space	
U+2006	&#8198	Six-Per-Em Space	
U+2007	&#8199	Figure Space	
U+2008	&#8200	Punctuation Space	
U+2009	&#8201	Thin Space	
U+200A	&#8202	Hair Space	
U+2028	&#8232	Line Separator	
U+205F	&#8287	Medium Mathematical Space	
U+3000	&#12288	Ideographic Space	

а ведь можно было бы и это впендюрить.

olelookoe ★★★
()
Ответ на: комментарий от soomrack

в коде не должно быть символов, которые редактор отображает одинаково

echo «мaмa мылa рaму» Уже запрещено? И докину. Если у вас 'a' и 'а' отображаются одинаково, то это не вина редактора. У Вашего коллеги Миши они могу отображаться по разному.

anc ★★★★★
()
Ответ на: комментарий от anc

Ничего не запрешено, все есть добровольный выбор каждого.

Да, я считаю, что это плохо. Поэтому я придерживаюсь правила, что не-ASCII символы допустимы только в комментариях.

Так же для кодинга стараются выбирать шрифты с явно отличающимися символами: O vs 0, 1 vs l, и т.п.

soomrack ★★★★★
()
Ответ на: комментарий от CrX

Табы (хоть в коде, хоть вообще в принципе как псевдосимвол) — какой-то пережиток из дремучих времён

Усё ведро из дремучих времен.

Экономить по 3 байтика размера исходников на уровень отступа — какой-то маразм.

Дело не в экономии батиков, таб одна кнопочка. Плюс возможность изменять «размер» таба, можно же и на один символ настроить.

Но таки в целом я вас поддерживаю, тоже к пробелам привык благо всякие редакторы кода ещё давно научились :)

anc ★★★★★
()
Ответ на: комментарий от Nervous

В сочетании с ограничением в 80 символов в строке может быть способом умерить пыл любителей глубокой вложенности.

Вот кстати да, правильно напомнили.

anc ★★★★★
()
Ответ на: комментарий от Sahas

In short, 8-char indents make things easier to read, and have the added benefit of warning you when you're nesting your functions too deep

Сомнительное преимущество.

anc ★★★★★
()
Ответ на: комментарий от soomrack

Так же для кодинга стараются выбирать шрифты с явно отличающимися символами: O vs 0, 1 vs l, и т.п.

Об этом и речь. А вы написали:

Что «в коде не должно быть символов, которые редактор отображает одинаково»

Такого не получится везде, это у каждого индивидуально.

anc ★★★★★
()

tabs.

а вообще стОит конечно в прожЭкте настроить переформатирование при коммите или как это там правильно делается.

mrjaggers
()
Последнее исправление: mrjaggers (всего исправлений: 1)
Ответ на: комментарий от anc

Усё ведро из дремучих времен.

Несомненно. Да и нет смысла в нём что-то менять в этом плане. Но ориентировать на него — тоже так себе идея. Это не тот случай, где авторитеты дремучих времён должны служить основой. Лучше в плане алгоритмов у них поучиться, а не как код оформлять.

таб одна кнопочка

Кнопочка никуда не девается, все нормальные редакторы умеют ставить нужное количество пробелов по этой кнопочке.

Плюс возможность изменять «размер» таба, можно же и на один символ настроить.

Об этом и был мой коммент до P.S., что другой их аргумент противоречит этому, казалось бы, главному.

CrX ★★★★★
()
Ответ на: комментарий от anc

Сомнительное преимущество

Доля истины тут есть, поскольку слишком большая вложенность действительно может стать источником проблем и ошибок в дальнейшем. В любом случае, мопед не мой, так пишут настоящие хакеры :)

Sahas ★★★★☆
() автор топика
Ответ на: комментарий от dimgel

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

MoldAndLimeHoney
()
Ответ на: комментарий от MoldAndLimeHoney

В данном конкретном случае C++ не при чём; подобный стиль форматирования вложенных скобок я на любом языке могу изобразить.

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

dimgel ★★★★★
()
Ответ на: комментарий от Sahas

В приведённом примере как следовало бы выровнить аргументы функции?

«Выровнять» — это «align». Стало быть, пробелами:

static ssize_t ignore_nice_load_store(struct gov_attr_set *attr_set,                                                                                                                         
                                      const char *buf, size_t count)

Если вся декларация находится на ненулевом уровне вложенности, то уровень вложенности задаётся табами, а выравнивание — по-прежнему пробелами:

class Foo {
<-->static ssize_t ignore_nice_load_store(struct gov_attr_set *attr_set,                                                                                                                         
<-->                                      const char *buf, size_t count)
};
intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от CrX

Лучше в плане алгоритмов у них поучиться,

Несомненно.

а не как код оформлять.

И этому тоже.

anc ★★★★★
()

Я за табы длиной 4. 8 слишком много места уходит в коде большой вложенности, а 2 плохо читается.

Хотя, глянул сейчас с один из проектов, а там пробелы(QtCreator так настроен). Понятно, что ставлю я их табом(4 за раз), но пробелы.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от EXL

Внезапно: https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-user-account-settings/managing-your-tab-size-rendering-preference

То есть как только начинается взаимодействие с другими людьми, возникает необходимость выбрать какой-то один размер таба и верстать свой кот с учётом этого — чтобы у всех выглядело одинаково.

И где теперь ваша флексибилити, которая призвана перевесить постоянные головняки от сортировки нескольких видов пустого места вручную? %) Её нет, остались только чистые головняки. Пробелы же дают одинаковость из коробки и совершенно бесплатно, без каких-либо трудозатрат и побочных эффектов*.


* если не считать за такой эффект попоболь от нескольких несэкономленных байтиков

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от Nervous

То есть как только начинается взаимодействие с другими людьми, возникает необходимость выбрать какой-то один размер таба и верстать свой кот с учётом этого — чтобы у всех выглядело одинаково.

Ты опять всё неправильно понял. Нет абсолютно никакой необходимости верстать свой код с каким-то одним заданным размером таба и согласовывать это с другими людьми, если все эти люди умеют пользоваться TAB’ом и строго следуют правилу «TAB’ы для отступов, пробелы для выравнивания».

Напротив, использование TAB’ов вместо пробелов располагает пользователя к удобству и настройке – у одного разработчика отступы могут быть в 2 знака, у другого в 4, у третьего в 8, но кодовая база у всех них будет едина.

Пробелы же дают одинаковость из коробки и совершенно бесплатно, без каких-либо трудозатрат и побочных эффектов*.

Пробелы дают захардкоженность отступов. Если я захочу изменить размер отступа в случае различных мониторов вида «танковая щель» и кучи сплитов, то с табами я приведу код к удобному мне виду в два счёта, а с пробелами я получу кучу головняка в виде ручного изменения размеров отступов 4 => 2 и обратно, и какого-нибудь случайного коммита, при котором у всех участников репозитория в одном файле отступы станут в 2 пробела.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)

Т.е. те, кто аргументируют преимущество табов возможностью самому настраивать длину таба, получат плохое выравнивание, например, в случае tab == 4 spaces:

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

Tabs are 8 characters, and thus indentations are also 8 characters. There are heretic movements that try to make indentations 4 (or even 2!) characters deep, and that is akin to trying to define the value of PI to be 3.

Я выступаю за два пробела в табе.

X512 ★★★★★
()
Ответ на: комментарий от Nervous

То есть как только начинается взаимодействие с другими людьми, возникает необходимость выбрать какой-то один размер таба и верстать свой кот с учётом этого — чтобы у всех выглядело одинаково.

Если руки у тех кто писал код не из жопы, то не возникает.

X512 ★★★★★
()

фиксированные табы длиной 8 или пробелы?..

Код с табами длиной 8 пробелов обычно означает что это копролит или писался в окружении/под влиянием дедов и лучше стоит держаться от него подальше.

X512 ★★★★★
()

PEP8</thread>

etwrq ★★★★★
()
Ответ на: комментарий от X512

Если руки у тех кто писал код не из жопы

Может, вместо искусного жонглирования различными видами пустого места заняться чем-то полезным? Да не, бред какой-то.

Nervous ★★★★★
()
Ответ на: комментарий от X512

Код с табами … обычно означает что … лучше стоит держаться от него подальше.

Выделил суть, не благодари.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от X512

табы должны использоваться исключительно для индентации, а всякие … выравнивания … через пробелы

То есть здесь я должен использовать таб во второй строке и пробелы в третьей? А если я поменяю количество пробелов в табе с двух на четыре — что станет с отступом в третьей строке?

Допустим, я использую в третьей строке табы, как мне оттабить 10 пробелов табами шириной 4 пробела? Добавить пробелов? А если сменить таб обратно на два пробела?

(defn dot [v1 v2] 
  (reduce +  
          (map * v1 v2))

Ради чего я должен морщить лоб с табами? Чтобы что?

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 3)
Ответ на: комментарий от X512

<tab>(reduce +
<tab> (map

Здесь так не принято.

Если кратко, то аргументы, перенесённые на следующую строку, или имеют фиксированный отступ

(op
  1
  2
  3)

или выравниваются по первому аргументу

(op 1
    2
    3)

Плюс у отдельных специальных форм/макросов могут быть разные отступы для разных аргументов (distinguished and ordinary arguments), для улучшения читабельности:

(when
    1
  2
  3)

Табы тут не просто мелкое неудобство, а натурально заноза в заднице.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 4)
Ответ на: комментарий от Nervous

Что касается сей: емакс по умолчанию делает с параметрами так

int foo(int a, int b, int c,
        int d)
{}

То есть отступ int d зависит от длины идентификатора foo и не может быть выровнен для произвольной ширины отступа.

Шо делать-то? Тупа табить любой перенос строки?

int foo(int a, int b, int c,
  int d)
{}
Nervous ★★★★★
()
Ответ на: комментарий от Nervous

Шо делать-то? Тупа табить любой перенос строки?

Да, именно так. И не страдать с ненужным выравниванием повсюду, которое потом замучаешься поддерживать при правках.

X512 ★★★★★
()
Ответ на: комментарий от Nervous

Лисп нечитабелен и неписабелен по определению. Эзотерический язык. Там даже арифметические выражения по человечески писать нельзя.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Да, именно так

То есть тебе второй вариант сишного примера больше по нраву? %)

И не страдать с ненужным выравниванием повсюду

Страдать не нужно, редактор сам всё делает.

Nervous ★★★★★
()
Ответ на: комментарий от X512

Там даже арифметические выражения по человечески писать нельзя

По-человечески — это не больше двух операндов на операцию и зубрить наизусть приоритеты операций? Ну такое.

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

Ну да, человеки они такие 🤷 У котов может по другому. Предлагаете все математические пособия переписывать?

X512 ★★★★★
()
Ответ на: комментарий от Nervous

По хорошему текстовый редактор должен сам переносы делать в зависимости от ширины окна и увеличивать индентацию при автоматическом переносе. Тогда вообще можно не переживать о длине строки. Notepad++, Xcode так умеют.

X512 ★★★★★
()
Последнее исправление: X512 (всего исправлений: 1)
Ответ на: комментарий от X512

Предлагаете все математические пособия переписывать?

А чо, пусть личинусы сразу Схему ботают, в жызни пригодится.

Nervous ★★★★★
()

что отступы сделаны табами [..], но при выравнивании аргументов [..] используется mix табов и пробелов

Всё правильно: tabs for indentation, spaces for alignment.

beastie ★★★★★
()
Ответ на: комментарий от X512

текстовый редактор должен сам переносы делать и увеличивать индентацию при автоматическом переносе

Отэто будет каша так каша, всем кашам каша. С другой стороны, компилятору ведь всё равно, так ведь? %)

Nervous ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)