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
Оценка: +2 -1
LD>>>Мне интересно, весь open-source написан так же или это мне так повезло?

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


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


Нет, но с многим. Угребищный стиль кодирования там норма.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[3]: Качество кода open-source
От: Maxim S. Shatskih Россия  
Дата: 25.05.08 18:06
Оценка:
_>всякого фри- и шароварного барахла

Вот в это верю.
Занимайтесь LoveCraftом, а не WarCraftом!
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[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[9]: Сопрограммы
От: Cyberax Марс  
Дата: 26.05.08 10:02
Оценка: :)
Здравствуйте, max779, Вы писали:

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

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

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

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

Ну это из более другого флейма (RSS против NNTP).
До последнего не верил в пирамиду Лебедева.
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), указателя ну функцию обработки перехода и указатель на состояние в котрое переход.
Ну и пишешь состояние -- списко указателейна переходы.

Ну и ходишь по этому автомату...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.