metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-08-21 05:55 am

Зло какое-то

Школьный Линукс и входной порог разработки

Борландовские Паскали, С и тому подобное работали под досом без плясок с бубном и ставились простым копированием.
Дельфи в 1997 году поставилась на 95 винду и заработала сразу. За день можно написать прототип DB приложения, вообще видя среду разработки в первый раз. Visual C в то же примерно время - то же самое, разве что писать чуть сложнее, это вам не RAD.
Вижуал студия с дотнетом в 2006 вроде бы году - аналогично, поставил, за день разобрался.

А в линуксе до сих пор какое-то вуду, стоит только выйти за рамки стандартных задач.

[identity profile] theiced.livejournal.com 2010-08-21 11:25 am (UTC)(link)
int foo(int bar, char *baz, huita *bee) {
  LOG(LOG_LEVEL_TRACE, "CALL: foo(%d, %s, %s)", bar, baz, huita_dump(bee));


не? пишется на полнлом автомате, тратятся на это секунды.

[identity profile] metaclass.livejournal.com 2010-08-21 11:28 am (UTC)(link)
Затем при рефакторинге меняются имена методов, списки параметров, и прочая. И вслед за ними - править все логи.
Кстати о huita_dump - строку возвращаемую кто удаляет?

[identity profile] theiced.livejournal.com 2010-08-21 11:36 am (UTC)(link)
в стуктуре тупо есть char[xxx] __dump; в отладочном режиме - простейшее решение. есть эзотерические решения на диких макросах (выделение памяти специальным макросом, заносящим выделенный адрес в __dumps и освобождение "своих" строк в конце вызова LOG (написал лет так 8 назад, использую до сих пор).

[identity profile] metaclass.livejournal.com 2010-08-21 11:41 am (UTC)(link)
а, т.е. huita_dump __dump заполняет и возвращает его?

[identity profile] theiced.livejournal.com 2010-08-21 11:59 am (UTC)(link)
в простейшем случае

struct huita {
#ifdef TRACE
 char __dump[100500];
#endif
....


#ifdef TRACE
char *huita_dump(huita *h) {
....
return h->__dump;
}


в случае хитровыебанных макросов это будет что то типа (очень упрощённо, в код ша не полезу, лень):

char **__dumps;

char *huita_dump(huita *h) {
  char *d = dump_malloc(...);
  ...
  return d;
}

#define LOG(level, fmt, ...) \
  ...
  char *fmt_s; \
  while (fmt_s = dump_next_fmt_string(fmt, fmt_s)) { \
    if (dump_is_string(fmt_s)) { \
      dump_free(s); \
    } \
  } \


ну идея понятна, да.

вообще у меня LOG и необходимые говнофунки занимают строк под 300. умеет дохуя чего, в том числе и отложенную запись. да - выполнение типичной проги с моими типичными полными трэйс логами замедляется примерно в два раза, с необходимыми продакшн логами прОцентов на 5-10 (депендс). оно того стоит - сэкономлена пара ваговов моих драгоценных нервных клеток.

вообще, может причешу, документирую и выложу на гугелькод если интересно. в текущем виде даже показывать никому не буду - там ад и израиль ;)

[identity profile] theiced.livejournal.com 2010-08-21 12:07 pm (UTC)(link)
добью танцем - у меня есть ещё специальный хидер который хукается на все операции аллокации и деаллокации памяти и в конце репортит какая сука выделила неосвобождённую память. такой свой валгринд клёвый встроенный.

[identity profile] metaclass.livejournal.com 2010-08-21 12:11 pm (UTC)(link)
У меня есть то же самое, но для дельфи :)

[identity profile] w00dy.livejournal.com 2010-08-21 01:02 pm (UTC)(link)
оно ж не thread safe ни разу. Или у тебя самая елементарная ситуация - один объект, один поток и никакого шаринга.

PS И эти люди нам рассказывают о сотнях потоках и запрещают в носу ковыряться

[identity profile] theiced.livejournal.com 2010-08-21 01:05 pm (UTC)(link)
вот тупой, а. я ж написал - _упрощённо_. всё thread safe, с необходимыми мутексами и прочей радостью (опционально есессно - ибо бывают очень часто и single thread проги).

[identity profile] theiced.livejournal.com 2010-08-21 11:41 am (UTC)(link)
ну и при рефактринге - перегенериццо тем же хоткеем. ребе, уёбищность вашей иде не повод гробить своё время отладчиком. (скандируя) емакс! емакс! емакс"

[identity profile] metaclass.livejournal.com 2010-08-21 11:47 am (UTC)(link)
Я бы предпочел метапрограмминг - чтобы макрос доставал описание функции, где он сидит и генерил лог автоматом :)

[identity profile] theiced.livejournal.com 2010-08-21 12:00 pm (UTC)(link)
увы, в стандарте си нету даже __FUNCTION__ (в гцц таки есть, но не о нём) не говоря уже о сигнатуре. что вы хотите от ассемблера.

[identity profile] fi_mihej.livejournal.com 2010-08-21 06:01 pm (UTC)(link)
Ну имя-не имя, а номер строки выдавать автоматом - может: __LINE__. Большего, для вычисления функции, и не надо (ну да - хотелось бы имя, но рас уж возможности нету нету, то и это пойдетъ).

[identity profile] theiced.livejournal.com 2010-08-21 06:04 pm (UTC)(link)
этого мало, поэтому приходится писать вот такую вот порнуху как я показал.

[identity profile] fi_mihej.livejournal.com 2010-08-21 06:28 pm (UTC)(link)
Ту "порнуху", которую ты показал приходится писать для более сложных и глобальных вещей, а для того, что бы узнать имя текущей функции (т.е. без учета вложенности вызовов) без необходимости прописывания этого имени текстовой строкой, и как следствие, без необходимости изменять эту строку при рефакторинге кода - достаточно знать номер строки. При этом, естественно, необходимо знать, какой конкретно билд выполняется, поскольку строка с одним и тем же номером, но в разных версиях - может принадлежать различным ф-циям. То бишь это не идеальное решение, но как вариант - вполне себе рабочее. Кроме того: что я написал - это не замена той "порнухе", которую ты описал, а только один из приемов, который при желании, может быть использован _внутри_ других подобных "порно".

Доступно пояснил, или еще пожевать?

[identity profile] fi_mihej.livejournal.com 2010-08-21 06:38 pm (UTC)(link)
Плюс я похоже таки заманался, поскольку вместо "описание функции" - прочел "имя функции" (у metaclass). Так что извиняюсь - я просто не в ту степь отвечал. :(

[identity profile] theiced.livejournal.com 2010-08-21 06:48 pm (UTC)(link)
ага, с именем функи то всё просто - мы же используем нормальные компиляторы в которых есть __FUNCTION__, да. тут беда с сигнатурой. и таки ничего страшного - все заебались :)

[identity profile] theiced.livejournal.com 2010-08-21 11:28 am (UTC)(link)
(загробным голосом)

а ещё для этого можно сделать в емаксе маленькую функу - тогда всего один хоткей будет тратиться (или вообще по вводу после объявления функи - о - ша допишу, а то лень было).