Page 1 of 7

Правила оформления кода

Posted: Fri Oct 07, 2011 2:52 pm
by CleverMouse
В исходных текстах ядра /kernel/trunk творится полнейший бардак в плане оформления. Иногда доходит до того, что в соседних строчках одного и того же файла используются разные отступы. Это затрудняет чтение кода, затрудняет написание кода и вообще производит впечатление откровенного разгильдяйства. Поэтому я ввожу единые правила оформления на уровне svn-репозитория - svn-сервер будет просто отклонять коммиты, выполнение которых означало бы появление в kernel/trunk файлов *.asm или *.inc, нарушающих оформление. Естественно, сервер будет выдавать пояснение со ссылкой на эту тему форума. Ограничения появятся через неделю, я думаю, что за неделю правила вполне можно обсудить.

Правила, естественно, должны быть машинно-проверяемыми. Всё вышесказанное обсуждению не подлежит. Сами правила можно обсуждать, для начала предлагаются следующие правила.
1. Символы табуляции запрещены. Основание: возможность и табуляции, и пробелов, - главная причина несущественных изменений на svn типа r2257, когда большинство изменений, показываемых svn, в действительности вызваны автоматическим переформатированием кода редактором. Требовать табуляцию вместо пробелов чревато тем, что код будет нормально смотреться только при строго определённой настройке просмотрщика.
2. Метки должны идти в отдельной строке от кода. Основание: при этом не нужно вводить разницу между длинными и короткими метками; при необходимости дописать код сразу после метки svn-изменения будут затрагивать только дописанные строчки, а не старый код.
Поправка от 28 мая 2013: метки могут быть в одной строке с данными.
3. Оформление команд. Строка начинается с восьми пробелов. Далее идёт имя мнемоники или макроса. Команды распознаются по известной мнемонике, список можно взять из фасма, или макросу stdcall/ccall/invoke/cinvoke. Если имя короче восьми символов, то оно дополняется пробелами до восьми символов; если нет, то далее идёт один пробел. Потом опционально идут аргументы, разделённые запятой с пробелом. Если это макрос и аргументов много или они длинные, то строка может заканчиваться - с точностью до пробелов и комментариев - символом \, после чего аргументы продолжаются на следующей строке с той же позиции, где они начались в первой строке. Основание, почему именно 8: в эту длину укладываются все часто используемые мнемоники и относительно частый макрос stdcall.
4. Префиксы lock/rep[z|e|nz|ne] к команде, если они есть, считаются логическим целым с последующей мнемоникой, отделённой одним пробелом, так что начинаются с позиции 8, где и обычные команды.
5. Все файлы с кодом должны обладать служебным свойством 'svn:eol-style' со значением 'native', чтобы svn автоматически ставил переводы строк так, как принято в ОС, где он запущен.
6. Все файлы с кодом и текстом должны быть в кодировке UTF-8 без BOM.

На прочие элементы - глобальные переменные, глобальные переменные в {i|u}global/endg, локальные переменные, члены структур, константы, объявления макросов и так далее - ограничений нет.

Active rules for all *.asm and *.inc files in kernel/trunk and all subdirectories:
1. No tab characters allowed.
2. Code labels must be on a separate line. It is not allowed to have a label and a command on the same line. Combinations of label and data in one line is allowed.
3. Lines with commands must start with 8 spaces. A mnemonic is short if it's length is less than 8. Arguments for short mnemonics must start in the column 16. Arguments for long mnemonics must be separated from the mnemonic by exactly one space. Arguments must be separated with a comma and exactly one space after a comma. Arguments continued in the next line must start from the same position as in the first line.
4. Prefixes lock/rep[z|e|nz|ne] are considered as a logical part of the command, so they start at position 8, then after exactly one space follows the main mnemonic and arguments.
5. The special property 'svn:eol-style' must be set to 'native'.
6. All code and text files should be in UTF-8 without BOM.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 2:56 pm
by Leency
Для меня нагляднее были бы примеры...

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 3:05 pm
by Mario
Замечательно! П.1 Я соблюдать не собираюсь - требование не использовать табуляцию это абсурд. Почему нельзя настроить табуляцию на границу 8 пробелов я откровенно не понимаю, но это царское решение походу обсуждению не подлежит.
Все остальные пункты меня не ущемляют, но если П.1 останется "AS IS", то я пожалуй пойду строить свой лунапарк.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 3:11 pm
by lev
Если сервер может проверять корректность оформления кода, то может ли он автоматом приводить некорректные к "правильному" оформлению? Т.е. взять эту функцию на себя.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 3:13 pm
by art_zh
Очень прошу не распространять нововведения на бранчи.
Хотя бы на один из них.
У себя я сам как-нибудь порядок наведу, без svn-роботов.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 3:14 pm
by CleverMouse
Mario, "Почему нельзя настроить табуляцию на границу 8 пробелов" - потому что это ущемляет тех, у кого табуляция настроена на 4 пробела.
"это царское решение походу обсуждению не подлежит." - всё, что после соответствующей фразы, подлежит обсуждению.
lev, нет. В svn коммит либо проходит "как есть", либо вообще не проходит. Вариант "пропускать неправильный коммит, но тут же нормализовывать от имени робота" не годится, поскольку не решает проблемы мусорных изменений.

