Re: Качество кода open-source
От: IT Россия linq2db.com
Дата: 22.05.08 16:12
Оценка: 2 (2) +8
Здравствуйте, Lonely Dog, Вы писали:

LD>Мне интересно, весь open-source написан так же или это мне так повезло?

LD>Как при таком качестве кода они умудряются что-то разумное делать?

Качество open-source кода абсолютно ничем не отличается от качества любого другого кода. Как и везде есть код хороший, есть не очень, есть откровенное дерьмо. Не думаю, что кривыми руками за деньги писать получится лучше, чем open-source.
Если нам не помогут, то мы тоже никого не пощадим.
Качество кода open-source
От: Lonely Dog Россия  
Дата: 22.05.08 15:53
Оценка: 6 (2) +4 :)
Привет!

Сразу же хочу сказать, что я свои выводы я сделал на основании просмотра одной open-source программы под названием PuTTY. Это виндовый клиент для SSH, Telnet и rlogin. Знаю, что он достаточно популярен.
Просматривая код я ловил себя на мысли, что это гавно лучше переписать чем попытаться понять, как оно работает.

Приведу несколько примеров:
1. Файл ssh.c
В начале файла есть несколько дефайнов:
/* Coroutine mechanics for the sillier bits of the code */
#define crBegin1    static int crLine = 0;
#define crBegin2    switch(crLine) { case 0:;
#define crBegin        crBegin1; crBegin2;
#define crFinish(z)    } crLine = 0; return (z)
#define crFinishV    } crLine = 0; return
#define crReturn(z)    \
    do {\
        crLine=__LINE__; return (z); case __LINE__:;\
    } while (0)
#define crReturnV    \
    do {\
        crLine=__LINE__; return; case __LINE__:;\
    } while (0)
#define crStop(z)    do{ crLine = 0; return (z); }while(0)
#define crStopV        do{ crLine = 0; return; }while(0)
#define crWaitUntil(c)    do { crReturn(0); } while (!(c))
#define crWaitUntilV(c)    do { crReturnV; } while (!(c))


Потом эти дефайны используются в коде следующим образом:
static int ssh1_rdpkt(unsigned char **data, int *datalen)
{
    struct rdpkt1_state_tag *st = &rdpkt1_state;

    crBegin;

  next_packet:

    pktin.type = 0;
    pktin.length = 0;

    for (st->i = st->len = 0; st->i < 4; st->i++) {
    while ((*datalen) == 0)
        crReturn(4 - st->i);
    st->len = (st->len << 8) + **data;
    (*data)++, (*datalen)--;
    }
    ...


Т.е., пришли в функцию, что-то сделали, и вышли, сохранив номер строки из которой мы вышли. В следующий раз мы продолжим выполнение с этого же места. Этот код не компилируется в студии если установлен режим сохранения отладочной информации Edit and continue. Выводится ошибка "case label not a constant" или типа того. Меняем эту настройу на что-нибудь другое, и все работает.
Как это поддерживать? Какой смысл в открытости кода, если поддерживать его могут только авторы?

2. В файле window.c приведена функция TranslateKey длиной в 800 строк! Это же убиться можно.
3. Мой любимый пример. Функция term_out из файла terminal.c. Она занимает 1830 строк. Там реализован какой-то офигенный конечный автомат. С какими-то вложенными состояниями и метками case вида:
           case 40:
             compatibility_level &= TM_VTXXX;
             break;
           case 41:
             compatibility_level = TM_PUTTY;
             break;
           case 42:
             compatibility_level = TM_SCOANSI;
             break;

или
               case 14:
            get_window_pixels(&x, &y);
            len = sprintf(buf, "\033[4;%d;%dt", x, y);
            ldisc_send(buf, len, 0);
            break;
               case 18:
            len = sprintf(buf, "\033[8;%d;%dt",
                     rows, cols);
            ldisc_send(buf, len, 0);


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

Мне интересно, весь open-source написан так же или это мне так повезло?
Как при таком качестве кода они умудряются что-то разумное делать?
Re: Качество кода open-source
От: Maxim S. Shatskih Россия  
Дата: 22.05.08 20:47
Оценка: 3 (2) +1 -3
LD> crLine=__LINE__; return (z); case __LINE__:;\

Жесть!

LD>Мне интересно, весь open-source написан так же или это мне так повезло?


Примерно так.

LD>Как при таком качестве кода они умудряются что-то разумное делать?


Видимо, высокое качество исходного кода не особо и нужно
Занимайтесь LoveCraftом, а не WarCraftом!
Re[2]: Качество кода open-source
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 23.05.08 11:50
Оценка: 3 (1) :)))
Здравствуйте, SergeCpp, Вы писали:

SC>Это ещё цветочки


SC>Ягодки — вот тут
Автор: SergeCpp
Дата: 08.02.07


Детский сад! У нас на работе есть магическая мега-функция оставленная нам "демиургами", её длинна на данный момент ~1800строк, она набита свичами и goto, причём можно ивдеть и такие вещи как:
case тра-ля-ля:
goto три рубля
break;
case тра-ля-ля:
goto три рубля

Как параметр эта функция принимает структуру, объявление которой занимает ~200 строк, что составляет примерно 150 параметров, примерно 1/3 которых некоментированы, и не имеют вменяемых названий...
И наконец эта функция вызывается ресурсивно...

Ну Хто ещё чем похвастает?
---=== С наилучшими пожеланиями, Phoenics ===---
_
Re[2]: Качество кода open-source
От: rising_edge  
Дата: 23.05.08 11:43
Оценка: 1 (1) +2 -1
Здравствуйте, Maxim S. Shatskih, Вы писали:

LD>>Мне интересно, весь open-source написан так же или это мне так повезло?


MSS>Примерно так.


LD>>Как при таком качестве кода они умудряются что-то разумное делать?


MSS>Видимо, высокое качество исходного кода не особо и нужно


Я думаю, что качество закрытого кода мегатонн всякого фри- и шароварного барахла немного ниже. Просто этого никто не видит.
Re[10]: Качество кода open-source
От: Roman Odaisky Украина  
Дата: 23.05.08 17:14
Оценка: +1 -1 :))
S>>ньюс это что? RSS?
КЛ>nntp

Как низко мы пали...
До последнего не верил в пирамиду Лебедева.
Re: Качество кода open-source
От: Lorenzo_LAMAS  
Дата: 23.05.08 10:00
Оценка: 2 (2) +1
ИМХО, зря ты так поспешил охаять этот код :

Simon Tatham (born May 3, 1977) is an English programmer known primarily for creating and maintaining PuTTY,


Implementations for C

Several attempts have been made, with varying degrees of success, to implement coroutines in C with combinations of subroutines and macros. Simon Tatham's contribution[8] is a good example of the genre, and his own comments provide a good evaluation of the limitations of this approach. The use of such a device truly can improve the writability, readability and maintainability of a piece of code, but is likely to prove controversial. In Tatham's words: "Of course, this trick violates every coding standard in the book... [but] any coding standard which insists on syntactic clarity at the expense of algorithmic clarity should be rewritten. If your employer fires you for using this trick, tell them that repeatedly as the security staff drag you out of the building."


http://en.wikipedia.org/wiki/Co-routines
http://en.wikipedia.org/wiki/Simon_Tatham
Of course, the code must be complete enough to compile and link.
Re[2]: Качество кода open-source
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 02.06.08 13:43
Оценка: 1 (1) +1 -1
Здравствуйте, shrecher, Вы писали:

S>Такое качество кодо достаточно типично для OSS. Похоже код хоть и открытый, поддерживается каким-то одним Гуру. Весь дезайн и идея кода у него в голове. Если попытаться разобраться, что делает bzip2, то крыша едет очень скоро. Так как


S>Разобраться в этой каше, конечно можно, но на это уйдет куча времени и сил. Производительность труда резко падает. Желание работать с таким кодом исчезает очень бысро.


Я бы сказал по другому. Это типично для кода, реализующего сложную взаимосвязанную функциональность. И крыша едет от этой сложности и взяимосвязанности. Да и код зачастую исследовательский: возникает идея и непонятно, принесет она дивиденды или нет. Заранее все педантично оформлять не зватит никакого времени на разработку. Оформлять опосля? Не всегда есть и на это время.

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

Далее, такой код зачастую содержит элементы научно исследовательской работы. И находится он должен в виде, наиболее удобной исследователю. А далее разделение труда: исследователь дальше проводит исследования, адепты преобразуют результат его исследований в что-то более академическое. Не всегда эти два качества совмещаются в одном человеке.

Ниже я попытаюсь высказать несколько слов в защиту по каждому из пунктов. Я не хочу сказать, что я выступаю за всецело такой стиль программирования всегда и во всем. Более того, я не знаком с кодом bzip2. Но каждому перечисленному пункту можно найти оправдания и обоснования. Мне приходилось работать с кодом, который содержал многие перечисленные пункты. Могу сказать, что если код был написан профессионально, то большой проблемы во всем перечисленном не было.

S>1. часто нет описания идеи что каждый модуль делает. Ее можно вытащить из кода, но долго


В двух словах ее можно вытащить из названия файла. Более подробно: названия ключевых функций. Еще более подробно иногда в коментариях внутри модуля. Еще более подробно? Скорее всего речь идет о специфической проблеме, которую надо решать в контексте кода в любом случае. Идея? Если весь процесс вычислительный, то идея всех модулей состоит в вычислениях.

S>2. Минимум комментариев даже для очень нетривиальных методов

S>
s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];


Если писать коментарии в таких местах, то весь код будет очень большим коментарием. Разработка раймет в разы больше времени. Выгода? Затрудняюсь ответить. Тут не коментарии нужны, а статья. Общий обзор.

S>3. Магические констатны смысл которых может вытекать из общей картины, но не из конкретного метода.

S>
if (uc == 0x17) goto endhdr_2;


Ну будет там стоять STATE_17, будет проще? Не всегда удается придумать адекватное название для состояния. А если придумать, то будет многословно... Например STATE_AFTER_READING_PIECE_SYMBOL_NEXT_SYMBOL_IS_NOT_TAKING. Попробуй их потом объединить в if? Тут возможно даже лучше оставить константы и написать коментарий, что какой magic number обозначает. Но по своему опыту, это не является таким уж необходимым. Начинаешь разбираться и через некоторое время все становится на свои места.

А иногда эти магические константы формируются методом Монте-Карло Например
[quote]
Задача: Надо найти по битборду с занятыми полями битборд с атаками ладьи (слона) с заданного поля.

Решение:
1) Делаем AND битборда занятости с только теми полями, которые влияют на атаки. Для ладьи на любом поле битборд-маска состоит из 12 единиц. Например, для a1 это поля a2...a7, b1...g1 (поля a8 и h1 не входят, т.к. их атакованность ладьёй с a1 не зависит от того, стоит ли на них какая-нибудь фигура)
2) Умножаем маскированный битборд на МАГИЧЕСКОЕ ЧИСЛО ДЛЯ ЛАДЬИ НА А1.
3) Берём от произведения 12 старших разрядов (сдвигом).
4) Получаем 12-разрядное число, которое используем как индекс в предвычисленной таблице атак.

МАГИЧЕСКОЕ ЧИСЛО для каждого поля доски находим методом Монте-Карло, чтобы не было коллизий. Будет два массива, 64 числа для ладьи и 64 для слона. Маски для атак — тоже предвычисленные константы.[/quote]

S>4. Опять макросы, длинные функции по 500 и больше строк


Ну длинные функции, что с того? Предположим, что длина функции не следствие копипаста. А что можно сделать? Например, разбить на более мелкие функции, но поможет ли это? Зато сразу большое количество проблем.
1) Необходимо организовать контекст вычислений
2) Зачастую возникает большое количество флажков, вспомогательных переменных, инициализаций
3) Изменения зачастую приводят к лишним телодвижениям: ввели новую локальную переменную, потом она понадобилась в какой-то из вложенных функций. Надо ее перемещать в контекст вычислений и т. д. и т. п.

Так что при разработке проще держать все вместе одним большим замесом.

S>5. однобуквенные названия переменных (j,i,n,s)


Придумай что получше Зачастую в целях оптимизации приходится хранить и усиленно использовать переменные, которым нет человеческого названия. Нет, я конечно могу объяснить что там хранится, но для этого надо минимум пару предложений. Выделить ключевой слово можно, о тогда возникает проблема конфликта, потому как к этому ключевому слову можно отнести несколько переменных. Нумеровать их?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Качество кода open-source
От: squid  
Дата: 23.05.08 11:33
Оценка: +1 :))
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, squid, Вы писали:


КЛ>[]


S>>ну, мне как пользователю он очень нравицца особенно если вспомнить что запускается мгновенно, а The Bat! минуту шуршит.


КЛ>мне тоже, поэтому я и удивляюсь, как _это_ работает


вывод — если хорошо работает и все нравицца — нефиг смотреть как оно сделано
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: �������� ���� open-source
От: max779 Россия  
Дата: 23.05.08 12:47
Оценка: +3
Здравствуйте, Roman Odaisky, Вы писали:

RO>Алгоритм понимать необязательно, но обрати внимание, как часто вызывается YIELD. С точки зрения программирования, YIELD магическим образом обновляет состояние класса и продолжает выполнение (а на самом деле там return, после которого функция вызывается еще раз с обновленными параметрами).


Вот именно, что магическим образом обновляет... Я больше чем уверен, что это все можно было переписать просто рекурсией.
Второй вариант явно лучше только потому, что там нет этих магических обновлений. Правда там тоже перестарался, видимо разворачивал рекурсию в цикл. И явно этот код можно было написать лучше.
В общем, меня не убедили. А основной косяк этого подхода вот в чем: вот ты пишешь программу и пользуешься этими магическими YIELD и т.д. Потом ты увольняешься, на твое место приходит другой кодер и он не знаком с этим делом... Он конечно познакомится рано или поздно и перепишет весь твой код без этих макросов. И только потому что, чтобы хранить в уме эти магические обновления и переходы надо намного больше усилий... В общем, его мнение о тебе будет таким же как у Lonely Dog об open source.
Помните: программы пишутся для человека, а не для машины. Машина разберется в любых goto, а вот у человека голова опухнет...
Re[3]: Качество кода open-source
От: Maxim S. Shatskih Россия  
Дата: 25.05.08 18:06
Оценка: +2 -1
LD>>>Мне интересно, весь open-source написан так же или это мне так повезло?

MSS>>Примерно так.


С>Ты знаком со всем open-source кодом?


Нет, но с многим. Угребищный стиль кодирования там норма.
Занимайтесь LoveCraftом, а не WarCraftом!
Re: Качество кода open-source
От: Cyberax Марс  
Дата: 22.05.08 16:14
Оценка: 5 (2)
Здравствуйте, Lonely Dog, Вы писали:

LD>Т.е., пришли в функцию, что-то сделали, и вышли, сохранив номер строки из которой мы вышли. В следующий раз мы продолжим выполнение с этого же места. Этот код не компилируется в студии если установлен режим сохранения отладочной информации Edit and continue. Выводится ошибка "case label not a constant" или типа того. Меняем эту настройу на что-нибудь другое, и все работает.

