gremlinable (gremlinable) wrote,
gremlinable
gremlinable

Category:

Почему wx

Недавно в блоге Бегемота появилась заметка "Почему я стал программировать на wxWidgets". Заметка весьма минималистичная, но тема оказалась интересной для его читателей, поэтому я решил её продолжить =).
Вопрос "на чём писать GUI" у меня встал на старших курсах университета, когда я проходил практику на предприятии и перед нами с mzet82 встала задача разработки программно-аппаратного комплекса для проведения испытаний цифровых устройств. Ранее на предприятии использовался VisualBasic, и я даже написал на нём одну испытательную программу, после чего и решил, что больше я к VB и прочим мелкософтовским поделиям не притронусь =) В дальнейшем разработка комплекса вылилась в мой диплом, а проблема выбора тулкита - в одну из его глав, которую я и публикую ниже.

Конечно тогда я мог оценить только поверхностно, не вникая особо во всякие используемые технологии, сейчас же, имея уже приличный опыт работы с wx я хочу дополнительно отметить очень грамотную систему обработки событий и описания обработчиков (особенно в обновлённом виде в wxWidgets3), ИМХО на порядок превосходящую сигналы в Qt с его недоязыком. Кроме того, в wx есть ряд интересных фишек, типа валидаторов для синхронизации ГУИ элементов с обычными переменными, подсистемы док-вью для упрощения реализации стандартных действий, типа Undo, Redo, Open, Save, Print и тд., а также новая, довольно интересная подсистема для сохранения состояния программы - Persistent Objects. Что же касается недостатков wxWidgets - основной проблемой этой библиотеки является очень маленькая команда разработчиков. Если бы Nokia в своё время купила wxWidgets, современный рынок кроссплатформенных тулкитов выглядел бы совершенно иначе, но выбор Nokia пал Qt и теперь он по всем фронтам нагоняет и обгоняет wxWidgets.

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

Выбор платформы и обоснование технических решений.

В связи со спецификой предприятия выбор платформы для реализации проекта был весьма ограничен. Аппаратная платформа вычислительной машины определялась имеющимся в цеху парком вычислительных машин. На момент проектирования комплекса он включал компьютеры класса IBM PC, построенные на архитектуре i386, низкой по сегодняшним меркам производительности. Выбор программной платформы ограничен конфигурацией имеющихся машин и уровнем подготовки персонала, проводящего испытания, в области работы с персональными компьютерами. Аппаратные ресурсы ЭВМ, используемых в данном комплексе, позволяют запускать такие операционные системы, как DOS (MS-DOS, PC-DOS, FreeDOS), Microsoft Windows 98 и ниже, Windows-подобная операционная система ReactOS и UNIX-подобные операционные системы (например, Linux, FreeBSD, OpenSolaris). В связи с большим объёмом представляемой информации, текстовый пользовательский интерфейс неприемлем, а, следовательно, нельзя использовать операционные системы семейства DOS. ОС ReactOS была исключена из рассмотрения в связи с тем, что сейчас она находится в стадии разработки и её промышленное применение небезопасно. Таким образом, с технической точки зрения, в данном комплексе аппаратуры могут быть применены операционные системы MS Windows версии не выше Windows 98 или любая из перечисленных *NIX систем.
В пользу рассматриваемых вариантов UNIX-систем говорит их открытость, малая ресурсоёмкость, высокая стабильность и производительность. Основные недостатки Windows 98 - нестабильность и прекращение поддержки этой версии ОС производителем. Однако в связи с её удобством и привычностью для пользователей пришлось в качестве программной платформы принять MS Windows 98.
Следующим этапом является выбор языка программирования, компилятора, среды разработки и компонентов, используемых для разработки программного обеспечения. Основываясь на опыте предыдущих разработок, основными критериями выбора были приняты следующие:
  • простота разработки графического интерфейса пользователя при максимальной наглядности механизмов для разработчика;
  • наличие подробной документации и примеров в свободном доступе;
  • низкое потребление оперативной памяти.

Под наглядностью механизмов в данном контексте понимается отсутствие скрытых от разработчика аспектов работы среды. Наиболее характерно скрытие механизмов для систем визуального программирования, таких как Microsoft Visual Basic, Borland Delphi, Borland C++ Builder (однако, следует отметить, что существуют среды «программирования в картинках», сохраняющие открытость механизмов работы, такие как, например, wxDev-C++; которые генерируют чистый код на некотором языке программирования, который в последствии можно свободно редактировать вручную). Полнее всего этому требованию соответствуют инструментарии разработки программного обеспечения, построенные в соответствии с философией UNIX, которая, в противоположность Windows, где от пользователя скрывается всё, что, по мнению разработчиков, ему не нужно, проповедует открытость данных и механизмов.
Наличие документации и примеров позволяет повысить скорость разработки и снизить время, затрачиваемое на освоение технологий. Актуальность данного требования связана с тем, что, например, корпорация Microsoft в комплекте со своими средами разработки поставляет минимум документации, а для доступа к подробной документации (MSDN) требуется платная подписка. Свободный доступ к полной документации так же характерен для систем, построенных в соответствии с философией UNIX.
Требование к потреблению памяти относится непосредственно к данной разработке, так как данные, с которыми придётся работать программе, довольно объёмны. Так, например, таблицы, в которых хранятся циклограммы проверки ячеек, могут достигать размеров в шесть тысяч строк при количестве столбцов около ста. Визуальное отображение такого объёма информации требует большого объёма оперативной памяти, что критично для имеющихся машин, размер установленной оперативной памяти которых составляет 64-128 МБайт.

