среда, 21 июля 2010 г.

[prog] Пару слов о документации к ACE

У библиотеки ACE есть несколько фатальных недостатков (помимо того, что ее писали не мы ;) ). Во-первых, это уж очень old-school стиль (местами даже не C++ный, а вообще C-шный). В особенности с кодами ошибок – функции возвращают –1 при ошибке, а сам код ошибки нужно брать из errno. Во-вторых, у ACE ну уж очень куцая документация. И об этом-то пойдет речь.

Информацию об ACE можно брать из трех типов источников:

  1. Книги (“C++ Network Programming, Volume 1: Mastering Complexity with ACE and Patterns”, “C++ Network Programming, Volume 2: Systematic Reuse with ACE and Frameworks” (эти две переведены на русский язык), “The ACE Programmer's Guide: Practical Design Patterns for Network and Systems Programming”). Имхо, без них за ACE лучше не браться. По крайней мере я не решался широко использовать ACE пока не прочел первые две.
  2. Статьи о разных аспектах ACE, опубликованные на домашней страничке библиотеки (разделы “Technical Papers” и “Advanced Tutorials”). Как мне показалось, там собраны довольно старые статьи и презентации, пользы от которых не много.
  3. Сгенерированная doxygen-ом по исходникам ACE документация (в on-line ее можно просмотреть здесь). Вещь абсолютно необходимая (посмотреть названия классов/методов/полей), но, временами, абсолютно бестолковая.

Очень сильно помогает еще и изучение исходников ACE, но сейчас я все-таки о документации.

Так вот, вместе с дистрибутивами самой ACE можно скачать еще и архив построенной doxygen-ом документации по ACE. А размер этого архива внушает ;) Вот динамика его изменения:

ACE-html-5.2.5.tar.bz2                    06-Oct-2006 17:16   38M  
ACE-html-5.5.5.tar.bz2                    25-Jan-2007 04:51   67M  
ACE-html-5.6.1.tar.bz2                    19-Sep-2007 05:41  175M  
ACE-html-5.6.2.tar.bz2                    14-Dec-2007 05:05  306M  
ACE-html-5.6.3.tar.bz2                    21-Feb-2008 04:53  306M  
ACE-html-5.6.5.tar.bz2                    19-May-2008 05:15  298M  
ACE-html-5.6.6.tar.bz2                    15-Sep-2008 09:58  301M  
ACE-html-5.6.7.tar.bz2                    27-Nov-2008 06:27  301M  
ACE-html-5.6.8.tar.bz2                    09-Feb-2009 21:47  184M  
ACE-html-5.6.9.tar.bz2                    14-Apr-2009 12:32  187M  
ACE-html-5.7.0.tar.bz2                    22-Jun-2009 13:11  188M  
ACE-html-5.7.1.tar.bz2                    13-Jul-2009 17:36  188M  
ACE-html-5.7.2.tar.bz2                    23-Jul-2009 03:59  189M  
ACE-html-5.7.3.tar.bz2                    11-Sep-2009 05:19  197M  
ACE-html-5.7.4.tar.bz2                    12-Oct-2009 15:41  197M  
ACE-html-5.7.5.tar.bz2                    30-Nov-2009 02:27  207M  
ACE-html-5.7.6.tar.bz2                    01-Feb-2010 04:59  315M  
ACE-html-5.7.7.tar.bz2                    03-Mar-2010 03:25  314M  
ACE-html-5.7.8.tar.bz2                    02-Apr-2010 08:47  317M  
ACE-html-5.7.9.tar.bz2                    31-May-2010 04:43  319M  
ACE-html-5.8.0.tar.bz2                    05-Jul-2010 03:29  331M  

До сегодняшнего дня я пользовался документацией еще к версии 5.5.5. Сегодня решил обновить ее до версии 5.7.9. Глянул на размер архива – 319Mb – и слегка офигел. Не верилось мне, что качество doxygen-овской документации настолько улучшилось, что архив вырос в 5 раз. Но раз надо, значит надо, скачал, распаковал.

В распакованном варианте 181Mb занимает все такая же куцая документация по самой библиотеке ACE. Плюс почти гигабайт не менее куцей документации по TAO (реализация CORBA на основе ACE). Абыдно, поскольку документация по TAO мне вообще нафиг не упала.

Такие вот дела. Полный дистрибутив Qt SDK for Windows (с Qt 4.6.3 и Qt Creator 2.0.0) весит 293Mb. Так там и исходники, и примеры, и вспомогательные инструменты, и на порядки более качественная документация по API. И, повторюсь, все это в 293Mb. А у ACE только ущербная документация, 90% которой мне вообще не нужны, но зато 319Mb. Почувствуйте разницу :/

4 комментария:

имя комментирует...

> В особенности с кодами ошибок – функции возвращают –1 при ошибке, а сам код ошибки нужно брать из errno.

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

Почему не выдается код ошибки в виде значения? Несколько сомнительная, но идея:

Допустим, что ACE::f1 вызывает enterprise::g1, которая вызывает enterprise::g2, которая вызывает ACE::f2.

Внутри enterprise свои способы передачи кода ошибки, и в нее достаточно добавить что-то типа одной константы enterprise::ACE_ERROR; в случае прохода исключения "насковозь" от f2 до f1 не надо заботится о двойной переконвертации кода ошибки.

Вот только как эту фигню заставить гладко работать с многонитевостью?

eao197 комментирует...

>Внутри enterprise свои способы передачи кода ошибки, и в нее достаточно добавить что-то типа одной константы enterprise::ACE_ERROR; в случае прохода исключения "насковозь" от f2 до f1 не надо заботится о двойной переконвертации кода ошибки.

Чесно говоря, не очень понимаю, чем это лучше простого возврата кода ошибки. Функции g1/g2 могут заменять код ошибки из f2 на собственное значение ACE_ERROR. И никаких проблем с многонитевостью.

Rustam комментирует...

Писал некоторое время на NT Native API там функция всегда возвращает код ошибки, после возврата на Win32 API стали очень напрягать все эти бессмысленные GetLastError() :)

eao197 комментирует...

2Rustam: работа с errno/GetLastError не только напрягает, она еще и ошибками черевата. Забудешь сохранить текущее значение errno, вызовешь какую-нибудь вспомогательную функцию, а там бац! и errno в 0 выставят.

В ACE это все, если не ошибаюсь, из-за того, что они стандартную C-шную библиотеку чуть ли не полностью эмулируют.