LD>Как это поддерживать? Какой смысл в открытости кода, если поддерживать его могут только авторы?
Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог перенести, сейчас пакет делаю (https://launchpad.net/putty2).

LD>2. В файле window.c приведена функция TranslateKey длиной в 800 строк! Это же убиться можно.

LD>3. Мой любимый пример. Функция term_out из файла terminal.c. Она занимает 1830 строк. Там реализован какой-то офигенный конечный автомат. С какими-то вложенными состояниями и метками case вида:
Используется подход с С coroutines, описаный вот здесь: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html

Об этом, кстати, в их доке по разработке сказано.

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

Об этом там тоже сказано.
Sapienti sat!
Re[5]: �������� ���� open-source
От: Roman Odaisky Украина  
Дата: 23.05.08 11:17
Оценка: 2 (2)
Здравствуйте, max779, Вы писали:

M>Ну там естественно от задачи все зависит, может вообще рекурсивно в каждой ячейке смотрел бы куда идти. Может и развернул бы эту рекурсию в цикл. В общем, обойти можно по разному, но только не таким извратом.

M>Кстати, расскажите, чем конкретно эти дикие define лучше кода выше? По читаемости и сопровождаемости, ИМХО, этот лучше.
M>Но может меня тут переубедят и я проникнусь и так же писать начну...

Это сопрограмма. RTFM TAOCP 1.4.2.

Вот что я тогда написал:
class Pod
{
public:
    Pod(int fuelTank, int cargoBay, int maxMineralIndex, double costFactor):
        F(fuelTank), B(cargoBay), N(maxMineralIndex), q(costFactor),
        depth(0), f(fuelTank), b(0)
    {
    }

    char move(std::vector<std::string> const& zone)
    {
        char const c = play(zone);

        здесь обновляются всякие внутренние переменые

        return c;
    }

private:
    int depth;
    int f;
    int b;

    char delve(std::vector<std::string> const& zone)
    {
        static int seen0 = 0;
        static int seeng = 0;

        static double p0, pg, eta;

        static int aditDepth;
        static int shaftDepth;

        static int b0;
        static int bv;

        static int f0;

        static int dx = 0;

        COROUTINE
        {
            assert(depth == 0);

            while(depth < exploreDepth)
            {
                {
                    int const c0 = std::count(zone[4].begin(), zone[4].end(), CAVE);
                    int const cg = std::count(zone[4].begin(), zone[4].end(), GOB);

                    seen0 += c0;
                    seeng += cg;
                }

                YIELD('D');
            }
        
            p0 = double(seen0) / exploreDepth / zone[0].size();
            pg = double(seeng) / exploreDepth / zone[0].size();

            eta = 1. - p0 - pg;

            std::clog << "p0 = " << p0 << ", pg = " << pg << ", eta = " << eta << std::endl;

            {
                double const targetDepth = 0.25 * F - 0.5 * B/eta * (1. + 3. * p0)/(1. + p0);
                double const vertDelta = 0.5 * p0 * B / eta;
                double const aditEst = 0.5 * B / eta / (1. + p0);

                aditDepth  = (int)(targetDepth - vertDelta - horzSafetyFactor * aditEst - vertSafetyFactor * vertDelta);
                shaftDepth = (int)(targetDepth + vertDelta - horzSafetyFactor * aditEst);

                std::clog << "t = " << targetDepth << ", hs = " << horzSafetyFactor * aditEst << ", vs = " << vertSafetyFactor * vertDelta << std::endl;
            }

            std::clog << "adit = " << aditDepth << ", shaft = " << shaftDepth << std::endl;

            std::clog << "Digging...";

            while(depth < aditDepth)
            {
                if(depth % 50 == 0)
                {
                    std::clog << " " << depth << "..." << std::flush;
                }

                YIELD('D');
            }

            std::clog << std::endl;

            while(cellToBottom(zone) == CAVE && cellToRight(zone) != CAVE)
            {
                ++aditDepth;
                ++shaftDepth;
                YIELD('D');
            }

            std::clog << "depth = " << depth << ": adit" << std::endl;

            if(cellToRight(zone) != CAVE)
            {
                YIELD('R');
                YIELD('L');
            }

            b0 = b;
            std::clog << "Garbage mined: " << b0 << std::endl;

            while(depth < shaftDepth)
            {
                YIELD('D');
            }

            std::clog << "depth = " << depth << ": shaft" << std::endl;

            bv = b - b0;

            std::clog << "Mined in shaft: " << bv << std::endl;

            while(depth > aditDepth)
            {
                YIELD('U');
            }

            std::clog << "depth = " << depth << ": adit again" << std::endl;

            f0 = f;

            std::clog << "Fuel left: " << f << std::endl;

            std::clog << "Mining...";
            while(b - b0 - bv < (B - bv) / 2 && f0 - f < fuelAllowanceFactor * (f0 - 2 * shaftDepth))
            {
                if(cellToBottom(zone) != CAVE || cellToRight(zone) == CAVE)
                {
                    ++dx;

                    YIELD('R');

                    if((b - b0) % 10 == 0)
                    {
                        std::clog << " " << (b - b0) << "..." << std::flush;
                    }
                }
                else
                {
                    YIELD('D');
                }
            }
            std::clog << std::endl;

            std::clog << "depth = " << depth << ", dx = " << dx << ": time to turn back. "
                "Mined so far: " << (b - b0) << " (" << bv << " + " << (b - b0 - bv) << ")" << std::endl;

            std::clog << "Fuel left: " << f << std::endl;

            YIELD('D');

            std::clog << "Mining...";
            while(dx > 0)
            {
                if(cellToBottom(zone) != CAVE || cellToLeft(zone) == CAVE)
                {
                    --dx;

                    YIELD('L');

                    if((b - b0) % 10 == 0)
                    {
                        std::clog << " " << (b - b0) << "..." << std::flush;
                    }
                }
                else
                {
                    YIELD('D');
                }
            }
            std::clog << std::endl;

            std::clog << "Total mined: " << (b - b0) << " + " << b0 << " garbage" << std::endl;

            std::clog << "depth = " << depth << ": LIFTOFF!" << std::endl;

            while(depth > 0)
            {
                YIELD('U');
            }

            std::clog << "Fuel left: " << f << std::endl;

            while(1)
            {
                YIELD(glide(zone));
            }
        }

        return 'X';
    }

    char glide(std::vector<std::string> const& zone)
    {
        COROUTINE
        {
            while(1)
            {
                assert(depth == 0);

                while(false
                    || zone[5][4] == CAVE // v› impossible or ineffective
                    || cellToBottom(zone) == GOB && (zone[4][5] != CAVE || zone[5][5] == CAVE) // v› ineffective
                    || zone[5][5] == CAVE && zone[4][6] != CAVE // v›› impossible, have to v›^ -- ineffective
                    || zone[4][5] == GOB && zone[4][6] == GOB // M..M: v››› = f8c2, ›››v = f5c1
                )
                {
                    YIELD('R');
                }

                YIELD('D');

                while(1)
                {
                    if(false
                        || b >= B
                        || f < 4
                        || cellToBottom(zone) == CAVE && cellToRight(zone) != CAVE
                        || zone[3][5] == GOB && zone[3][6] == GOB && zone[3][7] == GOB && zone[3][8] == GOB
                    )
                    {
                        YIELD('U');
                        break;
                    }

                    YIELD('R');
                }
            }
        }

        return 'X';
    }

    char play(std::vector<std::string> const& zone)
    {
        COROUTINE
        {
            static bool isVertBetter;

            {
                std::string const tmp = zone[4] + zone[5] + zone[6];
                double const p0Est = std::count(tmp.begin(), tmp.end(), CAVE) / double(tmp.size());
                double const pgEst = std::count(tmp.begin(), tmp.end(), GOB)  / double(tmp.size());

                double const etaEst = 1. - p0Est - pgEst;

                std::clog << "etaEst: " << etaEst << std::endl;

                double const vertEst = B * std::pow(q, N * (1. - (B * vertCoefEst) / (F /* * etaEst*/)));
                double const horzEst = 0.5 * F * etaEst;

                std::clog << "vertEst: " << vertEst << " horzEst: " << horzEst << std::endl;

                isVertBetter = vertEst > horzEst;
            }

            while(1)
            {
                YIELD(isVertBetter ? delve(zone) : glide(zone));
            }
        }
    }

    int const B;
    int const N;
    int const F;
    double const q;
};

Алгоритм понимать необязательно, но обрати внимание, как часто вызывается YIELD. С точки зрения программирования, YIELD магическим образом обновляет состояние класса и продолжает выполнение (а на самом деле там return, после которого функция вызывается еще раз с обновленными параметрами).

Заодно здесь хорошо виден недостаток этого подхода — приходится объявлять переменные заранее.

И еще здесь есть «if(false\n||», но это из другого флейма :-)

А вот кусок решения этой же задачи участником, который занял второе место. Ты уверен, что так лучше?
        if (state_ == 1) {
            // Return to the surface.
            if (position_.X <= 1) {
                state_ = 5;
                continue;
            }
            return strategy_return(vs);
        } else if (state_ == 2) {
            // Find new spot to harvest.
            strategy_best_depth();
            state_ = 3;
            continue;
        } else if (state_ == 3) {
            if (harvest_depth_ < 2) {
                state_ = 5;
                continue;
            }
            // Descent.
            if (position_.X == harvest_depth_) {
                state_ = 4;
                harvest_dir_ = 0;
                continue;
            }
            return strategy_descent(vs);
        } else if (state_ == 4) {
            bool no_dir = (harvest_dir_ == 0);
            if (no_dir) harvest_dir_ = 3;
            if (!no_dir && harvest_dir_ == 3 && strategy_surface_go_down(fuel_left_ - rough_sourface_distance_ - 5, position_, 2, true)) {
                harvest_dir_ = 2;
                return pop_plan(vs);
            }
            if (no_dir) harvest_dir_ = 2;
            if (strategy_surface_go_down(fuel_left_ - rough_sourface_distance_ - 5, position_, 3, true)) {
                harvest_dir_ = 3;
                return pop_plan(vs);
            }
            if (no_dir) harvest_dir_ = 3;
            if (strategy_surface_go_down(fuel_left_ - rough_sourface_distance_ - 5, position_, 2, true)) {
                harvest_dir_ = 2;
                return pop_plan(vs);
            }
            if (no_dir) harvest_dir_ = 0;
            if (can_dig(vs, 1)) {
                do_make_move(vs, 1, MOVE_DIG);
                return dc[1];
            } else {
                do_make_move(vs, 1, MOVE_FLY);
                return dc[1];
            }
        } else if (state_ == 5) {
            if (position_.X > 1) {
                if (5 - harvest_dir_ != last_used_dir_ && strategy_surface_go_down(fuel_left_ - 5, position_, 5 - harvest_dir_)) {
                    return pop_plan(vs);
                }
                if (strategy_surface_go_down(fuel_left_ - 5, position_, harvest_dir_)) {
                    return pop_plan(vs);
                }
                if (strategy_surface_go_down(fuel_left_ - 5, position_, 5 - harvest_dir_)) {
                    return pop_plan(vs);
                }
                state_ = 6;
                continue;
            }
            last_used_dir_ = 0;
            return strategy_surface_explorer(vs);
        } else if (state_ == 6) {
            if (position_ == surface_pos_.back()) {
                surface_pos_.pop_back();
                continue;
            }
            if (surface_pos_.empty()) {
                state_ = 5;
                continue;
            }
            return strategy_shortest_path(vs, surface_pos_.back());
        } else {
            // Whatever.
            return strategy_random(vs);
        }
До последнего не верил в пирамиду Лебедева.
Re[2]: Качество кода open-source
От: Константин Черногория  
Дата: 09.07.08 23:00
Оценка: 2 (2)
Здравствуйте, Cyberax, Вы писали:

LD>>3. Мой любимый пример. Функция term_out из файла terminal.c. Она занимает 1830 строк. Там реализован какой-то офигенный конечный автомат. С какими-то вложенными состояниями и метками case вида:

C>Используется подход с С coroutines, описаный вот здесь: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html

Fibers в WinAPI уже лет 15 — появились в Windows NT Workstation 3.51 и Win98: в отличие от этих.. хмм.. макросов , код остаётся весьма читабельным.
Лишний раз убеждаюсь, шо без Windows жизни нет
Re[5]: Качество кода open-source
От: Константин Л.  
Дата: 23.05.08 11:52
Оценка: +1 :)
Здравствуйте, squid, Вы писали:

[]

S>вывод — если хорошо работает и все нравицца — нефиг смотреть как оно сделано


мне туда лазить приходится. и при любой такой необходимости к каждому члену нашей команды приходит депрессия
Re[14]: Сопрограммы
От: WolfHound  
Дата: 27.05.08 12:48
Оценка: +2
Здравствуйте, Cyberax, Вы писали:

C>Общего случая не будет. А для части вполне подойдёт представление продолжения в виде объекта со счётчиком ссылок.

Смешно.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Качество кода open-source
От: Programador  
Дата: 17.06.08 19:37
Оценка: :))
Здравствуйте, Lonely Dog, Вы писали:

LD>Привет!


LD>Сразу же хочу сказать, что я свои выводы я сделал на основании просмотра одной open-source программы под названием PuTTY.


босяки одним словом
Re: �������� ���� open-source
От: Roman Odaisky Украина  
Дата: 22.05.08 16:33
Оценка: 3 (1)
????????????, Lonely Dog, ?? ??????:

LD>1. ???? ssh.c

LD>? ?????? ????? ???? ????????? ????????:
LD>
LD>/* Coroutine mechanics for the sillier bits of the code */
LD>#define crBegin1    static int crLine = 0;
LD>#define crBegin2    switch(crLine) { case 0:;
LD>#define crBegin        crBegin1; crBegin2;
LD>#define crFinish(z)    } crLine = 0; return (z)
LD>#define crFinishV    } crLine = 0; return
LD>#define crReturn(z)    \
LD>    do {\
LD>        crLine=__LINE__; return (z); case __LINE__:;\
LD>    } while (0)
LD>#define crReturnV    \
LD>    do {\
LD>        crLine=__LINE__; return; case __LINE__:;\
LD>    } while (0)
LD>#define crStop(z)    do{ crLine = 0; return (z); }while(0)
LD>#define crStopV        do{ crLine = 0; return; }while(0)
LD>#define crWaitUntil(c)    do { crReturn(0); } while (!(c))
LD>#define crWaitUntilV(c)    do { crReturnV; } while (!(c))
LD>

Hands off the coroutines! This is the most beautiful implementation I?ve ever encountered! I?ve used a similar approach several times myself, as in:
#define COROUTINE static int _coroutineState = 0; switch(_coroutineState) case 0:
#define YIELD(_expr_) do { _coroutineState = __LINE__; return (_expr_); case __LINE__:; } while(0)

char nextMove() // this was from a TCMM
{
    COROUTINE
    {
        while(1)
        {
            assert(depth == 0);
 
            while(condition1)
            {
                YIELD('R');
            }
 
            YIELD('D');
 
            while(condition2)
            {
                YIELD('R');
            }
 
            YIELD('U');
        }
    }
}

If one calls nextMove() repeatedly, one would get something like RRRDRRURRRRRRRRDRURR... (the return value depends on the place where the function returned the previous time).

Sorry for the offtopic language, all I get when trying to post in Russian is krakozyabras.
До последнего не верил в пирамиду Лебедева.
Re: Качество кода open-source
От: Константин Л.  
Дата: 22.05.08 21:23
Оценка: 3 (1)
Здравствуйте, Lonely Dog, Вы писали:

[]

имею дело с thunderbird. резюме — дерьмо. методы на 1500 строк в порядке вещей. свичи на 1500 строк в порядке вещей. написано просто грязно. как это работает я не представляю.
Re: Качество кода open-source
От: gdm Голландия http://smartmobilelab.com
Дата: 14.04.09 10:07
Оценка: 3 (1)
LD>Мне интересно, весь open-source написан так же или это мне так повезло?
LD>Как при таком качестве кода они умудряются что-то разумное делать?