В процессе поиска инструментария разработки были рассмотрены следующие варианты:
Microsoft Visual Basic с компонентой Trust Soft CELL Control. Microsoft Visual Basic представляет собой интегрированную среду разработки (Integrated Development Environment, IDE) для визуального программирования с использованием собственного языка, основанного на языке Basic. Основное преимущество VB - простота разработки приложений. Среда имеет встроенный компонент для работы с таблицами, однако он имеет очень низкую функциональность и не может быть расширен пользователем. Для компенсации этого недостатка предлагалось использовать компонент электронных таблиц CELL. К числу прочих недостатков можно отнести неудобный синтаксис и слишком бдительное отношение к нему среды (автоматическое дополнение, автоматическое форматирование и прочая автоматизация, которую нельзя отключить), сокрытие от разработчика большого количества механизмов, отсутствие внятной документации в комплекте (что касается компоненты CELL - информации о ней, кроме скромной документации в комплекте, вообще практически нет). Visual Basic по сути является интерпретируемым языком, в следствии чего он имеет низкую производительность и высокую ресурсоёмкость. Кроме того, в настоящее время классический Visual Basic не поддерживается разработчиком.
Java с IDE Eclipse. Java является кросс-платформенным на уровне выполнения языком, компилируемым в байт-код для последующего исполнения в среде виртуальной машины (Java Runtime Environment, JRE). Синтаксис языка схож с синтаксисом языка C, поэтому он сравнительно прост в освоении. В связи с большой распространённостью Java, в свободном доступе можно найти подробную документацию и примеры использования по языку. Однако, для выполнения приложения требуется наличие виртуальной машины, что требует дополнительного расхода памяти и повышает ресурсоёмкость. Кроме того, возможности программы ограничены возможностями виртуальной машины, то есть в программе можно реализовать только то, что предусмотрели разработчики виртуальной машины. Среда Eclipse позволяет разрабатывать приложения как классическим методом, так и визуально, однако при визуальной разработке часть механизмов скрывается от разработчика. Так же следует отметить, что сама по себе среда Eclipse довольно тяжеловесна, и комфортно работать в ней можно только на достаточно мощных компьютерах.
Microsoft C# и технология .NET. Платформа .NET по сути является аналогом Java с той лишь разницей, что для виртуальной машины .NET можно писать на множестве языков. C# является «родным» языком для этой платформы, поэтому имеет наилучшую интеграцию с ней. С другой стороны, в настоящее время кросс-платформенность .NET ограничивается только операционными системами от Microsoft (хотя уже идут работы по переносу виртуальной машины .NET на другие платформы). Помимо этого, следует отметить, что, хотя технология и принята в качестве международного стандарта, но к части документации можно получить доступ только через MSDN. В остальном Java и .NET аналогичны.
Borland Delphi. Очень сильно распространённая среди непрофессиональных программистов среда разработки. Популярность Delphi обусловлена простотой «программирования в картинках» и синтаксисом, основанном на знакомом многим ещё со школы языке Pascal. Благодаря этому, Delphi имеет очень подробную документацию, обширную базу примеров программ и большое число разнообразных компонентов. Основным недостатком системы является сокрытие внутренних механизмов работы за визуальным программированием и сложность ручного управления графическими компонентами. Кроме того, определяется ряд механизмов, не связанных с визуальным программированием, усложняющих понимание работы программы.
Borland C++ Builder. C++ Builder является полной аналогией с Borland Delphi, включая совместимость с компонентами Delphi, с той лишь разницей, что Builder основан на языке C++. К стандартному языку C++ в этой системе добавляется множество нестандартных расширений, например, переменный тип данных.
Microsoft Visual C++. Как следует из названия, Visual C++ - это IDE для разработки на языке C++. Эта система позволяет создавать графические приложения как визуально, так и классическим методом, используя WinAPI, или MFC. Визуальное программирование в среде Visual C++ имеет такие же недостатки, как и во всех вышеперечисленных средах. Программирование на чистом WinAPI - задача довольно трудоёмкая, так как он сложен в изучении и применении, а доступ к подробной документации осуществляется через MSDN. Для упрощения процесса разработки была разработана библиотека MFC (Microsoft Foundation Class), которая является по сути абстракцией над WinAPI. MFC проще в освоении и при применении, но в настоящее время корпорация Microsoft объявила её устаревшей и рекомендует отказаться от применения MFC в пользу .NET.
C/C++ с применением графической библиотеки. Языки C/C++ в настоящее время являются стандартом de facto для разработки программного обеспечения и при общении программистов во всём мире. Они просты в освоении и имеют обширную документацию в свободном доступе. Современные компиляторы способны создавать код, уступающий по оптимизации только ассемблеру, а гибкость этих языков позволяет создавать структуры данных любой сложности, занимающие минимальный объём памяти, и свободно манипулировать ими. Язык C является императивным языком программирования с процедурным подходом, а C++ - императивным с объектно-ориентированным подходом. Языки C/C++ являются, по сути, универсальными языками программирования и не привязаны к какой-либо платформе, поэтому они не имеют встроенных средств проектирования GUI. Для его создания необходимо пользоваться либо встроенным функционалом системы (в случае MS Windows - описанные выше WinAPI и MFC), либо специализированными графическими библиотеками. Использование графических библиотек удобнее для разработчика, однако полученное в итоге приложение будет более требовательно к ресурсам.
На этапе поиска инструментария разработки было рассмотрено четыре наиболее популярные графические библиотеки: GTK+, Qt, FOX, wxWidgets. GTK+ является библиотекой для языка C, а остальные три - для C++. Язык C проще и скомпилированные программы на нём, в общем случае, занимают меньше места и работают быстрее, однако библиотека GTK+ довольно тяжеловесна, что сводит эти достоинства к минимуму. Кроме того, в инструментарии GTK+ нет встроенных средств для работы с таблицами, что послужило основной причиной отказа от него для данной разработки. Qt значительно проще как в использовании, так и во внутреннем устройстве, имеет функции для работы с множеством различных элементов управления, в том числе, с таблицами, однако приложения, написанные с помощью этой библиотеки, используют большой объём оперативной памяти, что неприемлемо для решаемой задачи (например, программа с тестовой таблицей размером 6000x100 занимает более 100МБайт оперативной памяти). Инструментарий FOX самый молодой из рассматриваемых (начало разработки - 1997г.). FOX легче Qt в связи с тем, что имеет меньше встроенных возможностей, но, как следствие, его функционал сильно ограничен. Основные недостатки - плохой функционал работы с таблицами, сложности с локализацией приложений, разработанных с его помощью, и малый объём доступной документации. wxWidgets - самый старый инструментарий из рассматриваемых (начало разработки - 1992г.), однако распространён он несколько меньше, чем GTK+ и Qt. Несмотря на это, он имеет довольно мощный функционал и гибкую структуру. Основное отличие wxWidgets от остальных рассматриваемых библиотек заключается в том, что wx максимально возможно использует функции операционной системы по отрисовке GUI, в то время как остальные инструментарии используют лишь функции отображения примитивов, с помощью которых самостоятельно формируют все элементы интерфейса. Такой подход сильно снижает потребление оперативной памяти и загрузку центрального процессора ЭВМ, а приложения, написанные на wxWidgets выглядят так, как приложения, написанные на чистом API той операционной системы, где они скомпилированы. К недостаткам можно отнести относительно слабо развитую документацию и сложную структуру классов.
Все рассматриваемые библиотеки являются кросс-платформенными и изначально проектировались под UNIX-подобные системы, а после были перенесены под MS Windows и другие операционные системы. В соответствии с философией UNIX все они распространяются бесплатно с исходными текстами по лицензиям семейства GPL (GPL, LGPL, wxWidgets Licence). Наличие исходных текстов библиотеки является большим преимуществом, поскольку в сложных ситуациях всегда можно выяснить, как именно работает тот или иной фрагмент библиотеки.
В результате анализа представленных вариантов было принято решение использовать язык программирования C++ с применением библиотеки wxWidgets. Основные преимущества этого решения - это относительно высокая производительность и низкое потребление оперативной памяти при прозрачности всех механизмов работы библиотеки (благодаря классическому подходу к разработке программного обеспечения и наличию исходных текстов). Недостатки - потеря производительности за счет использования графической библиотеки вместо родного WinAPI - компенсируются простотой разработки программного обеспечения. Кроме того, библиотека, как и сам язык C++, не привязана к какой-либо конкретной среде разработки и компилятору, что позволяет каждому разработчику выбирать наиболее удобные для себя варианты. Для реализации данного проекта было принято решение использовать набор компиляторов gcc из состава инструментария MinGW и среду разработки UEStudio. Выбор компилятора обусловлен его большой распространённостью и функциональностью. Выбор среды разработки основан на её богатой функциональности, гибкости и удобстве в использовании.
Кросс-платформенность решения так же является преимуществом, так как даёт возможность в случае необходимости без особых усилий перевести программу на другую операционную систему.
Tags: wxwidgets, программерское
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 47 comments