Покотиленко Костик -> 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: r...@jabber.ran.pp.ru

HTTP тоже не каждый дятел может сделать. Только дятлы об этом обычно не знают.
        Victor Wagner в <b9td98$d8...@wagner.wagner.home>


-- 
To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Ответить