Вот [url=http://savesources.com/index.html]тут[url] можно увидеть, что количество например использования strlen в условии циклов в опен соурс проектах около 50 000, что тоже говорит об низком качестве. Но это средняя тепмература по палате у популярных проектов думаю все ок с понятностью кода.
Да и потом, в закрытом коде можно такое увидеть ....


Dmytro Gorbunov
http://savesources.com
Dmytro Gorbunov
Re[2]: Качество кода open-source
От: azzx Россия  
Дата: 23.05.08 03:21
Оценка: 2 (1)
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Lonely Dog, Вы писали:


КЛ>[]


КЛ>имею дело с thunderbird. резюме — дерьмо. методы на 1500 строк в порядке вещей. свичи на 1500 строк в порядке вещей. написано просто грязно. как это работает я не представляю.


А они точно кодогенерацию не применяют нигде? У меня бывают в СПЕЦИФИЧЕСКИХ случаях такие методы — но всегда в том или ином варианте используется кодогенерация, ибо я не идиот это ручками поддерживать. Так что вся "поддержка" такого кода заключается в изменении настроек кодогенератора ( и не важно что это — список вызовов макросов в отдельном файле, Excel-таблица с макросами на VBA или действительно специально написанная программа).
Re: Качество кода open-source
От: SergeCpp Россия http://zoozahita.ru
Дата: 23.05.08 04:10
Оценка: 2 (1)
Здравствуйте, Lonely Dog!

LD>Сразу же хочу сказать, что я свои выводы я сделал на основании просмотра одной open-source программы...


Это ещё цветочки

Ягодки — вот тут
Автор: SergeCpp
Дата: 08.02.07
http://zoozahita.ruБездомные животные Екатеринбурга ищут хозяев
Re[3]: �������� ���� open-source
От: Roman Odaisky Украина  
Дата: 23.05.08 07:43
Оценка: 1 (1)
Здравствуйте, Lonely Dog, Вы писали:

RO>>If one calls nextMove() repeatedly, one would get something like RRRDRRURRRRRRRRDRURR... (the return value depends on the place where the function returned the previous time).

LD>Неужели этого нельзя добиться менее грязным способом?

Это была задачка с топкодера. Нужно управлять буром, который добывает минералы по мотивам флеш-игры «Motherload». Нужно сделать функцию наподобие char move(Field), т. е., они тебе информацию о ближайших видимых ячейках (которые содержат (или не содержат) полезные ископаемые), а ты им 'U', 'D', 'L' или 'R'.

Вот ты уже принял решение: нужно опуститься на глубину 42 единицы, т. е., ближайшие 42 раза нужно возвращать 'D'. Как бы ты это сделал?
for(i = 0; i < 42; ++i)
{
    YIELD('D');
}
До последнего не верил в пирамиду Лебедева.
Re[3]: Качество кода open-source
От: OCTAGRAM Россия http://octagram.name/
Дата: 24.05.08 02:26
Оценка: 1 (1)
Lonely Dog пишет:
> Здравствуйте, Cyberax, Вы писали:
>
> C>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог
> перенести, сейчас пакет делаю (https://launchpad.net/putty2).
> Ну не знаю. У меня голова опухла после одного дня копания в этом коде.

Руслан Богатырёв посвятил "открытости" несколько страниц своего журнала:

http://rbogatyrev.livejournal.com/6402.html

Открытость содержания (идеи, технологии) ныне подменяется открытостью
формы (исходный текст). И это подается чуть ли не как идеал.

И вот уже известный специалист в области программирования, Диомидис
Спинеллис, пишет обстоятельную книгу “Анализ программного кода на
примере проектов Open Source” (2004), где раскрывает подходы к тому, как
извлекать технические решения и используемые методы, ковыряясь в чужом
исходном тексте. Потрясающе! Получается, что исходные тексты — это
одолжение, которое делают его разработчики, не удосужившиеся подготовить
детальную проектную документацию (некогда, лень, жалко) и при этом не
чурающиеся получать деньги за передачу формы, утаив содержание.

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


Именно поэтому я бы не стал придираться к исходным текстам самим по
себе, ведь это сделало бы бессмысленным внесение наукоёмких элементов.

Что касается PuTTY: лично мне сопрограммы вообще и сопрограммы на C в
частности (libprotothread) были знакомы давно, и я их понимаю.

http://rbogatyrev.livejournal.com/6237.html

Всегда хорошо иметь исходники, но проблема состоит в том, что
зачастую их недостаточно. Чтобы понять некоторую нетривиальную
программу, обычно требуется дополнительная документация. Эта потребность
растёт экспоненциально с ростом объема кода. Анализ текстов программ,
направленный на восстановление первоначальных проектных решений,
принятых разработчиками, и понимание программ являются двумя важными
ветвями технологии программирования, существование которых неразрывно
связано с недостаточностью исходных текстов для понимания программ. В
качестве примера попробуйте понять структуру нетривиального компилятора
при условии, что вы не располагаете определением того языка, который им
компилируется”.


> C>Используется подход с С coroutines, описаный вот здесь:

> http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
> C>Об этом, кстати, в их доке по разработке сказано.
> Доку по разработке читал. Легче не стало. Как это отлаживать то?

Вариант написать это на языке, где сопрограммы на хак, а часть языка,
улучшит положение? Вот на Модуле–2, например?

--
ISO/IEC 8652:1995/Amd 1:2007
Posted via RSDN NNTP Server 2.1 beta
Re[7]: �������� ���� open-source
От: Cyberax Марс  
Дата: 24.05.08 03:15
Оценка: 1 (1)
Здравствуйте, max779, Вы писали:

M>Вот именно, что магическим образом обновляет... Я больше чем уверен, что это все можно было переписать просто рекурсией.

Нельзя. Ты не понимаешь суть сопрограмм.

В Putty, фактически, они используются для организации state-машины протокола SSH. То есть, когда Putty получает данные — она вызывает функцию обработки, которая что-то делает (изменяя состояние), а потом возвращается в основной цикл.

Без state-машины можно было бы обойтись, но тогда потребовалось бы создавать по потоку на соединение, что противоречит дизайну Putty (оно работает на классических Mac'ах без потоков).
Sapienti sat!
Re[2]: Качество кода open-source
От: Lonely Dog Россия  
Дата: 23.05.08 07:15
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог перенести, сейчас пакет делаю (https://launchpad.net/putty2).

Ну не знаю. У меня голова опухла после одного дня копания в этом коде.


C>Используется подход с С coroutines, описаный вот здесь: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html

C>Об этом, кстати, в их доке по разработке сказано.
Доку по разработке читал. Легче не стало. Как это отлаживать то? На code-review я бы вынес автора этого кода. Ему бы пришлось его переписывать полностью.
Re[2]: Качество кода open-source
От: Lonely Dog Россия  
Дата: 23.05.08 07:17
Оценка: +1
Здравствуйте, superlexx, Вы писали:

S>им просто надо было использовать __COUNTER__ вместо __LINE__ под MSVC. Сейчас навалял себе небольшой вспомогательный класс с __COUNTER__, очень понравилось. Практически получается C#-овский yield (не так же красиво, но всё-таки).

После этого код бы собирался? Это хорошо. Но все равно, он остался бы нечитаемым.
Re[2]: Качество кода open-source
От: squid  
Дата: 23.05.08 07:29
Оценка: +1
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Lonely Dog, Вы писали:


КЛ>[]


КЛ>имею дело с thunderbird. резюме — дерьмо. методы на 1500 строк в порядке вещей. свичи на 1500 строк в порядке вещей. написано просто грязно. как это работает я не представляю.


ну, мне как пользователю он очень нравицца особенно если вспомнить что запускается мгновенно, а The Bat! минуту шуршит.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: �������� ���� open-source
От: max779 Россия  
Дата: 23.05.08 09:12
Оценка: +1
Здравствуйте, Roman Odaisky, Вы писали:

RO>Это была задачка с топкодера. Нужно управлять буром, который добывает минералы по мотивам флеш-игры «Motherload». Нужно сделать функцию наподобие char move(Field), т. е., они тебе информацию о ближайших видимых ячейках (которые содержат (или не содержат) полезные ископаемые), а ты им 'U', 'D', 'L' или 'R'.


RO>Вот ты уже принял решение: нужно опуститься на глубину 42 единицы, т. е., ближайшие 42 раза нужно возвращать 'D'. Как бы ты это сделал?


Я бы сделал вариацию на тему:

queue<char> m_vNextMoves;
char GetCharFromNextMoves()
{
    char chRet = -1;
    if (m_vNextMoves.size())
    {
        chRet = m_vNextMoves.front();
        m_vNextMoves.pop();
    }
    return chRet;
}
public:
char move(int iField)
{
    if (m_vNextMoves.size())
         return GetCharFromNextMoves();
..........
    for (int i = 0; i < 42; i++)
    {
        m_vNextMoves.push('D');
    }
    return (GetCharFromNextMoves());
............
}


Ну там естественно от задачи все зависит, может вообще рекурсивно в каждой ячейке смотрел бы куда идти. Может и развернул бы эту рекурсию в цикл. В общем, обойти можно по разному, но только не таким извратом.
Кстати, расскажите, чем конкретно эти дикие define лучше кода выше? По читаемости и сопровождаемости, ИМХО, этот лучше.
Но может меня тут переубедят и я проникнусь и так же писать начну...
Re[3]: Качество кода open-source
От: Константин Л.  
Дата: 23.05.08 10:29
Оценка: :)
Здравствуйте, squid, Вы писали:

[]

S>ну, мне как пользователю он очень нравицца особенно если вспомнить что запускается мгновенно, а The Bat! минуту шуршит.


мне тоже, поэтому я и удивляюсь, как _это_ работает
Re[2]: Качество кода open-source
От: Draqon  
Дата: 23.05.08 11:15
Оценка: :)
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>ИМХО, зря ты так поспешил охаять этот код :



PuTTY is a Win32 Telnet and SSH client. The SSH protocol code contains real-life use of this coroutine trick. As far as I know, this is the worst piece of C hackery ever seen in serious production code. © Simon Tatham


Так что он сам его хаит
Re[6]: Качество кода open-source
От: squid  
Дата: 23.05.08 14:39
Оценка: -1
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, squid, Вы писали:


КЛ>[]


S>>вывод — если хорошо работает и все нравицца — нефиг смотреть как оно сделано


КЛ>мне туда лазить приходится. и при любой такой необходимости к каждому члену нашей команды приходит депрессия


всякое бывает. судя по этому форуму (за последний месяц) плохие вещи принято писать на Дельфи а не на Сях.

вообще я реально люблю Thuderbird и на дух не переношу Firefox. как раз потому что птичка летает а лиса тормозит
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Качество кода open-source
От: squid  
Дата: 23.05.08 15:08
Оценка: :)
Здравствуйте, Sergey, Вы писали:

S>squid пишет:


>> вообще я реально люблю Thuderbird и на дух не переношу Firefox. как раз

>> потому что птичка летает а лиса тормозит

S>Странно, а мне наоборот показалось Особенно на ньюсах — тормознее

S>птички я ни одной ньюсочиталки не видел.

ньюс это что? RSS?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Сопрограммы
От: Roman Odaisky Украина  
Дата: 23.05.08 17:11
Оценка: -1
Здравствуйте, max779, Вы писали:

M>Вот именно, что магическим образом обновляет... Я больше чем уверен, что это все можно было переписать просто рекурсией.

M>Второй вариант явно лучше только потому, что там нет этих магических обновлений. Правда там тоже перестарался, видимо разворачивал рекурсию в цикл. И явно этот код можно было написать лучше.
M>В общем, меня не убедили. А основной косяк этого подхода вот в чем: вот ты пишешь программу и пользуешься этими магическими YIELD и т.д. Потом ты увольняешься, на твое место приходит другой кодер и он не знаком с этим делом... Он конечно познакомится рано или поздно и перепишет весь твой код без этих макросов. И только потому что, чтобы хранить в уме эти магические обновления и переходы надо намного больше усилий... В общем, его мнение о тебе будет таким же как у Lonely Dog об open source.
M>Помните: программы пишутся для человека, а не для машины. Машина разберется в любых goto, а вот у человека голова опухнет...

Ты решил присоединиться к Шеридану, посылавшему Python в печку? В Python есть yield, в C# вроде бы тоже есть что-то похожее.

И Кнута заодно туда же за пропаганду еретических подходов к программированию.
До последнего не верил в пирамиду Лебедева.
Re[2]: Качество кода open-source
От: Nuzik Россия  
Дата: 24.05.08 19:08
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Используется подход с С coroutines, описаный вот здесь: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html


Это мое ИМХО, но помойму Duff's Device это всё же мозго**ство. Вообще, насколько я знаю — PuTTY единственный крупный Open Source проект, где оный девайс используется.
Re[2]: Качество кода open-source
От: Roman Odaisky Украина  
Дата: 24.05.08 19:59
Оценка: +1
Здравствуйте, BigBoss, Вы писали:

LD>>Мне интересно, весь open-source написан так же или это мне так повезло?


BB>Да, во всяком случае та часть, которая не получена от коммерческих фирм ;(


Просится вопрос: всю ли эту часть Open Source благородный дон имел возможность проанализировать?
До последнего не верил в пирамиду Лебедева.
Re: Качество кода open-source
От: shrecher  
Дата: 25.05.08 01:57
Оценка: +1
Такое качество кодо достаточно типично для OSS. Похоже код хоть и открытый, поддерживается каким-то одним Гуру. Весь дезайн и идея кода у него в голове. Если попытаться разобраться, что делает bzip2, то крыша едет очень скоро. Так как

1. часто нет описания идеи что каждый модуль делает. Ее можно вытащить из кода, но долго
2. Минимум комментариев даже для очень нетривиальных методов
s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];

3. Магические констатны смысл которых может вытекать из общей картины, но не из конкретного метода.
if (uc == 0x17) goto endhdr_2;

4. Опять макросы, длинные функции по 500 и больше строк
5. однобуквенные названия переменных (j,i,n,s)
6. использование одной и тожей переменной в разынх контекстах.
7. минимальная проверка на ошибки

Разобраться в этой каше, конечно можно, но на это уйдет куча времени и сил. Производительность труда резко падает. Желание работать с таким кодом исчезает очень бысро.

Вывод: Если сравнить с закрытым кодом, к примеру Windows, то очевидно, что OSS проигрывает в качестве очень сильно. Такой код поддерживать очень сложно и весь процесс становится зависимым от индивидуалов.

Примеры bzip2

#define GET_BITS(lll,vvv,nnn)                     \
   case lll: s->state = lll;                      \
   while (True) {                                 \
      if (s->bsLive >= nnn) {                     \
         UInt32 v;                                \
         v = (s->bsBuff >>                        \
             (s->bsLive-nnn)) & ((1 << nnn)-1);   \
         s->bsLive -= nnn;                        \
         vvv = v;                                 \
         break;                                   \
      }                                           \
      if (s->strm->avail_in == 0) RETURN(BZ_OK);  \
      s->bsBuff                                   \
         = (s->bsBuff << 8) |                     \
           ((UInt32)                              \
              (*((UChar*)(s->strm->next_in))));   \
      s->bsLive += 8;                             \
      s->strm->next_in++;                         \
      s->strm->avail_in--;                        \
      s->strm->total_in_lo32++;                   \
      if (s->strm->total_in_lo32 == 0)            \
         s->strm->total_in_hi32++;                \
   }

#define GET_UCHAR(lll,uuu)                        \
   GET_BITS(lll,uuu,8)

#define GET_BIT(lll,uuu)                          \
   GET_BITS(lll,uuu,1)

/*---------------------------------------------------*/
#define GET_MTF_VAL(label1,label2,lval)           \
{                                                 \
   if (groupPos == 0) {                           \
      groupNo++;                                  \
      if (groupNo >= nSelectors)                  \
         RETURN(BZ_DATA_ERROR);                   \
      groupPos = BZ_G_SIZE;                       \
      gSel = s->selector[groupNo];                \
      gMinlen = s->minLens[gSel];                 \
      gLimit = &(s->limit[gSel][0]);              \
      gPerm = &(s->perm[gSel][0]);                \
      gBase = &(s->base[gSel][0]);                \
   }                                              \
   groupPos--;                                    \
   zn = gMinlen;                                  \
   GET_BITS(label1, zvec, zn);                    \
   while (1) {                                    \
      if (zn > 20 /* the longest code */)         \
         RETURN(BZ_DATA_ERROR);                   \
      if (zvec <= gLimit[zn]) break;              \
      zn++;                                       \
      GET_BIT(label2, zj);                        \
      zvec = (zvec << 1) | zj;                    \
   };                                             \
   if (zvec - gBase[zn] < 0                       \
       || zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE)  \
      RETURN(BZ_DATA_ERROR);                      \
   lval = gPerm[zvec - gBase[zn]];                \


Int32 BZ2_decompress ( DState* s )
{
   UChar      uc;
   Int32      retVal;
   Int32      minLen, maxLen;
   bz_stream* strm = s->strm;

   /* stuff that needs to be saved/restored */
   Int32  i;
   Int32  j;
   Int32  t;
   Int32  alphaSize;
   Int32  nGroups;
   Int32  nSelectors;
   Int32  EOB;
   Int32  groupNo;
   Int32  groupPos;
   Int32  nextSym;
   Int32  nblockMAX;
   Int32  nblock;
   Int32  es;
   Int32  N;
   Int32  curr;
   Int32  zt;
   Int32  zn; 
   Int32  zvec;
   Int32  zj;
   Int32  gSel;
   Int32  gMinlen;
   Int32* gLimit;
   Int32* gBase;
   Int32* gPerm;

   if (s->state == BZ_X_MAGIC_1) {
      /*initialise the save area*/
      s->save_i           = 0;
      s->save_j           = 0;
      s->save_t           = 0;
      s->save_alphaSize   = 0;
      s->save_nGroups     = 0;
      s->save_nSelectors  = 0;
      s->save_EOB         = 0;
      s->save_groupNo     = 0;
      s->save_groupPos    = 0;
      s->save_nextSym     = 0;
      s->save_nblockMAX   = 0;
      s->save_nblock      = 0;
      s->save_es          = 0;
      s->save_N           = 0;
      s->save_curr        = 0;
      s->save_zt          = 0;
      s->save_zn          = 0;
      s->save_zvec        = 0;
      s->save_zj          = 0;
      s->save_gSel        = 0;
      s->save_gMinlen     = 0;
      s->save_gLimit      = NULL;
      s->save_gBase       = NULL;
      s->save_gPerm       = NULL;
   }

   /*restore from the save area*/
   i           = s->save_i;
   j           = s->save_j;
   t           = s->save_t;
   alphaSize   = s->save_alphaSize;
   nGroups     = s->save_nGroups;
   nSelectors  = s->save_nSelectors;
   EOB         = s->save_EOB;
   groupNo     = s->save_groupNo;
   groupPos    = s->save_groupPos;
   nextSym     = s->save_nextSym;
   nblockMAX   = s->save_nblockMAX;
   nblock      = s->save_nblock;
   es          = s->save_es;
   N           = s->save_N;
   curr        = s->save_curr;
   zt          = s->save_zt;
   zn          = s->save_zn; 
   zvec        = s->save_zvec;
   zj          = s->save_zj;
   gSel        = s->save_gSel;
   gMinlen     = s->save_gMinlen;
   gLimit      = s->save_gLimit;
   gBase       = s->save_gBase;
   gPerm       = s->save_gPerm;

   retVal = BZ_OK;

   switch (s->state) {

      GET_UCHAR(BZ_X_MAGIC_1, uc);
      if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);

      GET_UCHAR(BZ_X_MAGIC_2, uc);
      if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);

      GET_UCHAR(BZ_X_MAGIC_3, uc)
      if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);

      GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
      if (s->blockSize100k < (BZ_HDR_0 + 1) || 
          s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
      s->blockSize100k -= BZ_HDR_0;

      if (s->smallDecompress) {
         s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
         s->ll4  = BZALLOC( 
                      ((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar) 
                   );
         if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
      } else {
         s->tt  = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
         if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
      }

      GET_UCHAR(BZ_X_BLKHDR_1, uc);

      if (uc == 0x17) goto endhdr_2;
      if (uc != 0x31) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_BLKHDR_2, uc);
      if (uc != 0x41) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_BLKHDR_3, uc);
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_BLKHDR_4, uc);
      if (uc != 0x26) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_BLKHDR_5, uc);
      if (uc != 0x53) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_BLKHDR_6, uc);
      if (uc != 0x59) RETURN(BZ_DATA_ERROR);

      s->currBlockNo++;
      if (s->verbosity >= 2)
         VPrintf1 ( "\n    [%d: huff+mtf ", s->currBlockNo );
 
      s->storedBlockCRC = 0;
      GET_UCHAR(BZ_X_BCRC_1, uc);
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
      GET_UCHAR(BZ_X_BCRC_2, uc);
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
      GET_UCHAR(BZ_X_BCRC_3, uc);
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
      GET_UCHAR(BZ_X_BCRC_4, uc);
      s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);

      GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);

      s->origPtr = 0;
      GET_UCHAR(BZ_X_ORIGPTR_1, uc);
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
      GET_UCHAR(BZ_X_ORIGPTR_2, uc);
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);
      GET_UCHAR(BZ_X_ORIGPTR_3, uc);
      s->origPtr = (s->origPtr << 8) | ((Int32)uc);

      if (s->origPtr < 0)
         RETURN(BZ_DATA_ERROR);
      if (s->origPtr > 10 + 100000*s->blockSize100k) 
         RETURN(BZ_DATA_ERROR);

      /*--- Receive the mapping table ---*/
      for (i = 0; i < 16; i++) {
         GET_BIT(BZ_X_MAPPING_1, uc);
         if (uc == 1) 
            s->inUse16[i] = True; else 
            s->inUse16[i] = False;
      }

      for (i = 0; i < 256; i++) s->inUse[i] = False;

      for (i = 0; i < 16; i++)
         if (s->inUse16[i])
            for (j = 0; j < 16; j++) {
               GET_BIT(BZ_X_MAPPING_2, uc);
               if (uc == 1) s->inUse[i * 16 + j] = True;
            }
      makeMaps_d ( s );
      if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
      alphaSize = s->nInUse+2;

      /*--- Now the selectors ---*/
      GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
      if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
      GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
      if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
      for (i = 0; i < nSelectors; i++) {
         j = 0;
         while (True) {
            GET_BIT(BZ_X_SELECTOR_3, uc);
            if (uc == 0) break;
            j++;
            if (j >= nGroups) RETURN(BZ_DATA_ERROR);
         }
         s->selectorMtf[i] = j;
      }

      /*--- Undo the MTF values for the selectors. ---*/
      {
         UChar pos[BZ_N_GROUPS], tmp, v;
         for (v = 0; v < nGroups; v++) pos[v] = v;
   
         for (i = 0; i < nSelectors; i++) {
            v = s->selectorMtf[i];
            tmp = pos[v];
            while (v > 0) { pos[v] = pos[v-1]; v--; }
            pos[0] = tmp;
            s->selector[i] = tmp;
         }
      }

      /*--- Now the coding tables ---*/
      for (t = 0; t < nGroups; t++) {
         GET_BITS(BZ_X_CODING_1, curr, 5);
         for (i = 0; i < alphaSize; i++) {
            while (True) {
               if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
               GET_BIT(BZ_X_CODING_2, uc);
               if (uc == 0) break;
               GET_BIT(BZ_X_CODING_3, uc);
               if (uc == 0) curr++; else curr--;
            }
            s->len[t][i] = curr;
         }
      }

      /*--- Create the Huffman decoding tables ---*/
      for (t = 0; t < nGroups; t++) {
         minLen = 32;
         maxLen = 0;
         for (i = 0; i < alphaSize; i++) {
            if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
            if (s->len[t][i] < minLen) minLen = s->len[t][i];
         }
         BZ2_hbCreateDecodeTables ( 
            &(s->limit[t][0]), 
            &(s->base[t][0]), 
            &(s->perm[t][0]), 
            &(s->len[t][0]),
            minLen, maxLen, alphaSize
         );
         s->minLens[t] = minLen;
      }

      /*--- Now the MTF values ---*/

      EOB      = s->nInUse+1;
      nblockMAX = 100000 * s->blockSize100k;
      groupNo  = -1;
      groupPos = 0;

      for (i = 0; i <= 255; i++) s->unzftab[i] = 0;

      /*-- MTF init --*/
      {
         Int32 ii, jj, kk;
         kk = MTFA_SIZE-1;
         for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
            for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
               s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
               kk--;
            }
            s->mtfbase[ii] = kk + 1;
         }
      }
      /*-- end MTF init --*/

      nblock = 0;
      GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);

      while (True) {

         if (nextSym == EOB) break;

         if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {

            es = -1;
            N = 1;
            do {
               if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
               if (nextSym == BZ_RUNB) es = es + (1+1) * N;
               N = N * 2;
               GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
            }
               while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);

            es++;
            uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
            s->unzftab[uc] += es;

            if (s->smallDecompress)
               while (es > 0) {
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
                  s->ll16[nblock] = (UInt16)uc;
                  nblock++;
                  es--;
               }
            else
               while (es > 0) {
                  if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
                  s->tt[nblock] = (UInt32)uc;
                  nblock++;
                  es--;
               };

            continue;

         } else {

            if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);

            /*-- uc = MTF ( nextSym-1 ) --*/
            {
               Int32 ii, jj, kk, pp, lno, off;
               UInt32 nn;
               nn = (UInt32)(nextSym - 1);

               if (nn < MTFL_SIZE) {
                  /* avoid general-case expense */
                  pp = s->mtfbase[0];
                  uc = s->mtfa[pp+nn];
                  while (nn > 3) {
                     Int32 z = pp+nn;
                     s->mtfa[(z)  ] = s->mtfa[(z)-1];
                     s->mtfa[(z)-1] = s->mtfa[(z)-2];
                     s->mtfa[(z)-2] = s->mtfa[(z)-3];
                     s->mtfa[(z)-3] = s->mtfa[(z)-4];
                     nn -= 4;
                  }
                  while (nn > 0) { 
                     s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--; 
                  };
                  s->mtfa[pp] = uc;
               } else { 
                  /* general case */
                  lno = nn / MTFL_SIZE;
                  off = nn % MTFL_SIZE;
                  pp = s->mtfbase[lno] + off;
                  uc = s->mtfa[pp];
                  while (pp > s->mtfbase[lno]) { 
                     s->mtfa[pp] = s->mtfa[pp-1]; pp--; 
                  };
                  s->mtfbase[lno]++;
                  while (lno > 0) {
                     s->mtfbase[lno]--;
                     s->mtfa[s->mtfbase[lno]] 
                        = s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
                     lno--;
                  }
                  s->mtfbase[0]--;
                  s->mtfa[s->mtfbase[0]] = uc;
                  if (s->mtfbase[0] == 0) {
                     kk = MTFA_SIZE-1;
                     for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
                        for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
                           s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
                           kk--;
                        }
                        s->mtfbase[ii] = kk + 1;
                     }
                  }
               }
            }
            /*-- end uc = MTF ( nextSym-1 ) --*/

            s->unzftab[s->seqToUnseq[uc]]++;
            if (s->smallDecompress)
               s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
               s->tt[nblock]   = (UInt32)(s->seqToUnseq[uc]);
            nblock++;

            GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
            continue;
         }
      }

      /* Now we know what nblock is, we can do a better sanity
         check on s->origPtr.
      */
      if (s->origPtr < 0 || s->origPtr >= nblock)
         RETURN(BZ_DATA_ERROR);

      /*-- Set up cftab to facilitate generation of T^(-1) --*/
      s->cftab[0] = 0;
      for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
      for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
      for (i = 0; i <= 256; i++) {
         if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
            /* s->cftab[i] can legitimately be == nblock */
            RETURN(BZ_DATA_ERROR);
         }
      }

      s->state_out_len = 0;
      s->state_out_ch  = 0;
      BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
      s->state = BZ_X_OUTPUT;
      if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );

      if (s->smallDecompress) {

         /*-- Make a copy of cftab, used in generation of T --*/
         for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];

         /*-- compute the T vector --*/
         for (i = 0; i < nblock; i++) {
            uc = (UChar)(s->ll16[i]);
            SET_LL(i, s->cftabCopy[uc]);
            s->cftabCopy[uc]++;
         }

         /*-- Compute T^(-1) by pointer reversal on T --*/
         i = s->origPtr;
         j = GET_LL(i);
         do {
            Int32 tmp = GET_LL(j);
            SET_LL(j, i);
            i = j;
            j = tmp;
         }
            while (i != s->origPtr);

         s->tPos = s->origPtr;
         s->nblock_used = 0;
         if (s->blockRandomised) {
            BZ_RAND_INIT_MASK;
            BZ_GET_SMALL(s->k0); s->nblock_used++;
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
         } else {
            BZ_GET_SMALL(s->k0); s->nblock_used++;
         }

      } else {

         /*-- compute the T^(-1) vector --*/
         for (i = 0; i < nblock; i++) {
            uc = (UChar)(s->tt[i] & 0xff);
            s->tt[s->cftab[uc]] |= (i << 8);
            s->cftab[uc]++;
         }

         s->tPos = s->tt[s->origPtr] >> 8;
         s->nblock_used = 0;
         if (s->blockRandomised) {
            BZ_RAND_INIT_MASK;
            BZ_GET_FAST(s->k0); s->nblock_used++;
            BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK; 
         } else {
            BZ_GET_FAST(s->k0); s->nblock_used++;
         }

      }

      RETURN(BZ_OK);



    endhdr_2:

      GET_UCHAR(BZ_X_ENDHDR_2, uc);
      if (uc != 0x72) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_ENDHDR_3, uc);
      if (uc != 0x45) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_ENDHDR_4, uc);
      if (uc != 0x38) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_ENDHDR_5, uc);
      if (uc != 0x50) RETURN(BZ_DATA_ERROR);
      GET_UCHAR(BZ_X_ENDHDR_6, uc);
      if (uc != 0x90) RETURN(BZ_DATA_ERROR);

      s->storedCombinedCRC = 0;
      GET_UCHAR(BZ_X_CCRC_1, uc);
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
      GET_UCHAR(BZ_X_CCRC_2, uc);
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
      GET_UCHAR(BZ_X_CCRC_3, uc);
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
      GET_UCHAR(BZ_X_CCRC_4, uc);
      s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);

      s->state = BZ_X_IDLE;
      RETURN(BZ_STREAM_END);

      default: AssertH ( False, 4001 );
   }

   AssertH ( False, 4002 );

   save_state_and_return:

   s->save_i           = i;
   s->save_j           = j;
   s->save_t           = t;
   s->save_alphaSize   = alphaSize;
   s->save_nGroups     = nGroups;
   s->save_nSelectors  = nSelectors;
   s->save_EOB         = EOB;
   s->save_groupNo     = groupNo;
   s->save_groupPos    = groupPos;
   s->save_nextSym     = nextSym;
   s->save_nblockMAX   = nblockMAX;
   s->save_nblock      = nblock;
   s->save_es          = es;
   s->save_N           = N;
   s->save_curr        = curr;
   s->save_zt          = zt;
   s->save_zn          = zn;
   s->save_zvec        = zvec;
   s->save_zj          = zj;
   s->save_gSel        = gSel;
   s->save_gMinlen     = gMinlen;
   s->save_gLimit      = gLimit;
   s->save_gBase       = gBase;
   s->save_gPerm       = gPerm;

   return retVal;   
}
Re: Качество кода open-source
От: minorlogic Украина  
Дата: 25.05.08 15:59
Оценка: +1
Не понимаю к чему этот пример , есть код и открытый и закрытый очень разного качества.

