Re: Функционал и интерфейс
Покотиленко Костик -> debian-russian@lists.debian.org @ Mon, 23 Mar 2009 18:43:52 +0200:
>> >> >> >> И на каждое выделение памяти. Вверх по всему стеку вызовов.
>> >> >>
>> >> >> ПК> Если не увлекаться вызовом malloc() inline, а каждый "объект"
>> >> >> ПК> делать набор функций create, destroy и т.д. то это не много и
>> >> >> ПК> оправдано. Кстати, разделяя функционал от интерфейса и выделив
>> >> >> ПК> библиотеку, так даже проще.
>> >> >>
>> >> >> Любая попытка выделить память может закончиться неудачей. И называется
>> >> >> она malloc() или create - рояля не играет. Ну, с точностью еще до
>> >> >> классических грабель "объективизации" конструкции, описанных во всех
>> >> >> книжках по C++ - "что будет, если ошибка произойдет в момент, когда
>> >> >> память выделена под _часть_ подобъектов?"
>> >>
>> >> ПК> Если ты программист Си - решать тебе что будет.
>> >>
>> >> Не вопрос. Но существует только один приемлемый способ решения -
>> >> аккуратно очистить все, что успело выделиться до этого момента. В
>> >> случае с C - вручную отследив, что же успело выделиться.
>>
>> ПК> Что значит успело выделиться? Само оно не выделяется, по крайней
>> ПК> мере в Си.
>>
>> На примере gtk.
>>
>> Как ты создаешь композитный виджет? Создаешь внутренние, и делаешь им
>> add. По очереди. Если у тебя обломалость по недостатку памяти создание
>> второго внутреннего виджета, ты перед возвратом должен только прибить
>> внешний. А вот если обломался его add, то удаления внешнего для
>> освобождения памяти внутреннего недостаточно - он же не добавился. Надо
>> его destroy вручную. И так с каждым.
ПК> Вопрос интересный:
ПК> void gtk_container_add(...);
ПК> void gtk_box_pack_start (...);
ПК> void gtk_table_attach(...);
ПК> Ни одна не возвращает результат. Варианта 2: либо добавление не
ПК> требует выделения ресурсов и обломов быть не может, либо таки об
ПК> ошибке мы и не узнаем. Прям сейчас не скажу как именно оно
ПК> работает, но на практике у меня таких обломов не встречалось. Если,
ПК> конечно, добавлять то, что заведомо реально добавить.
Мое мнение о том, что реально добавить, с мнением автора библиотеки
может и не совпасть... Ну, не знаю, конкретно в gtk, может, и
гарантированно добавляет без ошибок. Но в питоне оно у меня ухитрялось
отваливаться. Ага, по assert'у. Типа "мы ошибок не возвращаем, если
что не так - мы рушим нах всю программу". Тоже, конечно, вариант. Так
firefox и падает.
ПК> С другой стороны, даже если добавление обломается, ты об этом узнаешь
ПК> через вывод GTK-WARNING:... что при тестировании вылазит сразу.
Судя по количеству срача, которое сыплет в исходный терминал firefox,
его авторы научились обходить эту проблему :-)
>> >> ПК> Мне, например, не нравится как такие ситуации отработал
>> >> ПК> spamassassin написанный на perl. Смотри тред "OOM-Killer". С
>> >> ПК> perl'ом даже OOM-Killer не справился.
>> >>
>> >> А это - проблема, перпендикулярная. Если тебе в сишной программе
>> >> понадобилась память - ты ее точно так же будешь запрашивать.
>>
>> ПК> Один раз, потом верну ошибку назад по стеку, там пусть решают что
>> ПК> делать.
>>
>> А там пожмут плечами и начнут следующую итерацию главного цикла. В
>> которой снова запросят память...
ПК> Это вопрос логики, просто на perl'е проверки вообще суть не
ПК> популярная, если они там хотя бы есть в достаточном количестве.
Не на перле, а у криворуких программистов. На C они тоже не любят
ничего проверять. Это типа сложно...
>> >> ПК> У Perl'а своя ниша, и он хорош пока от туда не вылазит.
>> >>
>> >> Не вопрос. Она у него даже малость поуже, чем у C. Проблема в том, что
>> >> C из своей ниши вылазит...
>>
>> ПК> Посмотрим что успешно пишут на Си: драйвера, демоны, серверные,
>> ПК> клиентские, десктопные приложения, и т.д.
>>
>> То-то у меня ipw2200 не работает больше полутора суток, firefox через
>> неделю работы приходится прибивать kill -9, потому что на штатное
>> завершение ему получаса не хватает, а у тебя snmpd жрет 10% CPU...
ПК> Молодец, перечислил все 3 корявые программы на Си :)
Нет, первые 3, пришедшие в голову, так, чтобы более-менее покрывали
приведенные тобой категории.
>> Но почему драйвера пишут на C и почему криптографию пишут на ассемблере
>> с сишной обвязкой, хотя бы можно обосновать. Рантайм от более серьезных
>> языков там действительно слишком тяжел. А все остальное - не от
>> большого ума.
ПК> Я тебе на это скажу так: высокоуровневым/скриптовым языкам
ПК> легко/быстро учиться, на них легко/быстро написать "первую
ПК> версию". Их программисты очень часто этим и ограничиваются. А когда
ПК> начинаешь дорабатывать, писать обработки различных ситуаций, тогда
ПК> сложность и затраченное время уравнивается.
Не надо мне на это так говорить. Я - пробовал. Конкретно на перле. Ни
разу не уравнивается. Разница, конечно, становится поменьше - за счет
того, что скриптик "на прям щас" на перле пишется и выполняется быстрее,
чем для сишного кода запустится текстовый редактор :-). Но все равно на
порядок. Десятичный.
>> >> >> Ты на sh тоже как на C пишешь? (Там, впрочем, если писать аккуратно,
>> >> >> это бывает оправдано...)
>> >>
>> >> ПК> А это как?
>> >>
>> >> command
>> >> if [[ $? == ... ]]; then
>> >> ...
>> >> fi
>> >>
>> >> И т.п. Это если "как писать". Если "когда оправдано" - вместо пайпов
>> >> использовать временные файлы, потому что классический sh умеет вернуть
>> >> код только последней команды в пайпе, успех завершения остальных
>> >> проверить невозможно. В bash или zsh можно, но тоже очень
>> >> небесплатно... (На самом деле сейчас придет Чеусов и скажет, что на
>> >> классическом sh тоже можно - но ты попроси его тогда этот код показать,
>> >> он у него, кажется, есть...)
>>
>> ПК> Иногда приходится и так писать. Спорить не буду, на perl' было бы легче.
>>
>> На перле, кстати, тоже иногда подобные танцы приходится устраивать. По
>> счастью, редко.
ПК> Вот тебе и доля правды о "шило на мыло".
Дохтур, я, в отличие от Вас, знаю, когда, где, и главное, сколько. До
шила на мыло отсюда как до Луны.
--
Artem Chuprina
RFC2822: <ran{}ran.pp.ru> Jabber: ran@jabber.ran.pp.ru
HTTP тоже не каждый дятел может сделать. Только дятлы об этом обычно не знают.
Victor Wagner в <b9td98$d8k$3@wagner.wagner.home>
Reply to: