Відкрив собі wxWidgets та CodeBlocks

Трохи раніше я став цікавитись розробкою кросплатформових GUI додатків. На даний момент існує безліч підходів до розробки даного типу програм - це Java, бібліотеки GTK і Qt, скриптові мови. Але я зробив вибір на користь бібліотеки wxWidgets, і нижче буде повідомлено чому.
1. Для чого взагалі все це потрібно
Будь-якого програміста рано чи пізно бувають наступні думки. Ось було б чудово написати додаток один раз і щоб він міг працювати під Windows, Linux, MacOS, FreeBSD і взагалі будь-якою операційною системою без будь-яких патчів і доробок.
А ось пам'ятаю, як просто і просто було створювати додатки GUI в Borland Delphi. Здається, це ще називається RAD - Rapid Application Development. Чому в моїй IDE такого немає?
І ще останнім часом чомусь дуже багато говорять про Java і C#, мовляв там немає витоків пам'яті, зате є юнікод, постійні вирази, кросплатформні треди, і багато інших корисностей прямо з коробки. Потрібно зав'язувати з C++…
Особисто мене крім перерахованих думок також відвідала занепокоєння тим, що скрипти на моєму коханому Perl досить важко портувати під Windows. Як мінімум, оскільки користувачеві потрібно пояснити, мовляв спочатку скачай Strawberry Perl, потім запусти CPAN і постав такі-то і такі-то модулі.
Цю проблему здатна вирішити програма perl2exe, але вона платна і, схоже, видає непристойно великі програми на виході. Втім, треба було б це питання провентилювати краще.
Є підозри, що скрипти на Python легше переносяться, але Python також вимагає установки інтерпретатора. Додатково він їсть більше пам'яті, невимовно кривий і працює повільніше, ніж Perl.
Додаток: Див також мій тест продуктивностіскриптів на Python.
Так почалися мої пошуки універсального засобу, що дозволяє швидко створювати кросплатформні GUI додатки, а також дає розумні покажчики, юнікод, постійні висловлювання, інтернаціоналізацію і тп.

2. Чим погані Qt/Python/Java/…
Після тривалого серфінгу в пошуках відповіді я зробив вибір на користь wxWidgets. У цьому розділі я вирішив перерахувати передумови, за якими були відкинуті Python, C#, GTK та інші рішення. Якщо вас це питання не цікавить, сміливо переходьте до наступного розділу.
БібліотекаQT дозволяє швидко створювати кросплатформні GUI додатки, але має безліч недоліків. Спочатку до них ставиться незрозуміла ситуація з перспективами розвитку проекту.
Справа в тому, що нещодавно Nokia продала К'ют якийсь незрозумілій компанії Digia. Зв'язуватися з потенційно мертвим проектом мені не хочеться. Також К'ют небезпідставно критикують за високе споживання ресурсів і великий обсяг створюваних за його допомогою програм.
GTK має менше недоліків, але й ідеальний. GTK-додатки, скомпіловані під Windows, також багато важать (при статичній лінковці) або вимагає попередньої установки GTK бібліотек (при динамічній лінковій).
Ще один значний недолік GTK - він використовує «нерідні» елементи управління. Тобто GUI додаток, написаний на GTK, під Віндою виглядає трохи не тому що всі інші Windows-програми.
Вам це може здатися несуттєвим, але у рядового користувача вид кнопки з округленими кутами замість звичайних гострих кутів викликає панічну атаку і миттєвий розрив зв'язку з дійсністю. Згадайте, як більшість людей плюються від Gimp і OpenOffice, мовляв, не за звичкою. Або як ніяковоПерші кілька днів користуватися Windows Сім після декількох років використання Windows XP.

НавколоJava ситуація різнопланова. За словами одних розробників, Java – це наше все. Інші дивуються, що Java ще жива.
Я постарався подивитися на ситуацію об'єктивно і побачив наступне. По-перше, відомо, що програми на Java працюють у 1,5-2 рази повільніше додатків на C++. Ви згодні, щоб ваш комп'ютер працював вдвічі повільніше задля зручності програмістів? Я – ні.
По-друге, з'ясувалося, що хвалений Garbage Collector не тільки вирішує завдання, а й робить нові. А саме, з роботою GC пов'язують періодичне підвисання мобільних пристроїв, що працюють на Сімбіан та Android. Також Java не позбавлена проблем з незвичайними контролами.