Уж про качества закрытого кода я не могу без слез расказывать. Когда под руководством невменяемого начальника толпаиндусокодеров пишет целую кучу говна , и потом удивляется почему не работает ?

или как обратный пример , HEAAC кодек от coding technologies или GPC или тотже antigrain ? да и сравнивать закрытый и открытый софт мы по определению не можем , так как закрытый код нам не доступен по определению.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[4]: Качество кода open-source
От: Cyberax Марс  
Дата: 25.05.08 20:28
Оценка: +1
Здравствуйте, Maxim S. Shatskih, Вы писали:

С>>Ты знаком со всем open-source кодом?

MSS>Нет, но с многим. Угребищный стиль кодирования там норма.
Взял несколько проектов, которые у меня сейчас лежат в виде исходников (кроме ядра Линукса) и взял оттуда наугад кусок кода.

1) Cairo — обычный чистый С-шный код, ничего особого.
/* Currently all meta surfaces do have a size which should be passed
 * in as the maximum size of any target surface against which the
 * meta-surface will ever be replayed.
 *
 * XXX: The naming of "pixels" in the size here is a misnomer. It's
 * actually a size in whatever device-space units are desired (again,
 * according to the intended replay target). This should likely also
 * be changed to use doubles not ints.
 */
cairo_surface_t *
_cairo_meta_surface_create (cairo_content_t    content,
                int            width_pixels,
                int            height_pixels)
{
    cairo_meta_surface_t *meta;

    meta = malloc (sizeof (cairo_meta_surface_t));
    if (meta == NULL)
    return _cairo_surface_create_in_error (_cairo_error (CAIRO_STATUS_NO_MEMORY));

    _cairo_surface_init (&meta->base, &cairo_meta_surface_backend,
             content);

    meta->content = content;
    meta->width_pixels = width_pixels;
    meta->height_pixels = height_pixels;

    _cairo_array_init (&meta->commands, sizeof (cairo_command_t *));
    meta->commands_owner = NULL;

    meta->is_clipped = FALSE;
    meta->replay_start_idx = 0;

    return &meta->base;
}


2) Gnash — обычный код на С++:
as_value
AsBroadcaster::removeListener_method(const fn_call& fn)
{
    boost::intrusive_ptr<as_object> obj = fn.this_ptr;

    as_value listenersValue;

    // TODO: test if we're supposed to crawl the target object's 
    //       inheritance chain in case it's own property _listeners 
    //       has been deleted while another one is found in any base
    //       class.
    if (!obj->get_member(NSV::PROP_uLISTENERS, &listenersValue) )
    {
        IF_VERBOSE_ASCODING_ERRORS(
        log_aserror(_("%p.addListener(%s): this object has no _listeners member"),
            (void*)fn.this_ptr.get(),
            fn.dump_args().c_str());
        );
        return as_value(false); // TODO: check this
    }

    // assuming no automatic primitive-to-object cast will return an array...
    if ( ! listenersValue.is_object() )
    {
        IF_VERBOSE_ASCODING_ERRORS(
        log_aserror(_("%p.addListener(%s): this object's _listener isn't an object: %s"),
            (void*)fn.this_ptr.get(),
            fn.dump_args().c_str(), listenersValue.to_debug_string().c_str());
        );
        return as_value(false); // TODO: check this
    }

    boost::intrusive_ptr<as_object> listenersObj = listenersValue.to_object();
    assert(listenersObj);

    as_value listenerToRemove; assert(listenerToRemove.is_undefined());
    if ( fn.nargs ) listenerToRemove = fn.arg(0);

    boost::intrusive_ptr<as_array_object> listeners = boost::dynamic_pointer_cast<as_array_object>(listenersObj);
    if ( ! listeners )
    {
        IF_VERBOSE_ASCODING_ERRORS(
        log_aserror(_("%p.addListener(%s): this object's _listener isn't an array: %s"),
            (void*)fn.this_ptr.get(),
            fn.dump_args().c_str(), listenersValue.to_debug_string().c_str());
        );

        // TODO: implement brute force scan of pseudo-array
        unsigned int length = listenersObj->getMember(NSV::PROP_LENGTH).to_int();
        for (unsigned int i=0; i<length; ++i)
        {
            as_value iVal(i);
            std::string n = iVal.to_string();
            as_value v = listenersObj->getMember(VM::get().getStringTable().find(n));
            if ( v.equals(listenerToRemove) )
            {
                listenersObj->callMethod(NSV::PROP_SPLICE, iVal, as_value(1));
                return as_value(true); 
            }
        }

        return as_value(false); // TODO: check this
    }
    else
    {
        // Remove the first listener matching the new value
        // See http://www.senocular.com/flash/tutorials/listenersasbroadcaster/?page=2
        // TODO: make this call as a normal (don't want to rely on _listeners type at all)
        bool removed = listeners->removeFirst(listenerToRemove);
        return as_value(removed);
    }

}


3) Upstart — неплохой код на С:
/**
 * job_unblock:
 * @job: job that is blocking,
 * @failed: mark events as failed.
 *
 * This function unblocks any events blocking on @job; it is called when the
 * job reaches a rest state (waiting for all, running for services), when a
 * new command is received or when the job fails.
 *
 * If @failed is TRUE then the events that are blocking will be marked as
 * failed.
 **/
void
job_unblock (Job *job,
         int  failed)
{
    nih_assert (job != NULL);

    if (job->blocking) {
        NIH_LIST_FOREACH (job->blocking, iter) {
            NihListEntry *entry = (NihListEntry *)iter;
            Event        *event = (Event *)entry->data;

            nih_assert (event != NULL);

            if (failed)
                event->failed = TRUE;

            event_unblock (event);
        }

        nih_free (job->blocking);
        job->blocking = NULL;
    }
}


Вполне нормальный код, в общем.
Sapienti sat!
Re[9]: Сопрограммы
От: Cyberax Марс  
Дата: 26.05.08 10:02
Оценка: :)
Здравствуйте, max779, Вы писали:

M>А при чем тут Кнут? Он описывал программирование на языке низкого уровня. А на ассемблере всякие yield, goto и т.п. вполне оправданы и необходимы. Но это же не означает, что его нужно применять всегда и везде! Мы же вроде не про ассемблер речь ведем? Вообще, это спор про то, нужен goto или не нужен. Так вот я считаю, что на языке высокого уровня его (и этого yield) быть не должно. Ну в смысле, в самом-то языке нужен конечно, т.к. это упрощает портирование старых программ. Но писать новый код так нельзя.

Точно! yield в топку! Даёшь нормальные замыкания!
Sapienti sat!
Re[12]: Качество кода open-source
От: Roman Odaisky Украина  
Дата: 26.05.08 17:03
Оценка: :)
Здравствуйте, Константин Л., Вы писали:

S>>>>ньюс это что? RSS?

КЛ>>>nntp
RO>>Как низко мы пали...
КЛ>?

Ну это из более другого флейма (RSS против NNTP).
До последнего не верил в пирамиду Лебедева.
Re[6]: Качество кода open-source
От: Roman Odaisky Украина  
Дата: 27.05.08 09:52
Оценка: :)
Здравствуйте, BigBoss, Вы писали:

BB>Не знаю, но не удивлюсь, если они отвечают за замену языка по умолчанию с английского на русский. Или они еще должны ответить, почему, например, неновая видеокарта от nVidia+HDMI монитор распознаются не как Вистой, а как VESA-совместимая с максимальным разрешением 800х600х16 и аналоговым выходом? ;)


А что тут неправильного? HDMI — это и есть самый настоящий вистой...
До последнего не верил в пирамиду Лебедева.
Re[13]: Сопрограммы
От: Cyberax Марс  
Дата: 27.05.08 12:38
Оценка: :)
Здравствуйте, WolfHound, Вы писали:

C>>Ну если постараться, то кое-что можно придумать.

WH>Что?
WH>Только общий случай пожалуйста.
Общего случая не будет. А для части вполне подойдёт представление продолжения в виде объекта со счётчиком ссылок.
Sapienti sat!
Re[3]: Качество кода open-source
От: Cyberax Марс  
Дата: 27.05.08 12:38
Оценка: +1
Здравствуйте, jazzer, Вы писали:

C>>Нормально его поддерживают.

J>А можно подробнее? А то я им письмо с патчем послал с полгода назад, и ни ответа, ни привета...
Пинай их сильнее. А что за патч?
Sapienti sat!
Re[6]: Качество кода open-source
От: Cyberax Марс  
Дата: 27.05.08 18:33
Оценка: :)
Здравствуйте, Roman Odaisky, Вы писали:

S>>Странно, а мне казалось что OpenSSL весьма грамотно написана. В тех

S>>местах, в которые я заглядывал — все довольно понятно было.
RO>А потом криворукие патчеры убирают фрагменты кода, на которые ругается Purify

http://xkcd.com/424/
Sapienti sat!
Re[2]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.06.08 11:10
Оценка: -1
Здравствуйте, IT, Вы писали:

IT>Качество open-source кода абсолютно ничем не отличается от качества любого другого кода. Как и везде есть код хороший, есть не очень, есть откровенное дерьмо. Не думаю, что кривыми руками за деньги писать получится лучше, чем open-source.


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

В опенсорсе здесь просто анархия, держится на честном слове.
Re[6]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.06.08 10:00
Оценка: :)
Здравствуйте, Сергей, Вы писали:

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


В открытую разработку идет очень много тех, кого в разработке вообще не должно быть.

В серьезных конторах всегда есть контроль за качеством кода и уровнем подготовки девелоперов. Хороший код в опенсорсе очень часто тот, что был некогда закрытым в крупных конторах.
Re[8]: Качество кода open-source
От: Sheridan Россия  
Дата: 16.06.08 10:23
Оценка: :)
shrecher однажды (16 июня 2008 [Понедельник] 14:01) писал:

> Здравствуйте, Sheridan, Вы писали:

>
> S>Да и С заметно быстрее компилируется,
> На современном железе это не имеет большого значения.
Еще раз: С компилируется заметно быстрее С++. Это я тебе как гентушник говорю.

> S>несколько быстрее работает и потребляет меньше памяти...

> Очень не значително. Прой даже C++ быстрее, т.к. более оптимизирован компилятор производителями.
C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...
Да и вызовы в с++ частенько лишний шаг по vtable делают...

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[10]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.06.08 14:41
Оценка: +1
Здравствуйте, shrecher, Вы писали:

S>заметно быстрее это 20%? И что? Ждать вместо 40 секунд — 50. Велика беда?


Ну и проекты у тебя

Как на счет времени компиляции около двух трех часов на современном железе ?

S>>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...

S>>Да и вызовы в с++ частенько лишний шаг по vtable делают...

S>Это очень незначительный overhead особенно на современном железе. Сколько сейчас стоит 1 Gb памяти?


Это огромный оверхед на самом деле. Для платформы i32 разумеется.
Re[13]: Качество кода open-source
От: jazzer Россия Skype: enerjazzer
Дата: 17.06.08 06:24
Оценка: +1
Здравствуйте, Sheridan, Вы писали:

S>CreatorCray однажды (17 июня 2008 [Вторник] 09:44) писал:


>> S>Тебе страничку книги сфотографировать, где это написано?


да, с годом написания книги, пожалуйста.

S>Кусочек кода — согласен. Кусочек кода можно по всякому написать.

тем не менее ты, ничтоже сумняшеся, делаешь заявления типа "C++ в любом случае потребляет больше память".

S>А вот в проекте, с использованием библиотек, stl, и прочего какраз таки и появляется это "частенько".


Ну давай сравним, скажем, сортировку в стиле С++ (std::sort, std::less) и qsort (подсказка — в qsort ты передаешь указатель на функцию сравнения, так что у тебя там тучу раз будет сделан косвенный вызов функции сравнения, а в C++ все инлайновое).

А еще давай сравним производительность сишной программы и С++ метапрограммы, когда половина исполняется вообще на этапе компиляции.

Меня вообще удивляет, в С вызовы функций по указателям на каждом шагу, и ничего, а в С++ абсолютно такой же вызов по указателю в vtbl — все, немерянные издержки.

S>CreatorCray я не против с++, я даже за. Его удобство с головой покрывает все издержки.


Твоя подпись в тему

S>--

S>...belive in the matrix...
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[13]: Качество кода open-source
От: Sheridan Россия  
Дата: 17.06.08 09:17
Оценка: -1
Ikemefula однажды (17 июня 2008 [Вторник] 13:06) писал:

> S>Ну тогда тебе точно на С переходить.

> Я перешел на дотнет. Проект такого же масштаба компилится от силы пятнадцать минут.
Ну еще-бы интерпритаторокомпилятор долго компилил


--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[15]: Качество кода open-source
От: Sheridan Россия  
Дата: 17.06.08 09:50
Оценка: -1
Сергей однажды (17 июня 2008 [Вторник] 13:26) писал:

> S>Ну еще-бы интерпритаторокомпилятор долго компилил

> Дело не в этом. Наример, паскаль компилируется тоже очень быстро.
Я подозреваю это у него изза жесткости самого языка, в частности изза жеско привязанного места расположения объявлений переменных...

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[16]: Качество кода open-source
От: jazzer Россия Skype: enerjazzer
Дата: 17.06.08 10:21
Оценка: +1
Здравствуйте, Sheridan, Вы писали:

S>Сергей однажды (17 июня 2008 [Вторник] 13:26) писал:


>> S>Ну еще-бы интерпритаторокомпилятор долго компилил

>> Дело не в этом. Наример, паскаль компилируется тоже очень быстро.
S>Я подозреваю это у него изза жесткости самого языка, в частности изза жеско привязанного места расположения объявлений переменных...

Объявление переменных здесь абсолютно ни при чем.
Просто в С самая уродская схема подключения пакетов из всех возможных (рекурсивное текстовое включение препроцессором).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[9]: фото
От: Sheridan Россия  
Дата: 17.06.08 18:36
Оценка: :)
Добрался до книжки.


[Картинка, 3'589'097 байт]


[Картинка, 3'493'369 байт]


[Картинка, 3'565'869 байт]
--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[10]: фото
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.06.08 04:16
Оценка: +1
Здравствуйте, Sheridan, Вы писали:

S>Добрался до книжки.

Нда. Шеридан, очень смешно видеть человека, который оценивает производительность программы по книге, посвященной языку.
Ты не обратил внимание, что Бьярни везде пишет "вот как могла бы выглядеть..."? Это потому, что он пишет про синтаксис и семантику, а не про использование регистров и такты процессора.
Он даже не пишет про возможные оптимизации — надо полагать потому, что даже без их упоминания плюсы достаточно тяжелы для изучения.

Для того, чтобы хоть как-то рассуждать о производительности и ресурсопотреблении, нужно читать не "Язык С++", а "Разработка оптимизирующего компилятора для С++".
Ну или регулярно пользоваться реальным компилятором, профайлером и дизассемблером.

В целом, язык С++ допускает более широкий класс оптимизаций, чем С — благодаря более выразительной семантике. Специальные усилия были потрачены на то, чтобы обеспечить возможности по инлайнингу, иначе, к примеру, перегруженные операторы работали бы существенно хуже встроенных.

Кроме того, есть масса техник по устранению виртуальности. Один пример уже привели. Более хитрые компиляторы даже умеют выполнять спекулятивный инлайнинг.
Вот, почитай доклад парней, которые ближе к мартену, чем Мастер Цеха Страуструп: http://blogs.msdn.com/apardoe/attachment/1685578.ashx
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: Качество кода open-source
От: shrecher  
Дата: 18.06.08 04:50
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:
I>Программа кушает около полуторагигабайт памяти. лишние lpVtbl дают и вовсе выход за границы процесса, в виндовсе это 2гб и планками памяти это не лечится.

Кстати, около полуторагигабайт памяти вероятнее всего занимают данные. А они будут везде едины, что на С, что на С++ или C#. lpVtbl возможно и прибавит насколько мегабайт к исполняемому коду, но на размер данных это не скажется.
Re[11]: фото
От: Sheridan Россия  
Дата: 18.06.08 19:01
Оценка: :)
Sinclair однажды (18 июня 2008 08:16) писал:

Синклер, я тоже говорил о том, что "не всегда, но бывает".
В целом же я за с++, он дает нааамного больше свободы чем С, и возможные затраты времени исполнения — ничто по сравнению с удобством.
А затраты времени на компилирование — это фигня. Компилируется 1 раз.

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[12]: фото
От: Cyberax Марс  
Дата: 19.06.08 04:21
Оценка: +1
Здравствуйте, Sheridan, Вы писали:

S>Синклер, я тоже говорил о том, что "не всегда, но бывает".

"Но бывает" нужно в тех случаях, где потребуется аналог vtbl и в чистом C.
Sapienti sat!
Re[13]: фото
От: Sheridan Россия  
Дата: 19.06.08 05:11
Оценка: -1
Константин Б. однажды (19 июня 2008 [Четверг] 05:09) писал:

> S>А затраты времени на компилирование — это фигня. Компилируется 1 раз.

> http://xkcd.com/303/
Видел, ага. В таких случаях имхо лучше купить многопроцессорный комп и компилировать в несколько потоков.


--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re: Качество кода open-source
От: kuj  
Дата: 22.05.08 16:01
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Мне интересно, весь open-source написан так же или это мне так повезло?


Это Вы, батенька, еще индусского кода не пробовали.

OSS весь разный.
Re: Качество кода open-source
От: superlexx  
Дата: 22.05.08 19:28
Оценка:
Здравствуйте, Lonely Dog, Вы писали:
LD> Этот код не компилируется в студии если установлен режим сохранения отладочной информации Edit and Continue. Выводится ошибка "case label not a constant" или типа того. Меняем эту настройу на что-нибудь другое, и все работает.

им просто надо было использовать __COUNTER__ вместо __LINE__ под MSVC. Сейчас навалял себе небольшой вспомогательный класс с __COUNTER__, очень понравилось. Практически получается C#-овский yield (не так же красиво, но всё-таки).
Re[2]: Качество кода open-source
От: Programador  
Дата: 22.05.08 20:19
Оценка:
Здравствуйте, superlexx, Вы писали:

S>им просто надо было использовать __COUNTER__ вместо __LINE__ под MSVC. Сейчас навалял себе небольшой вспомогательный класс с __COUNTER__, очень понравилось. Практически получается C#-овский yield (не так же красиво, но всё-таки).

__LINE__ при оладке может быть удобней чем __COUNTER__
Re[2]: �������� ���� open-source
От: Programador  
Дата: 22.05.08 20:27
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>????????????, Lonely Dog, ?? ??????:


че за �������� ���� глюки сегодня на сайте, и здесь http://www.rambler.ru/news/sport/0/562437840.html
в разных боузерах такие чудеса, наверно день плохой, или комп перегрузить?
Re[2]: Качество кода open-source
От: Сергей  
Дата: 22.05.08 21:46
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

LD>>Мне интересно, весь open-source написан так же или это мне так повезло?


MSS>Примерно так.


