Разработчики из компании Google анонсировали (http://google-opensource.blogspot.ru/2015/01/format-code-eas...) новый открытый проект vim-codefmt (https://github.com/google/vim-codefmt), в рамках которого подготовлена утилита для автоматической расстановки отступов и форматирования кода с учётом синтаксиса используемого языка программирования. Утилита может использоваться как плагин для обеспечения форматирования кода в редакторе Vim. Поддерживаются две команды ":FormatLines" для форматирования диапазона строк и ":FormatCode" для форматирования буфера целиком. Обеспечена поддержка языков C++, JavaScript, Protocol Buffers и Go.
Например, при использовании vim-codefmt строк<font color="#461b7e">
int foo(int * x) { return * x** x ; }
</font>
будет переоформлена в<font color="#461b7e">
int foo(int* x) { return *x * *x; }
</font>
URL: http://google-opensource.blogspot.ru/2015/01/format-code-eas...
Новость: http://www.opennet.me/opennews/art.shtml?num=41524
10 человек, которые пишут код, могут форматировать код 10 вариантами, и ни один из вариантов не может являтся тождественно истинным.
Да никому и не нужен "истинный" код (это программирование, а не код давинчи).
Нужен единообразный.
Че к чему заминусовали. Если человек пишет всю жизнь
test() {
}
То почему его могут заставлять писать
test()
{
}
По мне так, форматирование, это как почерк, имеет право отличаться.
если пишешь для себя, то можешь писать хоть
test (
) {
}
а если в проекте даже всего несколько человек, то будь добр, соблюдай принятые соглашения о форматировании. Иначе код превратится в невразумимое нечто.
Уважаемые энтерпрайз проектанты, откройте для себя uncrustify, artictic style и им подобных и не мучайте народ :)
Профессионал должен моч писать любым почерком. Каким надо таким и писать без проблем и притензий
Профессионал должен не только моч, но и умет!
Каким притензий надо таким и моч!
не имеет. В нормальных языках прописано как надо форматировать код.
Если ты пишешь только для себя то да, все равно. А если несколько человек пишут то получится мешанина из разных способов форматирования.
> По мне так, форматирование, это как почерк, имеет право отличаться.ага, в большом проекте с кучей людей. и отступы пусть каждый использует, какие привык -- кто таб, кто четыре пробела, кто два, кто пять. а функции myTest1, my_test2 и MyTest3 в одном файле не хотите? да так, чтобы одна из них бросала exception, вторая возвращала return code, третья -- писала в глобальную переменную? индивидуальность программиста же.
увидите как-нибудь такое на практике -- поймёте, зачем создали style guide для проектов.
> По мне так, форматирование, это как почерк, имеет право отличаться.Представления не имею, как выглядят почерки моих коллег на работе.
Уже давно предлагать кому бы то ни было рукописный текст - моветон.
Разбираться в чужом почерке также неприятно, как и в нестандартно отформатированном коде.
Не просто единообразный, а именно того вида, что принят в данной команде/сообществе. При этом в другой команде может быть принято совсем другое оформление. Инструмент форматирования должен такое учитывать и позволять гибкие настройки. Пример хорошего форматировщика - perltidy. В пример плохого надо ткнуть пальцем или и так понятно?
> При этом в другой команде может быть принято совсем другое оформление.
> ...
> Пример хорошего форматировщика - perltidy. В пример плохого надо ткнуть пальцем или и так понятно?Может пример про трусы не придётся приводить, а?
Есть сабж. В этой команде принято так. И другого нет.
Хочешь — пользуйся. Не хочешь — не пользуйся.
Никто соцобязательств по предоставлению вашего форматирования для вашей же команды (которой вообще нет) на себя не брал.
Питонист штoле? Альтернативы его пугают.
судя по докам настраивается это чуть меньше чем никак
Ну по крайней мере пример из статьи сформатирован единственным верным способом. Если других косяков не будет, это и настраивать не нужно. Интересно как оно многострочные инициализаторы в конструкторах форматирует.
> единственным верным способом
> int* xПади подмойса, маня.
> судя по докам настраивается это чуть меньше чем никакв этом суть: они хотят одинаковости.
видимо, анализаторы кода делают, ии варганят, etc. ии не умеет разнотипный код читать.
идиот, анализ кода всегда работает с AST или прочими деревьями.
>ии не умеет разнотипный код читать.Если тот ии делаете ты - то не удивительно.
А разработчики компилеров сделали который умеет ... что то около 60 лет назад 8-)
>int* xпочему не int *x?
>>int* x
> почему не int *x?Потому что * это часть описания типа. Только не надо про int* x, y; - так делают только имбецилы.
>Потому что * это часть описания типа.Эта ошибка понимания сути указателей в СИ. Указатель - не новый тип. Данную строку необходимо писать int *x и читать ИКС есть УКАЗАТЕЛЬ на переменную ТИПА int.
> Эта ошибка понимания сути указателей в СИ. Указатель - не новый тип.
> Данную строку необходимо писать int *x и читать ИКС есть УКАЗАТЕЛЬ
> на переменную ТИПА int.А void* - указатель на переменную типа void? Не выдумывайте. Переменная - это значение в памяти, у значения есть тип. Этот тип - int*.
>А void* - указатель на переменную типа voidИменно так, аналогично как функция void fun() возвращает значение void.
>Переменная - это значение в памяти, у значения есть тип.Перменная это понятие языка программирования и к памяти не имеет никакого отношения.
>Этот тип - int*.Вас не беспокоит тот факт, что все указатели занимают в памяти 4 байта (8 на 64 битных системах)?
> Именно так, аналогично как функция void fun() возвращает значение voidЗначение можно присвоить переменной. Присвой, потом поговорим.
> Перменная это понятие языка программирования и к памяти не имеет никакого отношения.
О, даже так. Запущенный случай.
>>Этот тип - int*.
> Вас не беспокоит тот факт, что все указатели занимают в памяти 4
> байта (8 на 64 битных системах)?Не беспокоит, а вас? Хотите рассказать о том что делаете выводы о типе и семантике по размеру значения?
почитайте кернигана и ричи, не напрягайте себе нервный узел лишний раз.
> почитайте кернигана и ричи, не напрягайте себе нервный узел лишний раз.Ссылку на конкретное место.
>Значение можно присвоить переменной. Присвой, потом поговорим.Переменная может быть определена без данных, см http://en.wikipedia.org/wiki/C_syntax#Incomplete_types
>О, даже так. Запущенный случай.
Запущенный случай это невозможность построить в голове такие абстракции как переменные языков программирования. Сколько памяти займёт в JS переменная x, объявленная как var x = 5?
>Не беспокоит, а вас? Хотите рассказать о том что делаете выводы о типе и семантике по размеру значения?
Размер значения и семантика совпадает, поскольку указатели не имеют никакого отношения к типам данных
> Переменная может быть определена без данных, см http://en.wikipedia.org/wiki/C_syntax#Incomplete_typesИ?
> Запущенный случай это невозможность построить в голове такие абстракции как переменные
> языков программирования. Сколько памяти займёт в JS переменная x, объявленная как
> var x = 5?При чём здесь JS?
> Размер значения и семантика совпадает, поскольку указатели не имеют никакого отношения
> к типам данныхЕсли бы указатели не имели отношения к типам данных, их можно было бы кастовать куда и откуда угодно, например из/к float'ам.
#include <stdio.h>int main() {
void *p = (void *)10;
printf("%f\n", (float)(long int)p);
}
> При чём здесь JS?При том, что ты не понимаешь, что такое абстракция вообще и "переменные языков программирования" в частности. Вместо JS может быть другой язык, а понятие переменной останется тем же, хотя реализация на низком уровне может отличатся.
>>А void* - указатель на переменную типа void
> Именно так, аналогично как функция void fun() возвращает значение void.
>>Переменная - это значение в памяти, у значения есть тип.
> Перменная это понятие языка программирования и к памяти не имеет никакого отношения.
>>Этот тип - int*.
> Вас не беспокоит тот факт, что все указатели занимают в памяти 4
> байта (8 на 64 битных системах)?А вас не беспокоит, что вы нихера не знаете, но берете смелость утверждать. Указатель вполне может быть больше 8ми байт, смотря на что он указывает.
Он прав. Но int* x; мне всеравно нравится больше.
> Он прав. Но int* x; мне всеравно нравится больше.Он не прав. А нравится вам потому что хоть вы и не знаете основ языка, вам не чужда логика, а в соответствии с ней язык и разработан.
>> Он прав. Но int* x; мне всеравно нравится больше.
> Он не прав. А нравится вам потому что хоть вы и не
> знаете основ языка, вам не чужда логика, а в соответствии с
> ней язык и разработан.Логику разрабатывали бородатые дяди Керниган, Ричи и Томпсон, два первые написали для вас книжку, которую вы не потрудились почитать, при этом учите всех программировать на си!
> Логику разрабатывали бородатые дяди Керниган, Ричи и Томпсон, два первые написали для
> вас книжку, которую вы не потрудились почитать, при этом учите всех
> программировать на си!Это вы её не читали, потому что на конкретное место не укажете. А я-то как раз читал, поэтому сразу говорю что такого бреда там нет.
Как нет? откройте любой пример кода в книге - там везде int *x;Вот первое попавшееся на стр. 232 (издание с синей обложкой):
Dirent *dp;
DIR *dfd;это вашего маразма int* x, y там нет и никогда не будет - адекватные люди так не пишут.
Вы наверно ещё и емакс используете? :)
Воу-воу! Использую емакс, но пишу int *x;
> вам не чужда логика, а в соответствии с ней язык и разработанА вы не применяйте логику java к C, все и встанет на свои места.
С чего, собственно, он прав?
На уровне машинного кода один указатель от другого ничем не отличается.
Поэтому, собственно, С и позволяет менять ему тип.
Тип переменной, на которую он указывает - это просто информация для компилятора, какого размера область памяти должна лежать в этом месте и к какому типу ее приводить при разыменовании указателя.
> С чего, собственно, он прав?
> На уровне машинного кода один указатель от другого ничем не отличается.Вы мимо, потому что на уровне машинного кода указатель не отличается также от long и вообще чего угодно что влезает в регистр. В машинном коде вообще нет типов.
Однако в машинном коде встречается обращение к памяти по адресу, записанному в регистре.
Если этот набор битов используется в коде так - это не long, а именно указатель.
> Однако в машинном коде встречается обращение к памяти по адресу, записанному в
> регистре.
> Если этот набор битов используется в коде так - это не long,
> а именно указатель.Спасибо, поржал. Есть такое словосочетание - адресная арифметика.
Ну, хоть какая-то польза. А при чем здесь адресная арифметика? Результат-то все равно потом будет использоваться для доступа к адресованной этим значением ячейке памяти.
> Ну, хоть какая-то польза. А при чем здесь адресная арифметика? Результат-то все
> равно потом будет использоваться для доступа к адресованной этим значением ячейке
> памяти.Ну представьте себе, дорогой Тоже, машинный код, описываемый псевдокодом
double z[20] = {.....};
long i;for( i = 0; i < 20; i++)
printf( "%ld -> %lf\n", i, z + i);Как несложно догадаться, согласно вашей логике в последней строке переменная i одновременно имеет числовой тип long, и тип указателя double *.
Так. Представил. И в какой машинный код это скомпилируется, тоже примерно представил.
Указатель в этом коде по-прежнему не используется ни для каких иных целей, кроме обращения к адресованной им ячейке памяти.
int* x, y;И привет логика!
> Переменная - это значение в памяти, у значения есть тип.Интересно, что Вы запоёте, когда столкнётесь с компилируемыми динамически типизированными языками программирования.
К слову, чем поддерживать порочный круг взаимных обвинений в безграмотности, я взялся бы утверждать, что переменная - это сущность, способная менять значение. Этой сущности может быть поставлен в соответствие символ. Символы можно сравнивать между собой в строгом и нестрогом смысле.
(предлагаю желающим продолжить эстафету и изложить здесь элементы структуры и интерпретации компьютерных программ)
:)
>>Потому что * это часть описания типа.
> Указатель - не новый тип.Что ещё придумаешь?
6.2.5.20, Pointer type
>необходимо писать int *x и читать ИКС есть УКАЗАТЕЛЬЧепуху написали. икс это имя указателя, а указатель с именем x на переменную типа int как раз и будет int* x. Если не понимаете, подставьте вместо икса собственное имя и подумайте.
> Чепуху написали. икс это имя указателя, а указатель с именем x на
> переменную типа int как раз и будет int* x. Если не
> понимаете, подставьте вместо икса собственное имя и подумайте.Всё верно, только int *x
Вот поэтому вы в гугле и не работаете. xD Правда, я тоже.
Но мне хоть не придётся для использования этого плагина переучиваться.
> Потому что * это часть описания типаКурите ISO/IEC 9899, пункт A 2.2. Там указано, часть чего это.
> Только не надо про int* x, y
Надо-надо. Была бы * частью описания типа - семантика такого объявления была бы другой.
>> Потому что * это часть описания типа
> Курите ISO/IEC 9899, пункт A 2.2. Там указано, часть чего это.
>> Только не надо про int* x, y
> Надо-надо. Была бы * частью описания типа - семантика такого объявления была
> бы другой.Грамматика языка к системе типов не относится ну совершенно никак.
А кто говорит про систему типов? В треде обсуждается грамматика, а именно синтаксис объявлений.
>Грамматика языка к системе типов не относится ну совершенно никак.Самое смешное сообщение на опеннете за последнюю неделю.
> >int* x
> почему не int *x?скорее всего потому, что так пишет Поттеринг.
http://www.stroustrup.com/bs_faq2.html#whitespace
> http://www.stroustrup.com/bs_faq2.html#whitespaceПравильно. /thread
Компилятору-то действительно пофиг, а вот программисты обычно не любят читать что-нибудь вроде:
for(--c;n<c;*L-c?L[*a[++*L]+=32]=1:swap(a[1],a[*((*a=strchr(a[n],0)-1)+L[**a]-1)-*a[++n]?rand()%c+(n=1):1]));
> http://www.stroustrup.com/bs_faq2.html#whitespaceA ``typical C programmer'' writes ``int *p;'' and explains it ``*p is what is the int'' emphasizing syntax, and may point to the C (and C++) declaration grammar to argue for the correctness of the style. Indeed, the * binds to the name p in the grammar.
Ну не верно же!
Все верно.
The choice between "int* p;" and "int *p;" is not about right and wrong, but about style and emphasis. C emphasized expressions; declarations were often considered little more than a necessary evil. C++, on the other hand, has a heavy emphasis on types.A "typical C programmer" writes "int *p;" and explains it "*p is what is the int" emphasizing syntax, and may point to the C (and C++) declaration grammar to argue for the correctness of the style. Indeed, the * binds to the name p in the grammar.
A "typical C++ programmer" writes "int* p;" and explains it "p is a pointer to an int" emphasizing type. Indeed the type of p is int*. I clearly prefer that emphasis and see it as important for using the more advanced parts of C++ well.
http://stackoverflow.com/questions/6990726/correct-way-of-de...
А чем оно лучше clang-format для C++?
> А чем оно лучше clang-format для C++?Или uncrustify. Оно вообще настраивается как угодно.
> Оно вообще настраивается как угодно.Очевидно гуглу не нужно "как угодно".
Им нужно как у них принято.
Ваш КО.
>> Оно вообще настраивается как угодно.
> Очевидно гуглу не нужно "как угодно".
> Им нужно как у них принято.
> Ваш КО.-> конфиг для uncrustify.
вот как надо форматироватьint foo(int* x)
{
return *x * *x;
}
Форматировать надо так, чтобы минимизировать время понимания кода и вероятность ошибок.
Все остальное - не каноны, а просто способы. Даже если это способ от самих K & R.
Только как в новости либо так:> int foo(int* x) {
> return *x * *x;
> }
В этом формате не будет работать [[
в стандартной поставке clang-format есть гугловский стиль, кстати очень удобный, и плагин для vim.в стандартной поставке Go есть средство форматирования кода и, опять же, плагин для vim.
Резюме: в Гугле у кого-то резко обострился NIH-синдром.
этот плагин исключительно для тех людей, что код пишут только так, как показано в первом варианте:
> int foo(int * x) { return * x** x ; }для них проще плагин наклепать, чем их переучить.
потому и наклепали.тут важно другое: что за программисты в гугле работают, что им такие плагины нужны и что способны "* x** x" выдать?
а ничего что vim это умеет из коромбки на основе настраиваемого indent? Выделяем код и нажимаем кнопку "="
Встроенный индент уже умеет что-то кроме (внезапно) индентации?
Торматирует только в стиль гугла? Есть более полезный инструмент http://astyle.sourceforge.net/astyle.html который позволяет привести к любому стилю. И соответсвующий плагин https://github.com/Chiel92/vim-autoformat Наверное и Go ему можно скормить.
Не надо ей Go скармливать: к счастью, у него есть фиксированный стандартный формат и утилита для него: http://blog.golang.org/go-fmt-your-code
в анонсе написано, что javascript умеет. на самом деле:
:FormatCode
Not available. codefmt doesn't have a default formatter for this buffer.это у меня руки из Ж, или анонс врет?
плагину нужна эта тулза, сейчас он просто неправильно ругается на её отсутсвие
http://clang.llvm.org/docs/ClangFormat.htmlПодробности:
https://github.com/google/vim-codefmt/issues/16
спасибо
vim-autoformat? https://github.com/Chiel92/vim-autoformat