Колись Sun (будучи тоді ще автономною компанією) будувала чудові плани захоплення світу за допомогою Java. Мовляв всі пристрої від телевізійних пультів і мікрохвильових печей до DVD-плеєрів і мобільних телефонів будуть мати ПЗ, написане на Java, а також взаємодіяти між собою за допомогою одного протоколу. Мовляв Java-аплети будуть мало не популярнішими за формат GIF.
Що сталося на практиці? Аплети виявилися нікому непотрібними (за все життя я на них натикався від сили три рази). Серед десктоп-додатків Джаву дуже потіснив C #.
Додаток: Нещодавно Java була виключена з Linux Standard Base. Виходить, навіть у світі UNIX їй не раді.
Таким чином, Windows Phone незабаром стоятиме мало не на кожному другому мобільному пристрої (39% ринку у Nokia і 9% у Microsoft). Про те, що Windows встановлений на 90% персональних комп'ютерів, думаю, нагадувати не варто. З недоліків ДотНет має лише низьку (але майже завжди прийнятну) продуктивність, проблеми, властивіGC, також не зовсім повна сумісність з UNIX'ами.

Python/Ruby і взагалі скриптові мови були відкинуті у зв'язку з проблемами переносимості (користувачі Windows повинні закачувати і встановлювати інтерпретатори) і низькою продуктивністю. Тим не менш, мою увагу привернув проект Cython (транслятор мови Python в код на C).
Можливості тут дуже цікаві - від використання Python в програмах на C/C++ до повної компіляції Python-скриптів у виконувані файли і, як наслідок, вирішення проблеми з продуктивністю і переносимістю. Але це питання ще належить як слід провентилювати.
І в результаті хотілося б згадати проектLazarus. Це - спроба створити кросплатформенну RAD-IDE на базі Free Pascal. Практично - клон Borland Delphi, безкоштовний і здатний створювати програми, що просто переносяться. Як я можу судити, цей клон більш, ніж вдалий.
Я не маю якихось забобонів щодо Pascal, але будучи людиною, зіпсованою C-подібними мовами, працювати з Lazarus мені не комфортно. Враховуючи, скільки людей пишуть на Delphi, і той факт, що в більшості шкіл навчання програмування починають з Pascal, ця IDE без зусиль знайде своїх шанувальників.
3. Здібності wxWidgets та Code::Blocks
Спочатку, давайте з'ясуємо, who is who.wxWidgets - це фрейморк (бібліотека, набір класів - кому як більше подобається) для створення кросплатформових додатків. Щось на зразок STL + Boost + GTK в одному флаконі.
Що дає нам wxWidgets?

* "Використовуються нативні контроли" означає, що при компіляції під Windows додаток буде малювати GUI за допомогою WinAPI, а при компіляції під UNIX - за допомогою GTK або, якщо ми цього захочемо, навіть на чистомуX11. Чому не варто ще раз лякати користувача незнайомими йому контролами (органами управління), як це робить Java і К'ют, було повідомлено в минулому пункті (чисто на випадок, якщо ви раптом його перестрибнули).
Інша сторона - необхідність перевіряти, як виглядає інтерфейс у кожній системі. На щастя, тут все на три порядки простіше, ніж у кросбраузерній верстці.
Це трохи напружує і уповільнює швидкість кодування (я вже не говорю про те, що швидкість конструювання на C++ завжди значно менше, ніж на Perl або Python). На щастя, Code::Blocks вміє автоматично підставляти парні дужки та лапки, так що наші зусилля зводяться до мінімуму.
Схоже, що зараз wxWidgets є мінімальним із зол, яке доводиться вибирати при кросплатформовій розробці. Принаймні для мене це так.
Бажаю також відзначити, що є непрямі ознаки можливості розробки за допомогою wxWidgets мобільних додатків. Але я зараз мало цікавлюся цією темою, та й ситуація з мовами програмування для мобільних пристроїв зараз дуже нестабільна.
4. Що далі?
Починаючи писати цей пост, я планував розповісти про встановлення Code::Blocks під різними операційними системами (там є тонкі моменти), а також навести кілька прикладів коду. Але піст вийшов дуже великим, тож про наречених речах я напишу в одній з наступних нотаток.
Додаток: Продовження теми — Приклади використання wxWidgets.
Схожі статті
Ось уже другий тиждень у Москві панує нестерпна спека. Вентилятори та кондиціонери в магазинах не знайти, прохолодні напої не допомагають. Рівень бажання працювати (УЖР) за десятибальною шкалою.
Як і обіцяв, пишу продовження власної нотатки проwxWidgets. У цьому пості буде описана установка wxWidgets і Code::Blocks під різними операційними системами, основи створення GUI за допомогою wxSm.
Не можу утриматися від спокуси висловити ще мало експресії щодо нинішньої ситуації з мовами програмування. Як завжди, я не претендую на пізнання правди, а просто бажаю поділитися св.
Протягом останніх кількох місяців я практикував TDD. Зараз я розумію – ця техніка (не плутати техніку та методологію!) працює. Її просто використовувати і вона відмінно вирішує повністю конкр.
Я знаю, що ви бачили вже більше Дев'ять тисяч подібних нотаток. Просто треба було щось робити з чернеткою цього посту, бо він уже півроку очі мені мозолить. Видаляти було шкода, тому що я періодично.