Ты знаком со всем open-source кодом?
Re[2]: Качество кода open-source
От: Pzz Россия https://github.com/alexpevzner
Дата: 22.05.08 22:46
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог перенести, сейчас пакет делаю (https://launchpad.net/putty2).


А зачем он там нужен? Чем он лучше, чем сочетание вашего любимого эмулятора терминала с комманд-лайновым ssh клиентом?
Re[3]: GPuTTY
От: OCTAGRAM Россия http://octagram.name/
Дата: 22.05.08 23:55
Оценка:
Pzz пишет:
> Здравствуйте, Cyberax, Вы писали:
>
> C>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог
> перенести, сейчас пакет делаю (https://launchpad.net/putty2).
>
> А зачем он там нужен? Чем он лучше, чем сочетание вашего любимого
> эмулятора терминала с комманд-лайновым ssh клиентом?
В команд–лайновом нужно помнить esc-последовательности, чтобы порты
форвардить. Ты вот их помнишь?

--
ISO/IEC 8652:1995/Amd 1:2007
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Качество кода open-source
От: Cyberax Марс  
Дата: 22.05.08 23:59
Оценка:
Здравствуйте, Pzz, Вы писали:

C>>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог перенести, сейчас пакет делаю (https://launchpad.net/putty2).

Pzz>А зачем он там нужен? Чем он лучше, чем сочетание вашего любимого эмулятора терминала с комманд-лайновым ssh клиентом?
Putty удобнее. Например, есть killer feature — "duplicate session". Или гибкие и простые настройки терминала. Ещё удобное указание ключей.

А в обычном SSH мне приходилось делать кучу запускающих sh-файлов.
Sapienti sat!
Re[4]: Качество кода open-source
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.05.08 00:08
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>>>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог перенести, сейчас пакет делаю (https://launchpad.net/putty2).

Pzz>>А зачем он там нужен? Чем он лучше, чем сочетание вашего любимого эмулятора терминала с комманд-лайновым ssh клиентом?
C>Putty удобнее. Например, есть killer feature — "duplicate session". Или гибкие и простые настройки терминала. Ещё удобное указание ключей.

Если честно, мне он не показался очень-то удобным. Возможно, это дело вкуса.

Кроме того, я сильно сомневаюсь, что у него хороший эмулятор терминала. Собственно, хороших-то почти нет. Попробуйте прогнать на нем vttest из любопытства. Реально его более-менее полностью проходит только xterm и rxvt.

C>А в обычном SSH мне приходилось делать кучу запускающих sh-файлов.


У него есть файл с опциями.
Re[3]: Качество кода open-source
От: Константин Л.  
Дата: 23.05.08 07:07
Оценка:
Здравствуйте, azzx, Вы писали:

A>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, Lonely Dog, Вы писали:


КЛ>>[]


КЛ>>имею дело с thunderbird. резюме — дерьмо. методы на 1500 строк в порядке вещей. свичи на 1500 строк в порядке вещей. написано просто грязно. как это работает я не представляю.


A>А они точно кодогенерацию не применяют нигде? У меня бывают в СПЕЦИФИЧЕСКИХ случаях такие методы — но всегда в том или ином варианте используется кодогенерация, ибо я не идиот это ручками поддерживать. Так что вся "поддержка" такого кода заключается в изменении настроек кодогенератора ( и не важно что это — список вызовов макросов в отдельном файле, Excel-таблица с макросами на VBA или действительно специально написанная программа).


точно. там такие места, где нужно все руками (WndProc e.g.), да и оформлено так, что если захочешь не нагенеришь
Re[2]: �������� ���� open-source
От: Lonely Dog Россия  
Дата: 23.05.08 07:16
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>If one calls nextMove() repeatedly, one would get something like RRRDRRURRRRRRRRDRURR... (the return value depends on the place where the function returned the previous time).

Неужели этого нельзя добиться менее грязным способом?
Re[3]: Качество кода open-source
От: Lonely Dog Россия  
Дата: 23.05.08 07:20
Оценка:
Здравствуйте, azzx, Вы писали:

A>А они точно кодогенерацию не применяют нигде? У меня бывают в СПЕЦИФИЧЕСКИХ случаях такие методы — но всегда в том или ином варианте используется кодогенерация, ибо я не идиот это ручками поддерживать. Так что вся "поддержка" такого кода заключается в изменении настроек кодогенератора ( и не важно что это — список вызовов макросов в

отдельном файле, Excel-таблица с макросами на VBA или действительно специально написанная программа).
Если бы там была кодо-генерация, то вопросов бы не было. Но тогда к исходникам надо прилагать скрипт из которого эти функции генерятся. Этого там нет. Следовательно, это не кодогенерация. Кроме того, там форматирование съехавшее. Такое обычно бывает при ручном написании кода.
Re[4]: GPuTTY
От: Roman Odaisky Украина  
Дата: 23.05.08 07:57
Оценка:
Здравствуйте, OCTAGRAM, Вы писали:

>> C>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог

>> перенести, сейчас пакет делаю (https://launchpad.net/putty2).
>> А зачем он там нужен? Чем он лучше, чем сочетание вашего любимого
>> эмулятора терминала с комманд-лайновым ssh клиентом?
OCT>В команд–лайновом нужно помнить esc-последовательности, чтобы порты
OCT>форвардить. Ты вот их помнишь?

Нажми «~?», будет тебе хелп, нажми «~C» и набери «help», будет тебе хелп по командной строке.

Лично я, впрочем, использую исключительно /usr/bin/ssh. Если требуется -L, то лучше для этого завести отдельный ssh -fNT (и ControlMaster auto в ssh_config). А EscapeChar у меня всё равно отключен.

Консольный ssh чем хорош — во-первых, есть автодополнение хостов, во-вторых, можно работать в одном окне вперемежку с разными машинами, в-третьих, можно просто выполнять команды по одной (ssh server command).

Чего не хватает, и, насколько я знаю, в PuTTY этого тоже нет — чтобы ssh-agent (Pageant) задавал вопрос при попытке аутентификации через ForwardAgent. Иначе root системы, куда я логинюсь, может свободно пользоваться моим агентом. Ключ не узнает, но изменить PATH и положить затрояненную sudo сможет.
До последнего не верил в пирамиду Лебедева.
Re[5]: GPuTTY
От: OCTAGRAM Россия http://octagram.name/
Дата: 23.05.08 09:33
Оценка:
Roman Odaisky пишет:
> Консольный ssh чем хорош

Одно другому никак не мешает

--
ISO/IEC 8652:1995/Amd 1:2007
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Качество кода open-source
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 23.05.08 12:02
Оценка:
Я это всё к чему? К тому что дело тут не в том Open Source у нас или нет. Дело в программистах, но и не только в них.
Треша везде хватает, и к сожалению для его появления иногда бывают объективные (хотя чаще и субьективные) причины. Например я в своём опенсорсном проекте стараюсь всё содержать в чистоте.
Но в опенсорсе этот нерпиглядный код всегда навиду, из-за чего может сложится впечатление что оно всегда так, а в комерческих продуктах всё зашибись. Нет, я думаю я далеко не единсвтенный кто может привести примеры совершенно неоправданного мегатреша в успешном комерческом продукте.
---=== С наилучшими пожеланиями, Phoenics ===---
_
Re[7]: Качество кода open-source
От: Sergey Россия  
Дата: 23.05.08 15:04
Оценка:
squid пишет:

> вообще я реально люблю Thuderbird и на дух не переношу Firefox. как раз

> потому что птичка летает а лиса тормозит

Странно, а мне наоборот показалось Особенно на ньюсах — тормознее
птички я ни одной ньюсочиталки не видел.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[9]: Качество кода open-source
От: Константин Л.  
Дата: 23.05.08 15:57
Оценка:
Здравствуйте, squid, Вы писали:

[]

S>ньюс это что? RSS?


nntp
Re[10]: Качество кода open-source
От: squid  
Дата: 23.05.08 16:05
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, squid, Вы писали:


КЛ>[]


S>>ньюс это что? RSS?


КЛ>nntp


не использую...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
boost ?
От: minorlogic Украина  
Дата: 23.05.08 17:29
Оценка:
boost ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: Качество кода open-source
От: Cyberax Марс  
Дата: 24.05.08 03:28
Оценка:
Здравствуйте, Pzz, Вы писали:

C>>Putty удобнее. Например, есть killer feature — "duplicate session". Или гибкие и простые настройки терминала. Ещё удобное указание ключей.

Pzz>Если честно, мне он не показался очень-то удобным. Возможно, это дело вкуса.
Мало пробовал.

Pzz>Кроме того, я сильно сомневаюсь, что у него хороший эмулятор терминала. Собственно, хороших-то почти нет. Попробуйте прогнать на нем vttest из любопытства. Реально его более-менее полностью проходит только xterm и rxvt.

Запустил. Большинство тестов проходит.

Но мне, честно говря, на совместимость глубоко плевать. Глюков консоли в Putty я не замечал: mc, joe, vim, htop. ncurses — работают превосходно.

C>>А в обычном SSH мне приходилось делать кучу запускающих sh-файлов.

Pzz>У него есть файл с опциями.
И чем это лучше? Мне надо чтобы я просто мог мышкой нажать на строчку в списке, даже не открывая терминал. Да, и с удобной настройкой опций типа запрета "xterm style mouse reporting".
Sapienti sat!
Re[3]: Качество кода open-source
От: Cyberax Марс  
Дата: 24.05.08 03:36
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

C>>Нормально его поддерживают. Я вот Putty на GTK2 под Линукс помог перенести, сейчас пакет делаю (https://launchpad.net/putty2).

LD>Ну не знаю. У меня голова опухла после одного дня копания в этом коде.
Опыта больше нужно в разборках с продуктами

C>>Используется подход с С coroutines, описаный вот здесь: http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html

C>>Об этом, кстати, в их доке по разработке сказано.
LD>Доку по разработке читал. Легче не стало. Как это отлаживать то? На code-review я бы вынес автора этого кода. Ему бы пришлось его переписывать полностью.
А лучше на С не получится. Можешь OpenSSL или GNUTLS посмотреть для примера. Отлаживается как обычно — ставится точка прерывания и смотрится что там произошло. Какие проблемы-то?
Sapienti sat!
Re[4]: Качество кода open-source
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.05.08 09:59
Оценка:
Здравствуйте, Cyberax, Вы писали:

LD>>Доку по разработке читал. Легче не стало. Как это отлаживать то? На code-review я бы вынес автора этого кода. Ему бы пришлось его переписывать полностью.

C>А лучше на С не получится. Можешь OpenSSL или GNUTLS посмотреть для примера. Отлаживается как обычно — ставится точка прерывания и смотрится что там произошло. Какие проблемы-то?

Я когда-то очень давно делал телнетовского клиента для DOS-а, и я просто реализовал свои самодельные потоки, и сделал все многопоточно. Делов-то потоки сделать, там кода было несколько сотен строк, не больше.
Re[5]: Качество кода open-source
От: Cyberax Марс  
Дата: 24.05.08 10:08
Оценка:
Здравствуйте, Pzz, Вы писали:

C>>А лучше на С не получится. Можешь OpenSSL или GNUTLS посмотреть для примера. Отлаживается как обычно — ставится точка прерывания и смотрится что там произошло. Какие проблемы-то?

Pzz>Я когда-то очень давно делал телнетовского клиента для DOS-а, и я просто реализовал свои самодельные потоки, и сделал все многопоточно. Делов-то потоки сделать, там кода было несколько сотен строк, не больше.
Кроссплатформенно это сделать уже не так сложно. И в любом случае нельзя использовать блокирующиеся операции. Так что подход вполне нормален, тем более что автор использует широко известную библиотеку для этого.
Sapienti sat!
Re: Качество кода open-source
От: BigBoss  
Дата: 24.05.08 19:54
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Мне интересно, весь open-source написан так же или это мне так повезло?


Да, во всяком случае та часть, которая не получена от коммерческих фирм ;(

LD>Как при таком качестве кода они умудряются что-то разумное делать?


Под чутким руководством тех, кому оно надо, видимо. Не сами же эти пионэры догадались к примеру в том же Линуксе вдруг заняться масштабируемостью в 2.6 или слить ветки PPC32 и 64
Re[3]: Качество кода open-source
От: OCTAGRAM Россия http://octagram.name/
Дата: 25.05.08 00:10
Оценка:
Nuzik пишет:
> Это мое ИМХО, но помойму Duff's Device это всё же мозго**ство. Вообще,
> насколько я знаю — PuTTY единственный крупный Open Source проект, где
> оный девайс используется.
...a также практически каждый проект на Erlang

--
ISO/IEC 8652:1995/Amd 1:2007
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Качество кода open-source
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.05.08 10:42
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Вывод: Если сравнить с закрытым кодом, к примеру Windows, то очевидно, что OSS проигрывает в качестве очень сильно. Такой код поддерживать очень сложно и весь процесс становится зависимым от индивидуалов.


Ну как-то не честно сравнивать код bzip'а с кодом Windows. Давайте уж тогда сравнивать ядра с ядрами — ядро Windows с ядром Linux (или BSD).
Re[3]: Качество кода open-source
От: shrecher  
Дата: 25.05.08 11:52
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, shrecher, Вы писали:


S>>Вывод: Если сравнить с закрытым кодом, к примеру Windows, то очевидно, что OSS проигрывает в качестве очень сильно. Такой код поддерживать очень сложно и весь процесс становится зависимым от индивидуалов.


Pzz>Ну как-то не честно сравнивать код bzip'а с кодом Windows. Давайте уж тогда сравнивать ядра с ядрами — ядро Windows с ядром Linux (или BSD).


Я bzip как пример привел. К примеру, OpenSsl, которая практически часть ядра, тоже вызывает такие же ощущения: гиганские функции с минимумом комментов, goto — процветает, макросы препроцессора, строковые литералы в коде. Ну может только переменные и фукции по цивильнее названы. Вообще я не понимаю зачем на чистом C мучится если можно на CPP?
Re[4]: Качество кода open-source
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.05.08 12:39
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Я bzip как пример привел. К примеру, OpenSsl, которая практически часть ядра, тоже вызывает такие же ощущения: гиганские функции с минимумом комментов, goto — процветает, макросы препроцессора, строковые литералы в коде. Ну может только переменные и фукции по цивильнее названы. Вообще я не понимаю зачем на чистом C мучится если можно на CPP?


Криптография вся такая — у криптографов по сравнению с нормальными программистами мозги набекрень.

Назвать openssl частью ядра можно лишь с очень большой натяжкой. Зачем мучаться на Си, если есть C++ — тема для отдельного флейма
Re[2]: Качество кода open-source
От: Michael7 Россия  
Дата: 25.05.08 17:01
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>или как обратный пример , HEAAC кодек от coding technologies или GPC или тотже antigrain ? да и сравнивать закрытый и открытый софт мы по определению не можем , так как закрытый код нам не доступен по определению.


Не совсем не можем, имеется немало случаев раскрытого кода, который был закрытым.
Re[2]: Качество кода open-source
От: Roman Odaisky Украина  
Дата: 25.05.08 17:26
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Если попытаться разобраться, что делает bzip2, то крыша едет очень скоро.


bzip2 в этом смысле не очень репрезентативен. Я частично поддерживаю вот эту точку зрения: http://www.rsdn.ru/forum/message/2744326.1.aspx
Автор: Privalov
Дата: 27.11.07
До последнего не верил в пирамиду Лебедева.
Re[2]: Качество кода open-source
От: Sergei I. Gorelkin Россия  
Дата: 25.05.08 17:44
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Не понимаю к чему этот пример , есть код и открытый и закрытый очень разного качества.


...
Аналогично.

Библиотеки типа bzip — пример довольно неудачный. Они документированы не столько в коде, сколько в соответствующих RFC и статьях математической направленности. Лезть туда разбираться и что-то улучшать, не ознакомившись с этими статьями — довольно дохлый номер. В поставке zlib такой документ содержится, в bzip — кажется нет (но это не значит, что его нет в природе).
Подобный код, будучи написан однажды, уже не будет сильно изменяться. Поэтому в принципе допустима и его оптимизация, пусть даже и с помощью хаков.

А качество... Вот у меня валяется .png с немного измененным заголовком. Libpng на него говорит "идите нафиг, что тут мне всякую гадость подсовываете". А explorer.exe из состава M$ Windows просто намертво виснет, даже если этот файл просто выделить.
...и при этом мне совершенно наплевать на количество макросов и комментариев в коде libpng.
Re[3]: Качество кода open-source
От: Maxim S. Shatskih Россия  
Дата: 25.05.08 18:06
Оценка:
_>всякого фри- и шароварного барахла

Вот в это верю.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[8]: Сопрограммы
От: max779 Россия  
Дата: 26.05.08 08:53
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Ты решил присоединиться к Шеридану, посылавшему Python в печку? В Python есть yield, в C# вроде бы тоже есть что-то похожее.

RO>И Кнута заодно туда же за пропаганду еретических подходов к программированию.

А при чем тут Кнут? Он описывал программирование на языке низкого уровня. А на ассемблере всякие yield, goto и т.п. вполне оправданы и необходимы. Но это же не означает, что его нужно применять всегда и везде! Мы же вроде не про ассемблер речь ведем? Вообще, это спор про то, нужен goto или не нужен. Так вот я считаю, что на языке высокого уровня его (и этого yield) быть не должно. Ну в смысле, в самом-то языке нужен конечно, т.к. это упрощает портирование старых программ. Но писать новый код так нельзя.
Кстати, еще про Кнута в печку. Прочитай Александреску, тоже умный человек. И что, после этого надо все писать в таком стиле?
Просто где-то и Александреску пригодится, а где-то Кнут...

Да, я не знаю протокол SSH и вполне может быть, что там без yield было бы все намного хуже (хотя сильно сомневаюсь). Да и разбираться в этом SSH не хочу и не собираюсь. Но мне очень хочется посмотреть на оригинальное задание этого диггера. Можешь показать где оно лежит? Я полагаю, они похожи с SSH. И если у меня будет время, постараюсь разобраться, будет без yield лучше или хуже...
Re[9]: Сопрограммы
От: kuj  
Дата: 26.05.08 09:59
Оценка:
Здравствуйте, max779, Вы писали:

RO>>Ты решил присоединиться к Шеридану, посылавшему Python в печку? В Python есть yield, в C# вроде бы тоже есть что-то похожее.

RO>>И Кнута заодно туда же за пропаганду еретических подходов к программированию.

M>А при чем тут Кнут? Он описывал программирование на языке низкого уровня. А на ассемблере всякие yield, goto и т.п. вполне оправданы и необходимы. Но это же не означает, что его нужно применять всегда и везде! Мы же вроде не про ассемблер речь ведем? Вообще, это спор про то, нужен goto или не нужен. Так вот я считаю, что на языке высокого уровня его (и этого yield) быть не должно. Ну в смысле, в самом-то языке нужен конечно, т.к. это упрощает портирование старых программ. Но писать новый код так нельзя.

M>Кстати, еще про Кнута в печку. Прочитай Александреску, тоже умный человек. И что, после этого надо все писать в таком стиле?
M>Просто где-то и Александреску пригодится, а где-то Кнут...

Microsoft явно об этом не знали, когда добавляли yield return/break в C# 2.0
Re[3]: Качество кода open-source
От: shrecher  
Дата: 26.05.08 10:58
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

SIG>Библиотеки типа bzip — пример довольно неудачный. Они документированы не столько в коде, сколько в соответствующих RFC и статьях математической направленности. Лезть туда разбираться и что-то улучшать, не ознакомившись с этими статьями — довольно дохлый номер.


Документация на Код и на Алгоритм — разные вещи. Алгоритм — высокоуровневое описание принципа, а документация на код — технологически документ для непосредсвенного поплощения.

SIG>Подобный код, будучи написан однажды, уже не будет сильно изменяться.

Вот это неверно. Вопервых постоянно появлются новые платформы. К примеру, портировать это добро на Symbian. Вовторых, если речь идет об индустрии, а не о свободном творчестве, то один и тотже код читаеют и изменяют разные программисты. Очень часто нужно быстро въехать в тему и быстро и надежно произвести требуемые изменения. Вот все в том же bzip2 17 марта 2008 были пофикшены дыры безопасности. Без хорошего качества это недостижимо при "индустриализации".

SIG>Поэтому в принципе допустима и его оптимизация, пусть даже и с помощью хаков.

Особой оптимизации там и нет.

SIG>А качество... Вот у меня валяется .png с немного измененным заголовком. Libpng на него говорит "идите нафиг, что тут мне всякую гадость подсовываете". А explorer.exe из состава M$ Windows просто намертво виснет, даже если этот файл просто выделить.


Отправте это проблему в MS.
Re[11]: Качество кода open-source
От: Константин Л.  
Дата: 26.05.08 16:15
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

S>>>ньюс это что? RSS?

КЛ>>nntp

RO>Как низко мы пали...


?
Re[10]: Сопрограммы
От: WolfHound  
Дата: 26.05.08 17:23
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Точно! yield в топку! Даёшь нормальные замыкания!

Ты наверное хотел сказать продолжения(continuation)? Ибо замыкания(closure) это немного не про то.

Так вот: Продолжения в топку ибо они не совместимы с детермированной финализацией.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[9]: Сопрограммы
От: WolfHound  
Дата: 26.05.08 17:23
Оценка:
Здравствуйте, max779, Вы писали:

M>А на ассемблере всякие yield, goto и т.п.

yield на асме? Оригинально.
Я честно говоря не знаю ассемблеров с yield'ом.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[10]: Сопрограммы
От: Pzz Россия https://github.com/alexpevzner
Дата: 26.05.08 20:41
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>yield на асме? Оригинально.

WH>Я честно говоря не знаю ассемблеров с yield'ом.

yield на асме называется hlt
Re[3]: Качество кода open-source
От: BigBoss  
Дата: 26.05.08 23:42
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

BB>>Да, во всяком случае та часть, которая не получена от коммерческих фирм ;(

RO>Просится вопрос: всю ли эту часть Open Source благородный дон имел возможность проанализировать?

Нет конечно, только ту, что приходилось править
Re[4]: Качество кода open-source
От: DivnenkoIvan Россия  
Дата: 26.05.08 23:47
Оценка:
Здравствуйте, BigBoss, Вы писали:

BB>Здравствуйте, Roman Odaisky, Вы писали:


BB>>>Да, во всяком случае та часть, которая не получена от коммерческих фирм ;(

RO>>Просится вопрос: всю ли эту часть Open Source благородный дон имел возможность проанализировать?

BB>Нет конечно, только ту, что приходилось править


на сколько мне известно Москва в лице Информзащиты начала делать свой дистриб — они за что отвечают? за сборку для клиента. Если не так то тоскливо жить..
Re[5]: Качество кода open-source
От: BigBoss  
Дата: 27.05.08 00:31
Оценка:
Здравствуйте, DivnenkoIvan, Вы писали:

RO>>>Просится вопрос: всю ли эту часть Open Source благородный дон имел возможность проанализировать?

BB>>Нет конечно, только ту, что приходилось править
DI>на сколько мне известно Москва в лице Информзащиты начала делать свой дистриб — они за что отвечают? за сборку для клиента. Если не так то тоскливо жить..

Не знаю, но не удивлюсь, если они отвечают за замену языка по умолчанию с английского на русский. Или они еще должны ответить, почему, например, неновая видеокарта от nVidia+HDMI монитор распознаются не как Вистой, а как VESA-совместимая с максимальным разрешением 800х600х16 и аналоговым выходом?
Re[11]: Сопрограммы
От: Cyberax Марс  
Дата: 27.05.08 02:03
Оценка:
Здравствуйте, WolfHound, Вы писали:

C>>Точно! yield в топку! Даёшь нормальные замыкания!

WH>Ты наверное хотел сказать продолжения(continuation)? Ибо замыкания(closure) это немного не про то.
Да, торможу.

WH>Так вот: Продолжения в топку ибо они не совместимы с детермированной финализацией.

Ну если постараться, то кое-что можно придумать.
Sapienti sat!
Re[8]: �������� ���� open-source
От: Erop Россия  
Дата: 27.05.08 09:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Без state-машины можно было бы обойтись, но тогда потребовалось бы создавать по потоку на соединение, что противоречит дизайну Putty (оно работает на классических Mac'ах без потоков).


Можно протсо обычный автомат закодить. По типу имеем текущее состояние, переходим к следующему...

Я так понимаю, что на вход этой машины идёт просто поток кнопочек?
Если так, то вообще проблемы не вижу.
Пишешь, например, структуру "переход", которая состоит из множества букв (это битовая маска из ( 1 << CHAR_BIT ) / CHAR_BIT байт, обычно 32), указателя ну функцию обработки перехода и указатель на состояние в котрое переход.
Ну и пишешь состояние -- списко указателейна переходы.

Ну и ходишь по этому автомату...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Качество кода open-source
От: Erop Россия  
Дата: 27.05.08 09:37
Оценка:
Здравствуйте, Сергей, Вы писали:

С>Ты знаком со всем open-source кодом?

Есть, конечно, джидаи, которые не боятся, что кто-то кроме них сможет поддерживать их "открытый" код, но совсем не все таковы
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[3]: Божественно!!!
От: Erop Россия  
Дата: 27.05.08 09:49
Оценка:
Здравствуйте, Phoenics, Вы писали:

P>...

P>И наконец эта функция вызывается ресурсивно...

В смысле это написали и отладили вовсе и не люди!!!
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[9]: �������� ���� open-source
От: Roman Odaisky Украина  
Дата: 27.05.08 09:51
Оценка:
Здравствуйте, Erop, Вы писали:

C>>Без state-машины можно было бы обойтись, но тогда потребовалось бы создавать по потоку на соединение, что противоречит дизайну Putty (оно работает на классических Mac'ах без потоков).


E>Можно протсо обычный автомат закодить. По типу имеем текущее состояние, переходим к следующему...


Будет тот же switch, только явный, на порядок больше кода, что повышает вероятность ошибки, вредит поддерживаемости и прячет бизнес-логику за горами условных переходов.
До последнего не верил в пирамиду Лебедева.
Re[3]: Качество кода open-source
От: Erop Россия  
Дата: 27.05.08 09:58
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Я частично поддерживаю вот эту точку зрения: http://www.rsdn.ru/forum/message/2744326.1.aspx
Автор: Privalov
Дата: 27.11.07


А в чём она состоит? В том, что как не читай не поймёшь?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[10]: �������� ���� open-source
От: Erop Россия  
Дата: 27.05.08 09:59
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Будет тот же switch, только явный, на порядок больше кода, что повышает вероятность ошибки, вредит поддерживаемости и прячет бизнес-логику за горами условных переходов.

Зачем switch? Я же написал как сделать?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: Сопрограммы
От: WolfHound  
Дата: 27.05.08 10:06
Оценка:
Здравствуйте, Cyberax, Вы писали:

WH>>Так вот: Продолжения в топку ибо они не совместимы с детермированной финализацией.

C>Ну если постараться, то кое-что можно придумать.
Что?
Только общий случай пожалуйста.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Качество кода open-source
От: Sergey Россия  
Дата: 27.05.08 10:46
Оценка:
> Я bzip как пример привел. К примеру, OpenSsl, которая практически часть
> ядра, тоже вызывает такие же ощущения: гиганские функции с минимумом
> комментов, goto — процветает, макросы препроцессора, строковые литералы
> в коде. Ну может только переменные и фукции по цивильнее названы.

Странно, а мне казалось что OpenSSL весьма грамотно написана. В тех
местах, в которые я заглядывал — все довольно понятно было.

PS: А что плохого в строковых литералах в коде?
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: Качество кода open-source
От: jazzer Россия Skype: enerjazzer
Дата: 27.05.08 11:35
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Нормально его поддерживают.


А можно подробнее? А то я им письмо с патчем послал с полгода назад, и ни ответа, ни привета...
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[7]: Качество кода open-source
От: BigBoss  
Дата: 27.05.08 14:04
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

BB>>Не знаю, но не удивлюсь, если они отвечают за замену языка по умолчанию с английского на русский. Или они еще должны ответить, почему, например, неновая видеокарта от nVidia+HDMI монитор распознаются не как Вистой, а как VESA-совместимая с максимальным разрешением 800х600х16 и аналоговым выходом?


RO> А что тут неправильного?


Плохая поддержка оборудования

RO> HDMI — это и есть самый настоящий вистой...


не понял
Re[5]: Качество кода open-source
От: Roman Odaisky Украина  
Дата: 27.05.08 15:32
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Странно, а мне казалось что OpenSSL весьма грамотно написана. В тех

S>местах, в которые я заглядывал — все довольно понятно было.

А потом криворукие патчеры убирают фрагменты кода, на которые ругается Purify :-)
До последнего не верил в пирамиду Лебедева.
Re: Качество кода open-source
От: Кодт Россия  
Дата: 27.05.08 16:07
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Т.е., пришли в функцию, что-то сделали, и вышли, сохранив номер строки из которой мы вышли. В следующий раз мы продолжим выполнение с этого же места. Этот код не компилируется в студии если установлен режим сохранения отладочной информации Edit and continue. Выводится ошибка "case label not a constant" или типа того. Меняем эту настройу на что-нибудь другое, и все работает.

LD>Как это поддерживать? Какой смысл в открытости кода, если поддерживать его могут только авторы?

Это не косяк авторов, а проблема VisualC. Она не может реализовать две фичи одновременно — чтобы и Edit&Continue было, и __LABEL__ соответствовал стандарту.
__LABEL__ в этом режиме — даже не числовой литерал, а вообще выражение времени выполнения!!!

Ещё можешь попробовать написать
#define PP_STR(x) PP_STR_(x)
#define PP_STR_(x) #x

int main()
{
  printf("here we are: file " __FILE__ ", line " PP_STR(__LINE__) "\n");
}

Тоже будешь неприятно удивлён.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[6]: Качество кода open-source
От: Sergey Россия  
Дата: 27.05.08 19:35
Оценка:
> S>Странно, а мне казалось что OpenSSL весьма грамотно написана. В тех
> S>местах, в которые я заглядывал — все довольно понятно было.
>
> А потом криворукие патчеры убирают
> <http://www.debian.org/security/2008/dsa-1571&gt; фрагменты кода, на
> которые ругается Purify

Ну мало ли кто там чего отломал. Зато обработка ошибок по-человечески
сделана, не приходится гадать, а шо ж ему не понравилось. А это, на мой
взгляд, большая редкость.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[4]: Качество кода open-source
От: jazzer Россия Skype: enerjazzer
Дата: 28.05.08 08:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, jazzer, Вы писали:


C>>>Нормально его поддерживают.

J>>А можно подробнее? А то я им письмо с патчем послал с полгода назад, и ни ответа, ни привета...
C>Пинай их сильнее.
Как их пинать?
Письмами ддосить?

C>А что за патч?

Сейчас он пэйстит при нажатии средней кнопки мыши.
А должен пэйстить при ее отпускании, иначе оно нифига не работает с Exceed, который копирует иксовое содержимое в буфер при потере фокуса, которое как раз при нажатии и происходит.
Т.е. PuTTY в результате вставляет предыдущее содержимое, а если кликнуть еще раз, то уже вставит новое.
Выглядит это феерически.

В этом патч и состоит.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Божественно!!!
От: Phoenics Россия https://sourceforge.net/projects/phengine
Дата: 28.05.08 12:23
Оценка:
Здравствуйте, Erop, Вы писали:

E>В смысле это написали и отладили вовсе и не люди!!!


Я не знаю точно кто именно это написал, видимо там приложили руку не одно поколение программистов. А отлаживать "это" приходится нам, и притом нередко .
---=== С наилучшими пожеланиями, Phoenics ===---
_
Re[7]: Качество кода open-source
От: Cyberax Марс  
Дата: 28.05.08 12:29
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Ну мало ли кто там чего отломал.

Я из-за этого "отлома" провёл день, занимаясь переподписыванием сертификатов, выданных GoDaddy. Про мелочи типа перегенерации ключей для 400 устройств я даже не вспоминаю.
Sapienti sat!
Re[5]: Качество кода open-source
От: shrecher  
Дата: 28.05.08 15:42
Оценка:
Здравствуйте, Sergey, Вы писали:

S>Странно, а мне казалось что OpenSSL весьма грамотно написана. В тех

S>местах, в которые я заглядывал — все довольно понятно было.

терпимо. Хотя тоже однобуквенные переменные к примеру

unsigned long dtls1_output_cert_chain(SSL *s, X509 *x)
    {
    unsigned char *p;
    int n,i;
    unsigned long l= 3 + DTLS1_HM_HEADER_LENGTH;
    BUF_MEM *buf;


потом искать по коду "n" запаришься.

Главное я не понимаю зачем на голимом C, если есть c++, — снижает читаемость.

S>PS: А что плохого в строковых литералах в коде?

неудобно локизовывать.
Re[6]: Качество кода open-source
От: Sergey Россия  
Дата: 28.05.08 16:19
Оценка:
shrecher пишет:

> S>Странно, а мне казалось что OpenSSL весьма грамотно написана. В тех

> S>местах, в которые я заглядывал — все довольно понятно было.
>
> терпимо. Хотя тоже однобуквенные переменные к примеру
>
> unsigned long dtls1_output_cert_chain(SSL *s, X509 *x)
> {
> unsigned char *p;
> int n,i;
> unsigned long l= 3 + DTLS1_HM_HEADER_LENGTH;
> BUF_MEM *buf;
>
>
>
> потом искать по коду "n" запаришься.
>
> Главное я не понимаю зачем на голимом C, если есть c++, — снижает
> читаемость.

Ну, во-первых, разработчик мог не знать C++. Мог посчитать, что делать
плюсовые внутренности при сишном интерфейсе — не окупится. Мог верить в
мифы на счёт производительности или желал видеть среди пользователей
людей, в такие мифы верящих.


> S>PS: А что плохого в строковых литералах в коде?

> неудобно локизовывать.

А что ж тогда удобно? На мой вкус, так строковый литерал в качестве
идентификатора для локализации куда удобнее, чем скажем какое-то число,
как это частенько (но не всегда) принято при разработке под виндой.
Другое дело, что в OpenSSL сообщения об ошибках вообще не локализованы
(хотя нафиг их переводить — юзер все равно не поймет ни запись
"krb5_cc_get_principal() fails", ни "krb5_cc_get_principal() не
выполнилась").
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Качество кода open-source
От: Shire  
Дата: 29.05.08 04:59
Оценка:
Здравствуйте, Константин Л., Вы писали:

S>>вывод — если хорошо работает и все нравицца — нефиг смотреть как оно сделано


КЛ>мне туда лазить приходится. и при любой такой необходимости к каждому члену нашей команды приходит депрессия


А я недавно словил пару багов в плагине Миранды SecureIM — он ронял ее при специфических условиях передачи файла. Полез в код. Ужаснулся. Послал разработчику фикс и снес плагин нафиг. Безопасность я ему теперь точно не доверю. Код самой Миранды, кстати, более вылизан, но, все равно, местами очень грязен
И я, аналогично Констатнтину, удивляюсь, как это все работает и боюсь, что многие вещи до сих пор происходят незаметно, потому что сделать ошибку в таком коде очень легко.
... << RSDN@Home 1.2.0 alpha 4 rev. 1084>>
Re[6]: Качество кода open-source
От: Сергей  
Дата: 29.05.08 05:55
Оценка:
Здравствуйте, shrecher, Вы писали:

S>неудобно локизовывать.


Что именно неудобно? Как удобнее?
Re[2]: Качество кода open-source
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 02.06.08 11:42
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>имею дело с thunderbird. резюме — дерьмо. методы на 1500 строк в порядке вещей. свичи на 1500 строк в порядке вещей. написано просто грязно. как это работает я не представляю.


Нужно смотреть на проект в целом. Если
1) продукт качественный
2) поддерживается
3) развивается
то, по большому счету, метод разработки данного продукта имеет право на жизнь. Может быть кому-то методы на 1500 строк удобнее понимать и поддерживать, чем какое-нить ООП-спагетти? Личные предпочтения людей, которые не вовлечены в разработку, как-то вторичны...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: �������� ���� open-source
От: FR  
Дата: 03.06.08 07:24
Оценка:
Здравствуйте, max779, Вы писали:


M>В общем, меня не убедили. А основной косяк этого подхода вот в чем: вот ты пишешь программу и пользуешься этими магическими YIELD и т.д. Потом ты увольняешься, на твое место приходит другой кодер и он не знаком с этим делом... Он конечно познакомится рано или поздно и перепишет весь твой код без этих макросов. И только потому что, чтобы хранить в уме эти магические обновления и переходы надо намного больше усилий... В общем, его мнение о тебе будет таким же как у Lonely Dog об open source.

M>Помните: программы пишутся для человека, а не для машины. Машина разберется в любых goto, а вот у человека голова опухнет...

Вообще-то Coroutine или сопрограммы не являются каким-то тайным знанием, и хороший программист должен если не знать (хороший скорее знать) то хотя бы слышать о них.
Re[2]: Качество кода open-source
От: StandAlone  
Дата: 04.06.08 20:27
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Lonely Dog, Вы писали:


КЛ>[]


КЛ>имею дело с thunderbird. резюме — дерьмо. методы на 1500 строк в порядке вещей. свичи на 1500 строк в порядке вещей. написано просто грязно. как это работает я не представляю.


Рассматривал исходники iptables, парсер конфигурационных файлов.... в ходе прочтения возникло много вопросов, самым главным был — КАК это все писали и сколько человеко-лет отлаживали...
Старые исходники M$ из экзамплов MSDN тоже, впрочем, изяществом не блещут, но там хотя бы нет функций на десятки экранов кода.
Re: Качество кода open-source
От: c-smile Канада http://terrainformatica.com
Дата: 07.06.08 17:56
Оценка:
Здравствуйте, Lonely Dog, Вы писали:

LD>Привет!


LD>Приведу несколько примеров:

LD>1. Файл ssh.c
LD>В начале файла есть несколько дефайнов:
LD>
LD>/* Coroutine mechanics for the sillier bits of the code */
LD>#define crBegin1    static int crLine = 0;
LD>#define crBegin2    switch(crLine) { case 0:;
LD>#define crBegin        crBegin1; crBegin2;
LD>#define crFinish(z)    } crLine = 0; return (z)
LD>#define crFinishV    } crLine = 0; return
LD>#define crReturn(z)    \
LD>    do {\
LD>        crLine=__LINE__; return (z); case __LINE__:;\
LD>    } while (0)
LD>#define crReturnV    \
LD>    do {\
LD>        crLine=__LINE__; return; case __LINE__:;\
LD>    } while (0)
LD>#define crStop(z)    do{ crLine = 0; return (z); }while(0)
LD>#define crStopV        do{ crLine = 0; return; }while(0)
LD>#define crWaitUntil(c)    do { crReturn(0); } while (!(c))
LD>#define crWaitUntilV(c)    do { crReturnV; } while (!(c))
LD>


LD>Потом эти дефайны используются в коде следующим образом:


Это достаточно известный паттерн в среде
hardcore С программеров. Про coroutines читаем статью здесь:
http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
Там в статье кстати есть ссылка на putty.
Re[2]: Качество кода open-source
От: Cyberax Марс  
Дата: 07.06.08 18:03
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Это достаточно известный паттерн в среде

CS>hardcore С программеров. Про coroutines читаем статью здесь:
CS>http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html
CS>Там в статье кстати есть ссылка на putty.
Автор Putty — это и есть как раз автор этой техники.
Sapienti sat!
Re[3]: Качество кода open-source
От: Eugeny__ Украина  
Дата: 10.06.08 14:49
Оценка:
Здравствуйте, Phoenics, Вы писали:


P>Детский сад! У нас на работе есть магическая мега-функция оставленная нам "демиургами", её длинна на данный момент ~1800строк, она набита свичами и goto, причём можно ивдеть и такие вещи как:

P>case тра-ля-ля:
P> goto три рубля
P> break;
P>case тра-ля-ля:
P> goto три рубля

P>Как параметр эта функция принимает структуру, объявление которой занимает ~200 строк, что составляет примерно 150 параметров, примерно 1/3 которых некоментированы, и не имеют вменяемых названий...

P>И наконец эта функция вызывается ресурсивно...


Мда, тут обфускатора не надо...
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[2]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.06.08 11:06
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>имею дело с thunderbird. резюме — дерьмо. методы на 1500 строк в порядке вещей. свичи на 1500 строк в порядке вещей. написано просто грязно. как это работает я не представляю.


В коммерческом коде нашел фунцыю примерно в 200 кб кода Была написана пачкой индокитайцев.

Одно хорошо — в мой код эти индокитайцы не совались, хотя желание было велико.

Что было бы с опенсорсом — и представить не могу, настолько страшно
Re[3]: Качество кода open-source
От: IT Россия linq2db.com
Дата: 12.06.08 13:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Только в опенсорсе некто недо может влезть насрать где попало. На конторах обычно есть кодинг-стандарты, код-ревью и всякие пакости другие, которые помогают сохранить чистоту кода, хотя бы отчасти.


I>В опенсорсе здесь просто анархия, держится на честном слове.


Это уже не open source, это — trash source. Ни в одном нормальном проекте тебе не дадут гадить просто так. Попробуй, например, нагадить в ядро линукса.
... << RSDN@Home 1.2.0 alpha rev. 771>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Качество кода open-source
От: Cyberax Марс  
Дата: 12.06.08 13:19
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Только в опенсорсе некто недо может влезть насрать где попало. На конторах обычно есть кодинг-стандарты, код-ревью и всякие пакости другие, которые помогают сохранить чистоту кода, хотя бы отчасти.

Ты участвовал в достаточно крупных OpenSource-проектах? Правильно, не участвовал.

Так как в большинстве из них это всё есть.
Sapienti sat!
Re[3]: Качество кода open-source
От: Sheridan Россия  
Дата: 12.06.08 16:14
Оценка:
Ikemefula однажды (12 июня 2008 15:10) писал:

> Только в опенсорсе некто недо может влезть насрать где попало. На конторах обычно есть кодинг-стандарты, код-ревью и всякие пакости другие, которые помогают сохранить чистоту

> кода, хотя бы отчасти.
> В опенсорсе здесь просто анархия, держится на честном слове.
Твои слова держутся на честном слове, извините за каламбур. Не участвовал ты в проектах вестимо...
--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[4]: Качество кода open-source
От: Roman Odaisky Украина  
Дата: 12.06.08 18:07
Оценка:
Здравствуйте, Sheridan, Вы писали:

>> В опенсорсе здесь просто анархия, держится на честном слове.

S>Твои слова держутся на честном слове
...из трех букв, как тот забор :-)
До последнего не верил в пирамиду Лебедева.
бизон ??
От: minorlogic Украина  
Дата: 12.06.08 19:46
Оценка:
)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re: мезон
От: Sheridan Россия  
Дата: 12.06.08 19:48
Оценка:
)
--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[3]: Качество кода open-source
От: Олег Гашев
Дата: 14.06.08 18:06
Оценка:
Здравствуйте, Mystic, Вы писали:


S>>4. Опять макросы, длинные функции по 500 и больше строк


M>Ну длинные функции, что с того? Предположим, что длина функции не следствие копипаста. А что можно сделать?


Не знаю. Если у меня функция не помещается на экране, значит что-то уже не так, значит надо переделывать код.
Либо я найду путь, либо проложу его. © Свифт
Re[4]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.06.08 09:15
Оценка:
Здравствуйте, Sheridan, Вы писали:

>> В опенсорсе здесь просто анархия, держится на честном слове.

S>Твои слова держутся на честном слове, извините за каламбур. Не участвовал ты в проектах вестимо...

А что, нужно учавствовать в проекте, дабы увидеть бред, который там вместо кода ?
Re[4]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.06.08 09:17
Оценка:
Здравствуйте, Cyberax, Вы писали:

I>>Только в опенсорсе некто недо может влезть насрать где попало. На конторах обычно есть кодинг-стандарты, код-ревью и всякие пакости другие, которые помогают сохранить чистоту кода, хотя бы отчасти.

C>Ты участвовал в достаточно крупных OpenSource-проектах? Правильно, не участвовал.

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

C>Так как в большинстве из них это всё есть.


Есть и что ? По моему качество кода в Опенсорсе обычно гораздо хуже, чем в коммерческом.
Re[4]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 15.06.08 09:29
Оценка:
Здравствуйте, IT, Вы писали:

IT>Это уже не open source, это — trash source. Ни в одном нормальном проекте тебе не дадут гадить просто так.


Опенсорсники не считают свой код корявым. Свой код им не кажется непонятным, сложным и тд и тд. В этом все дело.
Re[5]: Качество кода open-source
От: ambel-vlad Беларусь  
Дата: 15.06.08 10:56
Оценка:
Hi Ikemefula

>>> В опенсорсе здесь просто анархия, держится на честном слове.

S>>Твои слова держутся на честном слове, извините за каламбур. Не участвовал ты в проектах вестимо...

I>А что, нужно учавствовать в проекте, дабы увидеть бред, который там вместо кода ?


Чтобы посмотреть код участвовать не нужно. Но если бы ты поучаствовал в разработке open source продуктов, то чушь, которая выделена жирным ты бы не говорил. Потому что в противном случае получается как уже писали не open source, а trash source.
Re[5]: Качество кода open-source
От: Сергей  
Дата: 15.06.08 11:07
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Cyberax, Вы писали:


I>>>Только в опенсорсе некто недо может влезть насрать где попало. На конторах обычно есть кодинг-стандарты, код-ревью и всякие пакости другие, которые помогают сохранить чистоту кода, хотя бы отчасти.

C>>Ты участвовал в достаточно крупных OpenSource-проектах? Правильно, не участвовал.

I>Не нужно учавствовать, что бы взять да посмотреть исходный код.


Ну-ка расскажи, каким образом, посмотрев исходный код, можно "насрать где попало".

C>>Так как в большинстве из них это всё есть.


I>Есть и что ?


Есть и всё. Значит, применяют и соблюдают, и в этом аспекте нет разницы, закрытая разработка или открытая.

I>По моему качество кода в Опенсорсе обычно гораздо хуже, чем в коммерческом.


Это оно так по твоему, а не на самом деле.
Re[5]: Качество кода open-source
От: Сергей  
Дата: 15.06.08 11:08
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, IT, Вы писали:


IT>>Это уже не open source, это — trash source. Ни в одном нормальном проекте тебе не дадут гадить просто так.


I>Опенсорсники не считают свой код корявым. Свой код им не кажется непонятным, сложным и тд и тд. В этом все дело.


Прекрасно. А знаешь ли ты, что проприетарщики не считают свой код корявым? Свой код им не кажется непонятным, сложным и тд и тд. В этом все дело.
Re[5]: Качество кода open-source
От: Сергей  
Дата: 15.06.08 11:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:


I>А что, нужно учавствовать в проекте, дабы увидеть бред, который там вместо кода ?


В этом одно из отличий открытой разработки от закрытой. Для того, чтобы увидеть бред, который вместо кода в закрытом проекте, в нем обязательно надо участвовать, а в открытом — можно так посмотреть.
Re[3]: Качество кода open-source
От: shrecher  
Дата: 15.06.08 11:26
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Да и код зачастую исследовательский: возникает идея и непонятно, принесет она дивиденды или нет. Заранее все педантично оформлять не зватит никакого времени на разработку. Оформлять опосля? Не всегда есть и на это время.

M>Далее, такой код зачастую содержит элементы научно исследовательской работы. И находится он должен в виде, наиболее удобной исследователю. А далее разделение труда: исследователь дальше проводит исследования, адепты преобразуют результат его исследований в что-то более академическое. Не всегда эти два качества совмещаются в одном человеке.

Ну вообще-то production код.

M>К тому же ты явно недооцениваешь человеческие возможности. Если человек имеет мотивацию, то человек разберется.


Это непродуктивно.

S>>1. часто нет описания идеи что каждый модуль делает. Ее можно вытащить из кода, но долго


M>В двух словах ее можно вытащить из названия файла.

конечно можно! Разгадать все можно.
Вот доступность и идеи и ее понятность отличает профессионально написанный код от поделки.


S>>2. Минимум комментариев даже для очень нетривиальных методов

S>>
s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];


M>Если писать коментарии в таких местах, то весь код будет очень большим коментарием. Разработка раймет в разы больше времени. Выгода? Затрудняюсь ответить. Тут не коментарии нужны, а статья. Общий обзор.


Коментировать нужно не понятные места. Нет извенений, что не хватило времени.

S>>3. Магические констатны смысл которых может вытекать из общей картины, но не из конкретного метода.

S>>
if (uc == 0x17) goto endhdr_2;


M>Ну будет там стоять STATE_17, будет проще?


вы ведели код ядра WIndows? Его можно посмотреть в WDK. Там каждый фрагмет прокомментарен, все костанты проименованны со смыслом.

S>>4. Опять макросы, длинные функции по 500 и больше строк


M>Ну длинные функции, что с того?


Это плохо.

M>Так что при разработке проще держать все вместе одним большим замесом.


S>>5. однобуквенные названия переменных (j,i,n,s)


M>Придумай что получше


Я ничего не имею против если щетчик цикла назван i
for( int i=0;i<10; i++ ) do_something();

но если щетчик объявлен 20 строк выше цикла и используется как индекс массива, то его нужно именовать со смыслом

char mydata[ mydatasize ];
int idxMydata=0; // понятно, что индекс для массива mydata
for( idxMydata=0; idxMydata < mydatasize; idxMydata ++ )
mydata[idxMydata]=0;

Очень плохо когда индекс используется несколько раз для разных массивов.
Re[6]: хмм, смотреть как-то страшно :)
От: elmal  
Дата: 15.06.08 17:20
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Это сопрограмма. RTFM TAOCP 1.4.2.

RO>Алгоритм понимать необязательно, но обрати внимание, как часто вызывается YIELD. С точки зрения программирования, YIELD магическим образом обновляет состояние класса и продолжает выполнение (а на самом деле там return, после которого функция вызывается еще раз с обновленными параметрами).
Код посмотрел и ужаснулся. Ужаснули оба варианта — непонятно ни черта при беглом прочтении, явно требуется в обоих случаях уменьшать уровни вложенности, выделять методы и к выделенным методам писать комментарий. Но вообще, второй вариант мне понравился гораздо больше — там более менее все понятно, особенно если избавиться от волшебных чисел и выделить обработку каждого состояния в отдельный метод (да и от if было бы неплохо избавиться, либо просто непосредственно замапив состояние на его обработчик либо воспользовавшись полиморфизмом и выделив state в отдельный класс). Точнее — второй вариант можно сказать что вообще понравился, замечания у меня мелкие. Хотя, вариант с YIELD вполне имеет право на жизнь, вот только код подструктурировать надо чтоб его понять можно было простым чтением. А в текущей реализации у меня при попытке разобраться в первом варианте начинает голова болеть, если мне такое в рабочем коде встретится я устану черти как уже максимум через 4 часа и дальше уже работать не смогу

И вот теперь стало интересно. Лет 5 назад я бы не ужасался, считал что так и надо писать, восхищался элегантностью решения и умом разработчика и т.д. А сейчас как-то на такое страшно смотреть, понимание, каким должен быть код стало абсолютно другое. Интересно — это что, деградация у меня, или наоборот ? А то — если у кого нахожу из джуниоров такой стиль — дико матерюсь и прошу переписать (или сам переписываю еще более матерясь, если мне там баг приходится править), может я не прав и так и надо писать, а мне уже завязывать пора с программированием ?
Re[7]: хмм, смотреть как-то страшно :)
От: Олег Гашев
Дата: 15.06.08 17:43
Оценка:
Здравствуйте, elmal, Вы писали:


E>И вот теперь стало интересно. Лет 5 назад я бы не ужасался, считал что так и надо писать, восхищался элегантностью решения и умом разработчика и т.д. А сейчас как-то на такое страшно смотреть, понимание, каким должен быть код стало абсолютно другое. Интересно — это что, деградация у меня, или наоборот ? А то — если у кого нахожу из джуниоров такой стиль — дико матерюсь и прошу переписать (или сам переписываю еще более матерясь, если мне там баг приходится править), может я не прав и так и надо писать, а мне уже завязывать пора с программированием ?



Сделай так просто, как возможно, но не проще этого.


(C) Альберт Эйнштейн
Либо я найду путь, либо проложу его. © Свифт
Re[5]: Качество кода open-source
От: elmal  
Дата: 15.06.08 19:17
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Вполне нормальный код, в общем.

Код конечно ужасным не назову, понять можно не сильно напрягаясь, но можно написать более красиво и понятно, простор для улучшения есть, не идеально . ИМХО
Re[4]: Качество кода open-source
От: WFrag США  
Дата: 16.06.08 02:33
Оценка:
Здравствуйте, shrecher, Вы писали:

M>>Ну будет там стоять STATE_17, будет проще?


S>вы ведели код ядра WIndows? Его можно посмотреть в WDK. Там каждый фрагмет прокомментарен, все костанты проименованны со смыслом.


Скажем, Eclipse SDK тоже вполне хорошо прокомментарен, все константы проименованы со смыслом, и.т.д
Re[6]: Качество кода open-source
От: Cyberax Марс  
Дата: 16.06.08 03:01
Оценка:
Здравствуйте, elmal, Вы писали:

C>>Вполне нормальный код, в общем.

E>Код конечно ужасным не назову, понять можно не сильно напрягаясь, но можно написать более красиво и понятно, простор для улучшения есть, не идеально . ИМХО
Ну так напиши... Из всего что я смотрел, в Putty очень простой и понятный код работы с SSL. В OpenSSL он заметно запутаннее.
Sapienti sat!
Re[5]: Качество кода open-source
От: shrecher  
Дата: 16.06.08 03:32
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Maxim S. Shatskih, Вы писали:


С>>>Ты знаком со всем open-source кодом?

MSS>>Нет, но с многим. Угребищный стиль кодирования там норма.
C>Взял несколько проектов, которые у меня сейчас лежат в виде исходников (кроме ядра Линукса) и взял оттуда наугад кусок кода.

C>1) Cairo — обычный чистый С-шный код, ничего особого.


Нормальный код, форматированный и читаемый. Только не понятно почему надо на С уродоваться, если есть С++.
Re[6]: Качество кода open-source
От: Sheridan Россия  
Дата: 16.06.08 05:17
Оценка:
shrecher однажды (16 июня 2008 [Понедельник] 07:32) писал:

> Нормальный код, форматированный и читаемый. Только не понятно почему надо на С уродоваться, если есть С++.

Наследие у плюсов такое, быть потомком С. Да и С заметно быстрее компилируется, несколько быстрее работает и потребляет меньше памяти...

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[7]: Качество кода open-source
От: CreatorCray  
Дата: 16.06.08 05:27
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>несколько быстрее работает и потребляет меньше памяти...

Ну щас чую опять начнется C vs C++
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[8]: Качество кода open-source
От: Sheridan Россия  
Дата: 16.06.08 06:09
Оценка:
CreatorCray однажды (16 июня 2008 [Понедельник] 09:27) писал:

> Ну щас чую опять начнется C vs C++

Повоюйте, ага. А я почитаю...
Как раз читаю книжку по истории С++, довольно интересно

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[5]: Качество кода open-source
От: shrecher  
Дата: 16.06.08 09:37
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Здравствуйте, shrecher, Вы писали:


M>>>Ну будет там стоять STATE_17, будет проще?


S>>вы ведели код ядра WIndows? Его можно посмотреть в WDK. Там каждый фрагмет прокомментарен, все костанты проименованны со смыслом.


WF>Скажем, Eclipse SDK тоже вполне хорошо прокомментарен, все константы проименованы со смыслом, и.т.д


Ну я говорю, что весь код плохой. Просто OSS привлекает новичков и студентов, от этого и качества кода сильно страдает. Нормальный код, это тот, который написан и выложен большими конторами IBM, RH и пр.
Re[6]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.06.08 09:50
Оценка:
Здравствуйте, Сергей, Вы писали:

I>>Не нужно учавствовать, что бы взять да посмотреть исходный код.


С>Ну-ка расскажи, каким образом, посмотрев исходный код, можно "насрать где попало".


Я говорю о том, что в коде уже было насрано до того, как я в него сунул нос.

Так понятно ?

C>>>Так как в большинстве из них это всё есть.


I>>Есть и что ?


С>Есть и всё. Значит, применяют и соблюдают, и в этом аспекте нет разницы, закрытая разработка или открытая.


Разница есть. Многие опенсорсники очень волюнтаристски относятся к исходному коду. Очень часто опенсорс это отсутствие должного контроля над качеством кода.

I>>По моему качество кода в Опенсорсе обычно гораздо хуже, чем в коммерческом.

С>Это оно так по твоему, а не на самом деле.

Разумеется, я то говорю о том что видел, в отличие от твоего "на самом деле"
Re[6]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.06.08 09:54
Оценка:
Здравствуйте, Сергей, Вы писали:

IT>>>Это уже не open source, это — trash source. Ни в одном нормальном проекте тебе не дадут гадить просто так.


I>>Опенсорсники не считают свой код корявым. Свой код им не кажется непонятным, сложным и тд и тд. В этом все дело.


С>Прекрасно. А знаешь ли ты, что проприетарщики не считают свой код корявым? Свой код им не кажется непонятным, сложным и тд и тд. В этом все дело.


В коммерческом коде, где одноразовые проекты, все примерно как в опенсорсе.

А вот в более серьезных проектах обычно есть контроль за качеством кода. И здесь девелоперы приучаются писать не для себя одного.
Re[7]: Качество кода open-source
От: shrecher  
Дата: 16.06.08 10:01
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Да и С заметно быстрее компилируется,

На современном железе это не имеет большого значения.

S>несколько быстрее работает и потребляет меньше памяти...


Очень не значително. Прой даже C++ быстрее, т.к. более оптимизирован компилятор производителями.
Re[5]: Качество кода open-source
От: Cyberax Марс  
Дата: 16.06.08 10:02
Оценка:
Здравствуйте, Ikemefula, Вы писали:

C>>Ты участвовал в достаточно крупных OpenSource-проектах? Правильно, не участвовал.

I>Не нужно учавствовать, что бы взять да посмотреть исходный код.
Каких библиотек, например?

C>>Так как в большинстве из них это всё есть.

I>Есть и что ? По моему качество кода в Опенсорсе обычно гораздо хуже, чем в коммерческом.
У меня прямо противоположный опыт. Я видел слишком много коммерческого Г., которые стыдно вообще показывать. Ты просто его не видишь — исходников-то нет.
Sapienti sat!
Re[6]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.06.08 10:08
Оценка:
Здравствуйте, shrecher, Вы писали:

WF>>Скажем, Eclipse SDK тоже вполне хорошо прокомментарен, все константы проименованы со смыслом, и.т.д


S>Ну я говорю, что весь код плохой. Просто OSS привлекает новичков и студентов, от этого и качества кода сильно страдает. Нормальный код, это тот, который написан и выложен большими конторами IBM, RH и пр.


Разница в том, как управляются проекты. В опенсорсе эта часть обычно очень сильно хромает.
Re[7]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.06.08 10:09
Оценка:
Здравствуйте, Cyberax, Вы писали:

E>>Код конечно ужасным не назову, понять можно не сильно напрягаясь, но можно написать более красиво и понятно, простор для улучшения есть, не идеально . ИМХО

C>Ну так напиши... Из всего что я смотрел, в Putty очень простой и понятный код работы с SSL. В OpenSSL он заметно запутаннее.

А по моему код в Путти одноразовый — взять да выкинуть. Это код для одного человека — автора проекта и никого больше.
Re[8]: Качество кода open-source
От: WFrag США  
Дата: 16.06.08 10:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А по моему код в Путти одноразовый — взять да выкинуть. Это код для одного человека — автора проекта и никого больше.


И где тут куча гадящих в код в таком случае? Был бы это коммерческий проект одного человека, он что, автоматически лучше был бы, что ли? Непонятно.
Re[9]: Качество кода open-source
От: jazzer Россия Skype: enerjazzer
Дата: 16.06.08 10:26
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...

Код "любого случая" в студию.
А именно, сишный код, который, являясь валидным кодом С++ и будучи скомпилированным компилятором С++, "потребляет больше память"

S>Да и вызовы в с++ частенько лишний шаг по vtable делают...

А вызовы в С — по указателю.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[10]: Качество кода open-source
От: Sheridan Россия  
Дата: 16.06.08 10:30
Оценка:
jazzer однажды (16 июня 2008 [Понедельник] 14:26) писал:

> S>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...

> Код "любого случая" в студию.
> А именно, сишный код, который, являясь валидным кодом С++ и будучи скомпилированным компилятором С++, "потребляет больше память"
Я имею ввиду С код для С vs С++ код для С++
Речь о компиляции С кода компилятором С++ не идет.

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[6]: Качество кода open-source
От: WFrag США  
Дата: 16.06.08 10:30
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Ну я говорю, что весь код плохой. Просто OSS привлекает новичков и студентов, от этого и качества кода сильно страдает.


Хорошо, возьмём Spring Framework. Тоже вполне приличный код.

S>Нормальный код, это тот, который написан и выложен большими конторами IBM, RH и пр.


Не только. Плюс от этого он не перестаёт быть OSS. При этом я бы не сказал, что сообщество OS прямо-таки ничего не дало тому же Eclipse и вся заслуга исключительно IBM.
Re[11]: Качество кода open-source
От: jazzer Россия Skype: enerjazzer
Дата: 16.06.08 10:33
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>jazzer однажды (16 июня 2008 [Понедельник] 14:26) писал:


>> S>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...

>> Код "любого случая" в студию.
>> А именно, сишный код, который, являясь валидным кодом С++ и будучи скомпилированным компилятором С++, "потребляет больше память"
S>Я имею ввиду С код для С vs С++ код для С++
S>Речь о компиляции С кода компилятором С++ не идет.

значит, речь идет вообще ни о чем.
потому что "любой случай" подразумевает и код С, который является валидным кодом С++.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[7]: Качество кода open-source
От: shrecher  
Дата: 16.06.08 12:28
Оценка:
Здравствуйте, WFrag, Вы писали:

WF>Здравствуйте, shrecher, Вы писали:


S>>Ну я НЕ говорю, что весь код плохой. Просто OSS привлекает новичков и студентов, от этого и качества кода сильно страдает.


WF>Хорошо, возьмём Spring Framework. Тоже вполне приличный код.


Опечатался выше, пропустил не.

S>>Нормальный код, это тот, который написан и выложен большими конторами IBM, RH и пр.


WF>Не только.


Редко. Сразу заметно, если за кодом стоит приличная компания или делетанты.
Re[9]: Качество кода open-source
От: shrecher  
Дата: 16.06.08 12:31
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>shrecher однажды (16 июня 2008 [Понедельник] 14:01) писал:


>> Здравствуйте, Sheridan, Вы писали:

>>
>> S>Да и С заметно быстрее компилируется,
>> На современном железе это не имеет большого значения.
S>Еще раз: С компилируется заметно быстрее С++. Это я тебе как гентушник говорю.

заметно быстрее это 20%? И что? Ждать вместо 40 секунд — 50. Велика беда?

>> S>несколько быстрее работает и потребляет меньше памяти...

>> Очень не значително. Прой даже C++ быстрее, т.к. более оптимизирован компилятор производителями.
S>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...
S>Да и вызовы в с++ частенько лишний шаг по vtable делают...

Это очень незначительный overhead особенно на современном железе. Сколько сейчас стоит 1 Gb памяти?
Re[6]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.06.08 14:49
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, Ikemefula, Вы писали:


C>>>Ты участвовал в достаточно крупных OpenSource-проектах? Правильно, не участвовал.

I>>Не нужно учавствовать, что бы взять да посмотреть исходный код.
C>Каких библиотек, например?

К чему разговор ? Ты считаешь код в Путти нормальным, а я считаю этот код говном. Для чего сравнивать какие то еще библиотеки ?

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

C>>>Так как в большинстве из них это всё есть.

I>>Есть и что ? По моему качество кода в Опенсорсе обычно гораздо хуже, чем в коммерческом.
C>У меня прямо противоположный опыт. Я видел слишком много коммерческого Г., которые стыдно вообще показывать. Ты просто его не видишь — исходников-то нет.

Если ты был на одноразовых проектах то так и должно быть.
Когда нет должного контроля за качеством кода и уровнем подготовки девелоперов здесь будет все одинаково.
Re[9]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 16.06.08 14:54
Оценка:
Здравствуйте, WFrag, Вы писали:

I>>А по моему код в Путти одноразовый — взять да выкинуть. Это код для одного человека — автора проекта и никого больше.


WF>И где тут куча гадящих в код в таком случае? Был бы это коммерческий проект одного человека, он что, автоматически лучше был бы, что ли? Непонятно.


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

Этого в путти нет из за короутин, которые суть эмуляция yield

Что бы код был лучше, автор должен работь под начальством конкретного челвоека, который будет заинтересован в качестве кода и , например, посадит для codereview специального человека или сунет в группу, где люди будут думать головой а не эмулировать конструкции.
Re[10]: Качество кода open-source
От: WFrag США  
Дата: 16.06.08 16:12
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Что бы код был лучше, автор должен работь под начальством конкретного челвоека, который будет заинтересован в качестве кода и , например, посадит для codereview специального человека или сунет в группу, где люди будут думать головой а не эмулировать конструкции.


И какая связь с закрытостью/открытостью кода? Вон возьми тот же Spring Framework. Большой OS проект. Качество кода — на уровне. Не каждый OS проект — это одноразовая поделка для самого себя.
Re[11]: Качество кода open-source
От: shrecher  
Дата: 16.06.08 23:40
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, shrecher, Вы писали:


S>>заметно быстрее это 20%? И что? Ждать вместо 40 секунд — 50. Велика беда?


I>Ну и проекты у тебя


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

I>Как на счет времени компиляции около двух трех часов на современном железе ?


Ну тогда тебе точно на С переходить.

S>>>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...

S>>>Да и вызовы в с++ частенько лишний шаг по vtable делают...

S>>Это очень незначительный overhead особенно на современном железе. Сколько сейчас стоит 1 Gb памяти?


I>Это огромный оверхед на самом деле. Для платформы i32 разумеется.


В смысле? Если твоя программа будет на 5 мб, а 6 мб требовать это пользователей не волнует.
Re[9]: Качество кода open-source
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.06.08 03:21
Оценка:
Здравствуйте, Sheridan, Вы писали:
>> S>несколько быстрее работает и потребляет меньше памяти...
>> Очень не значително. Прой даже C++ быстрее, т.к. более оптимизирован компилятор производителями.
S>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...
S>Да и вызовы в с++ частенько лишний шаг по vtable делают...
Не позорься. Этот миф был развеян еще до того, как ты вилкой кушать научился.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[12]: Качество кода open-source
От: Sheridan Россия  
Дата: 17.06.08 05:20
Оценка:
shrecher однажды (17 июня 2008 [Вторник] 03:40) писал:

> Какие есть и этому рад. Кстати, главное не проекты, а сколько платят

> Любой большой проект можно разделить на подмодули и компилировать только их.
Надо же, ты поддерживаеш одно из основных правил линукса — не плодить монстров, а писать много мелких программок-утилиток.

> I>Как на счет времени компиляции около двух трех часов на современном железе ?

> Ну тогда тебе точно на С переходить.
А чего не на перл/пхп? там вообще компилить ненадо.

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[10]: Качество кода open-source
От: Sheridan Россия  
Дата: 17.06.08 05:21
Оценка:
Sinclair однажды (17 июня 2008 [Вторник] 07:21) писал:

> S>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...

> S>Да и вызовы в с++ частенько лишний шаг по vtable делают...
> Не позорься. Этот миф был развеян еще до того, как ты вилкой кушать научился.
Тебе страничку книги сфотографировать, где это написано?

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[11]: Качество кода open-source
От: CreatorCray  
Дата: 17.06.08 05:44
Оценка:
Здравствуйте, Sheridan, Вы писали:

>> S>Да и вызовы в с++ частенько лишний шаг по vtable делают...

>> Не позорься. Этот миф был развеян еще до того, как ты вилкой кушать научился.
S>Тебе страничку книги сфотографировать, где это написано?
А я тебе подкину кусок кода где ни одной виртуальной функции
и посмотрю как ты там vtbl искать будешь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[11]: Качество кода open-source
От: Cyberax Марс  
Дата: 17.06.08 05:48
Оценка:
Здравствуйте, Sheridan, Вы писали:

>> S>Да и вызовы в с++ частенько лишний шаг по vtable делают...

>> Не позорься. Этот миф был развеян еще до того, как ты вилкой кушать научился.
S>Тебе страничку книги сфотографировать, где это написано?
Тебе сфотографировать забор, на котором кое-что известное написано?
Sapienti sat!
Re[12]: Качество кода open-source
От: Sheridan Россия  
Дата: 17.06.08 05:52
Оценка:
CreatorCray однажды (17 июня 2008 [Вторник] 09:44) писал:

>>> S>Да и вызовы в с++ частенько лишний шаг по vtable делают...

>>> Не позорься. Этот миф был развеян еще до того, как ты вилкой кушать научился.
> S>Тебе страничку книги сфотографировать, где это написано?
> А я тебе подкину кусок кода где ни одной виртуальной функции
> и посмотрю как ты там vtbl искать будешь.
Кусочек кода — согласен. Кусочек кода можно по всякому написать.
А вот в проекте, с использованием библиотек, stl, и прочего какраз таки и появляется это "частенько".
CreatorCray я не против с++, я даже за. Его удобство с головой покрывает все издержки.

--
...belive in the matrix...
Posted via RSDN NNTP Server 2.1 beta
Matrix has you...
Re[11]: Качество кода open-source
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.06.08 05:53
Оценка:
Здравствуйте, Sheridan, Вы писали:
S>Тебе страничку книги сфотографировать, где это написано?
Ок, сфотографируй. Вместе с выходными данными, плиз.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: Качество кода open-source
От: jazzer Россия Skype: enerjazzer
Дата: 17.06.08 06:26
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>shrecher однажды (17 июня 2008 [Вторник] 03:40) писал:


>> Какие есть и этому рад. Кстати, главное не проекты, а сколько платят

>> Любой большой проект можно разделить на подмодули и компилировать только их.
S>Надо же, ты поддерживаеш одно из основных правил линукса — не плодить монстров, а писать много мелких программок-утилиток.

Это правило появилось еще до того, как Линус появился.
Не надо все себе присваивать.

>> I>Как на счет времени компиляции около двух трех часов на современном железе ?

>> Ну тогда тебе точно на С переходить.
S>А чего не на перл/пхп? там вообще компилить ненадо.

Очень хороший вопрос.
перл рулит.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[12]: Качество кода open-source
От: _d_m_  
Дата: 17.06.08 06:54
Оценка:
Здравствуйте, Cyberax, Вы писали:

S>>Тебе страничку книги сфотографировать, где это написано?

C>Тебе сфотографировать забор, на котором кое-что известное написано?

Да уж лучше сразу то, о чем там написано
Re[12]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.06.08 09:06
Оценка:
Здравствуйте, shrecher, Вы писали:

I>>Как на счет времени компиляции около двух трех часов на современном железе ?


S>Ну тогда тебе точно на С переходить.


Я перешел на дотнет. Проект такого же масштаба компилится от силы пятнадцать минут.

S>>>Это очень незначительный overhead особенно на современном железе. Сколько сейчас стоит 1 Gb памяти?


I>>Это огромный оверхед на самом деле. Для платформы i32 разумеется.


S>В смысле? Если твоя программа будет на 5 мб, а 6 мб требовать это пользователей не волнует.


Программа кушает около полуторагигабайт памяти. лишние lpVtbl дают и вовсе выход за границы процесса, в виндовсе это 2гб и планками памяти это не лечится.
Можно сделать 3гб, но это требует серверную версию и особую линковку проекта.
Re[14]: Качество кода open-source
От: Сергей  
Дата: 17.06.08 09:26
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Ну еще-бы интерпритаторокомпилятор долго компилил


Дело не в этом. Наример, паскаль компилируется тоже очень быстро.
Re[17]: Качество кода open-source
От: WFrag США  
Дата: 17.06.08 10:25
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Объявление переменных здесь абсолютно ни при чем.

J>Просто в С самая уродская схема подключения пакетов из всех возможных (рекурсивное текстовое включение препроцессором).

А если сюда добавить ещё и C++-ные шаблоны, то вообще туши свет
Re[11]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.06.08 11:52
Оценка:
Здравствуйте, Sheridan, Вы писали:

>> S>C++ в любом случае потребляет больше память, хоть и незначительно. Издержки производства, так сказать...

>> S>Да и вызовы в с++ частенько лишний шаг по vtable делают...
>> Не позорься. Этот миф был развеян еще до того, как ты вилкой кушать научился.
S>Тебе страничку книги сфотографировать, где это написано?

Будь добр, сфотографируй и выложи куда.

Только что бы это был действительно лишний шаг по vtbl и с объяснением, как надо без этого шага.
Re[13]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.06.08 11:56
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>CreatorCray однажды (17 июня 2008 [Вторник] 09:44) писал:


>>>> S>Да и вызовы в с++ частенько лишний шаг по vtable делают...

>>>> Не позорься. Этот миф был развеян еще до того, как ты вилкой кушать научился.
>> S>Тебе страничку книги сфотографировать, где это написано?
>> А я тебе подкину кусок кода где ни одной виртуальной функции
>> и посмотрю как ты там vtbl искать будешь.
S>Кусочек кода — согласен. Кусочек кода можно по всякому написать.
S>А вот в проекте, с использованием библиотек, stl, и прочего какраз таки и появляется это "частенько".

Конкретный пример приведи пожалуйста, желательно что бы я смог скомпилить запустить дебугер и увидеть этот лишний заход в lpVtbl
Re[14]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.06.08 12:01
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Меня вообще удивляет, в С вызовы функций по указателям на каждом шагу, и ничего, а в С++ абсолютно такой же вызов по указателю в vtbl — все, немерянные издержки.


ну издержки в с++ побольше будут в ряде случаев. Размер указателя на метод может быть больше 4 в с++ на платформе i32. В с это всегда 4.

Т.е. это неравноценное сравнение, в с придется в таком случае чуток боьлше всякой всячины написать.
Re[18]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 17.06.08 12:04
Оценка:
Здравствуйте, WFrag, Вы писали:

J>>Объявление переменных здесь абсолютно ни при чем.

J>>Просто в С самая уродская схема подключения пакетов из всех возможных (рекурсивное текстовое включение препроцессором).

WF>А если сюда добавить ещё и C++-ные шаблоны, то вообще туши свет


Хы-хы-хы
Re[14]: Качество кода open-source
От: Pzz Россия https://github.com/alexpevzner
Дата: 17.06.08 19:26
Оценка:
Здравствуйте, Sheridan, Вы писали:

>> S>Ну тогда тебе точно на С переходить.

>> Я перешел на дотнет. Проект такого же масштаба компилится от силы пятнадцать минут.
S>Ну еще-бы интерпритаторокомпилятор долго компилил

Дело не в этом. У C++ синтаксис очень сложный. Кроме того, из-за #include очень много текста попадает в поле зрения компилятора — ему приходится просматривать хидеры по сто раз.
Re[10]: фото
От: Cyberax Марс  
Дата: 17.06.08 20:28
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Добрался до книжки.

Ну и? Как ни странно, но виртуальные вызовы идут через таблицу виртуальных вызовов. Следующая новость: вода — мокрая, небо — голубое, трава — зелёная.

Как ни странно, но в С++ прекрасно можно жить без виртуальных вызовов (например, их почти нет в STL). Точно так же как и в С можно использовать вызовы через vtbl.
Sapienti sat!
Re[10]: фото
От: jazzer Россия Skype: enerjazzer
Дата: 18.06.08 01:01
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Добрался до книжки.


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

Более того, вот тебе задача:
struct A1 { virtual void f(){} };
struct A2: A1 { virtual void f(){ A1::f(); } };
...
struct A100: A99 { virtual void f(){ A99::f(); } };
int main()
{
  A100 a100;
  a100.f();
}

А теперь посчитай, сколько здесь виртуальных вызовов, и нужно ли их все делать через vtbl, или компилятор может принять решение на этапе компиляции (и принимает, если нормальный компилятор)?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[13]: Качество кода open-source
От: shrecher  
Дата: 18.06.08 04:39
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I> Я перешел на дотнет.

Я тоже дотнет очень уважаю, но там платят хуже чем c++, а это ключевой момент.

I>Программа кушает около полуторагигабайт памяти. лишние lpVtbl дают и вовсе выход за границы процесса, в виндовсе это 2гб и планками памяти это не лечится.


Если программа нуждается около полуторагигабайт оперативной памяти, то возможно ей на X86 уже делать нечего, нужно 64 бита внедрять. Пытаться оптимизировать путем перехода на С, это только отягивать себе конец, в любой момент нужно будет масштабировать и тут все упрется в ограничения процессора. А для x64 проблем с адресации в данную эру еще не существует.
Re[14]: Качество кода open-source
От: Sergey Россия  
Дата: 18.06.08 07:38
Оценка:
shrecher пишет:

> Если программа нуждается около полуторагигабайт *оперативной* памяти, то

> возможно ей на X86 уже делать нечего, нужно 64 бита внедрять. Пытаться
> оптимизировать путем перехода на С, это только отягивать себе конец, в
> любой момент нужно будет масштабировать и тут все упрется в ограничения
> процессора. А для x64 проблем с адресации в данную эру еще не существует.

Для x64 к сожалению существует проблема с корпоративными клиентами,
которые не хотят менять операционку.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[14]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.06.08 08:47
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Если программа нуждается около полуторагигабайт оперативной памяти, то возможно ей на X86 уже делать нечего, нужно 64 бита внедрять.


Это не я решаю, а корпоративные клиенты.

>Пытаться оптимизировать путем перехода на С, это только отягивать себе конец, в любой момент нужно будет масштабировать и тут все упрется в ограничения процессора. А для x64 проблем с адресации в данную эру еще не существует.


Никто и не пытается переходить на С. Вместо этого перешли на дотнет.
Re[14]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.06.08 09:00
Оценка:
Здравствуйте, shrecher, Вы писали:

S>Здравствуйте, Ikemefula, Вы писали:

I>>Программа кушает около полуторагигабайт памяти. лишние lpVtbl дают и вовсе выход за границы процесса, в виндовсе это 2гб и планками памяти это не лечится.

S>Кстати, около полуторагигабайт памяти вероятнее всего занимают данные. А они будут везде едины, что на С, что на С++ или C#. lpVtbl возможно и прибавит насколько мегабайт к исполняемому коду, но на размер данных это не скажется.


Так да не так. lpvtbl при множественном наследовании не один на объект, а несколько штук.

для этого, кстати, придумана оптимизация если дерево наследования огромное, __declspec(novtable)

Основная проблема, когда объекты мелкие и их очень много.
Re[15]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 18.06.08 09:04
Оценка:
Здравствуйте, Ikemefula, Вы писали:

S>>Здравствуйте, Ikemefula, Вы писали:

I>>>Программа кушает около полуторагигабайт памяти. лишние lpVtbl дают и вовсе выход за границы процесса, в виндовсе это 2гб и планками памяти это не лечится.

S>>Кстати, около полуторагигабайт памяти вероятнее всего занимают данные. А они будут везде едины, что на С, что на С++ или C#. lpVtbl возможно и прибавит насколько мегабайт к исполняемому коду, но на размер данных это не скажется.


I>Так да не так. lpvtbl при множественном наследовании не один на объект, а несколько штук.


I>для этого, кстати, придумана оптимизация если дерево наследования огромное, __declspec(novtable)


I>Основная проблема, когда объекты мелкие и их очень много.


И основная проблема кстати говоря, не размер, а управление памятью. На дотнете памяти стало расходоваться немного больше, но пропала необходимость искать утечки памяти, утечки интерфейсов и тд.
Re[15]: Качество кода open-source
От: shrecher  
Дата: 18.06.08 10:02
Оценка:
Здравствуйте, Sergey, Вы писали:

S>shrecher пишет:


>> Если программа нуждается около полуторагигабайт *оперативной* памяти,


S>Для x64 к сожалению существует проблема с корпоративными клиентами,

S>которые не хотят менять операционку.


Понимаешь, тут либо 1.5 Gb либо лицензия на 64-bit. Можно ESX поставить и как к терминалу коннектится если что-то жутко большое.

Да, отвлеклись от темы. Язык программированния тут имеет малое значение. Использование чистого С проблему не решит, а сделает только хуже — будет больше security проблем, всякие strcpy вылезут.
Re[12]: фото
От: Константин Б. Россия  
Дата: 19.06.08 01:09
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Sinclair однажды (18 июня 2008 08:16) писал:


S>А затраты времени на компилирование — это фигня. Компилируется 1 раз.


http://xkcd.com/303/
Re[5]: putty paste patch
От: jazzer Россия Skype: enerjazzer
Дата: 14.04.09 03:07
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, Cyberax, Вы писали:


C>>А что за патч?

J>Сейчас он пэйстит при нажатии средней кнопки мыши.
J>А должен пэйстить при ее отпускании, иначе оно нифига не работает с Exceed, который копирует иксовое содержимое в буфер при потере фокуса, которое как раз при нажатии и происходит.
J>Т.е. PuTTY в результате вставляет предыдущее содержимое, а если кликнуть еще раз, то уже вставит новое.
J>Выглядит это феерически.

J>В этом патч и состоит.


В общем, год с лишним прошел, эффекта нет.

На всякий случай, чтоб не затерялось, и если вдруг кому еще пригодится, выкладываю решение здесь:

файл terminal.c, строка 5800, выглядит так:
    } else if (bcooked == MBT_PASTE
               && (a == MA_CLICK           //  <-- this is the line 5800
#if MULTICLICK_ONLY_EVENT
                   || a == MA_2CLK || a == MA_3CLK
#endif
                   )) {
        request_paste(term->frontend);
    }

надо заменить этот код на
    } else if (bcooked == MBT_PASTE && a == MA_RELEASE) {
        request_paste(term->frontend);
    }

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

Если у кого есть энергия общаться с разработчиками — велкам.
Мне моего локального билда с патчем хватает.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
putty paste-on-release patch middle click вставка
Re[7]: �������� ���� open-source
От: byleas  
Дата: 14.04.09 04:56
Оценка:
Здравствуйте, max779, Вы писали:

M>вот ты пишешь программу и пользуешься этими магическими YIELD и т.д. Потом ты увольняешься, на твое место приходит другой кодер и он не знаком с этим делом...

Если не индус, то либо будет иметь представление об этом, либо разберётся. Иначе — зачем вам ещё одна обезьянка?
Re[7]: Качество кода open-source
От: vladimir.vladimirovich США  
Дата: 16.04.09 00:31
Оценка:
Здравствуйте, Ikemefula, Вы писали:

> I>А вот в более серьезных проектах обычно есть контроль за качеством кода. И здесь девелоперы приучаются писать не для себя одного.


Позвольте поинтересоваться вашим серьезным проектом. Название, заказчика, подрядчика ну хоть что-то что не секретно. Ну и желательно расскажите как вы работаете с данными.
Re[8]: Качество кода open-source
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 19.04.09 14:13
Оценка:
Здравствуйте, vladimir.vladimirovich, Вы писали:

>> I>А вот в более серьезных проектах обычно есть контроль за качеством кода. И здесь девелоперы приучаются писать не для себя одного.


VV>Позвольте поинтересоваться вашим серьезным проектом. Название, заказчика, подрядчика ну хоть что-то что не секретно. Ну и желательно расскажите как вы работаете с данными.


Это могу только если почтой. Я, правда, не говорил, что у нас код идеальный. Но имею представление как относятся к коду на крупных конторах. Собственно, это видно, когда открываешь исходники которые выкладывают гиганты.

Что тебя интересует про данные ?
Re: Качество кода open-source
От: criosray  
Дата: 19.04.09 21:07
Оценка:
Заранее извиняюсь, что не по теме, но уж очень позабавило
http://www.youtube.com/watch?v=hSu2dzu--TE&amp;feature=channel
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.