Ещё раз: на репозиторий вне kernel/trunk правила не распространяются.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 3:20 pm
by Mario
Ога, присутствуют взаимпоисключающие параграфы: табуляция ущемляет права тех кто ей пользуется (они же идиоты и не знают как ее правильно настроить, потому и пользуются), потому мы отменяем табуляцию в принципе! Красота! Заставим всех пользоваться пробелами, а тех кто не согласен не пустим - синдром вахтера еще к тому же присутствует.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 4:31 pm
by Serge
Запрет на табуляцию поддерживаю. lock должен идти с отступом 8 знаков как и обычные команды. Без отступа только метки. lock меткой не является.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 5:16 pm
by SoUrcerer
А есть какие-нибудь редакторы, которые по enter делают 8 пробелов? Или по tab? (Кроме emacs/vim, в которых можно повесить хоткей или настроить вид документа)

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 6:12 pm
by XVilka
Да, поскольку это касается в основном ядра, предлагаю вынести репозиторий ядра в отдельный реп.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 6:30 pm
by SII
Насчет табуляций CleverMouse абсолютно права: просмотр текста с табуляциями возможен только при правильной их настройке, что как минимум неудобно, ну а с пробелами отображение правильно всегда и везде. Lock, думаю, не должен отли чаться от других префиксов. Метки - имхо, отдельной строкой только "осмысленные" (например, имена подпрограмм), а "числовые" (мелкие циклы, условные операторы) - в одной строке с инструкцией.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 6:37 pm
by IgorA
А что если программист захочет внести изменения в файл в котором будет много другого ранее неотформатированного кода, тогда ему прийдется перед своей правкой форматировать полностью весь файл?
Думаю что подобные действия по форматированию должна выполнять какая нибудь программа наподобие ВебЛомастера.
"ВебЛомастер" - программа для преобразования HTML-файлов
к виду, удобному для их просмотра без подключения к Интернету
Если подобной программы для asm файлов нет, прийдется написать самим, т. к. порядок в будущем может понадобится и в других местах.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 6:39 pm
by XVilka
в git есть режим коммита, без включения whitespaces. Может и в svn такое есть?

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 6:49 pm
by CleverMouse
Требование отступа для lock принимается.
SoUrcerer, вроде все сколько-нибудь приличные редакторы поддерживают автоотступ, при котором при нажатии Enter дублируют отступ, бывший в начале, и если там были пробелы, то и после Enter появятся пробелы. По tab, опять же, все сколько-нибудь приличные редакторы имеют настройку типа "конвертировать табы в пробелы" с указанием размера табуляции.
Кроме того, можно сконвертировать табуляцию в пробелы непосредственно перед коммитом; если этого не позволяет сделать основной редактор - что само по себе странно - то можно использовать expand -t8 < input > output, для винды expand есть здесь.
XVilka, это слишком радикально и непонятно, зачем нужно.

Re: Правила оформления кода

Posted: Fri Oct 07, 2011 6:49 pm
by Foldl
SoUrcerer wrote:А есть какие-нибудь редакторы, которые по enter делают 8 пробелов? Или по tab? (Кроме emacs/vim, в которых можно повесить хоткей или настроить вид документа)
Да. Например Geany (по tab). Поддерживает автозамену табуляций пробелами, можно выставить размер отступа, может автоматически удалять пустые символы в конце строк. В целом довольно прост чтобы называться IDE.