Зменшуємо розмір exe наLazarus, Доступне для всіх програмування

Іноді переваги учнів мене ставлять у глухий кут. Парадокс, але найпопулярнішими курсами, які я викладаю були і залишаються курси з Delphi. Безумовно, Object Pascal дуже приголомшлива штука, та ось тільки… застаріло все це. Свого часу пам'ятаю, як довго програмував і на моєму улюбленому тоді Delphi 7, потім був у захваті від Delphi 2010. Але потім переваги йшли. Що й казати, вакансій та попиту на програмістів Delphi все менше і менше. І тому поступово програмування на ньому перетворилося на таку дитячу витівку, коли потрібно швиденько написати простеньку утилітку для вінди, для якої на цьому шарпі це робити трохи довше. Що й казати, Delphi зійшов з арени.

Розумію, що читач зараз посміхнеться і скаже, що є торенти, та ось тільки я не поділяю подібних поглядів. Середовище розробки для програміста - це як станок. І цілком справедливо за нього просити гроші, адже він допомагає заробляти. А для навчання завжди є безкоштовні версії різних середовищ. Адже підсадивши програміста на те чи інше середовище, виробники вже забезпечили собі вірну когорту вірних споживачів. Загалом на цю тему можна довго і безглуздо писати.

Тим не менш, поряд з дорогим Delphi є безкоштовна альтернатива з жахливо кривим Free Pascal та іншими радощами, але яка доступна на будь-якій платформі. Ім'я цього «дива» —Lazarus! Чесно кажучи, не звертайте увагу на дещицю негативу з мого боку на це середовище. Просто мені ніколи не зрозуміти, навіщо було писати компілятор паскаля на сі? Взагалі, задум був хорошим – на паскалі програмувати під багато операційок. Так, колись була Kylix – урізана версія Delphi, в якій компоненти були просто замінені наті, які не зверталися до API як той самий VCL, що є за фактом надбудовами над функціями низькорівневих. Але вона прожила недовго і була «випиляна» Embarcadero із планів підтримки. Але Паскаль, подібно до біблійного Лазаря, повстав у вигляді однойменного середовища розробки Lazarus. І все на цьому. Причому, іноді, коли потрібно швиденько написати програмку на Ubuntu, сидиш і ностальгуєш по стародавньому інтерфейсу Delphi 7, розуміючи, що вже не молодий, а тридцять років для людини все ж таки дуже багато, тому що колись проривний інтерфейс тепер виглядає дуже сумно. що мене сильно розбалували сучасні студії розробки Майкрософтів, JetBrains та інших «титанів» цієї індустрії. І вимагати чогось схожого від безкоштовного продукту просто безглуздо.

Напевно, якщо ви читаєте цю статтю, то на Lazarus вам очевидно доводиться програмувати. Чорт із ним, із старомодним інтерфейсом. Лазаревські компоненти з лишком вирішують низку завдань для повсякденних потреб програміста-аматора. Адже середовище з «коробки» дозволяє працювати з базами даних, розширювати та автоматизувати роботу офісних співробітників у Libreoffice (останнє мені частенько доводилося робити там, де локалка складалася з комп'ютерів на Ubuntu) та низку інших моментів. Хочете браузер зробити? Чи не біда, компонент на базі Chromium і буде щастя. Відчетик із бази? Загалом не питання. Компонента немає, але він є на Делфі? Бубон у руки, засоби для імпорту інструментів Делфі і ваш компонент швидше за все «заведеться». Загалом плюсів багато.

Щоправда, мінусів все ж таки ще більше… Не знаю і ніколи не дізнаюся, скільки бібліотек Lazarus впихає у свої вихідні бінарники. Так, чудово, звичайно, що програма все ж таки переносима і не вимагає від користувача довантажити в свій корінь бібліотеки, що відсутні, але ... Як?! Як порожній"HelloWorld!" може важити 18 MB?

Крім того, програми на Lazarus відрізняються черепашою швидкістю. Розпещеному делфями, хочеться чекати подібного і від Лазаря, натомість отримуючи незрозумілу пародію. Але середовище розвивається. Free Pascal має низку шанувальників. На ньому так само просто писати програми, як і на Делфі. Все це змушує багатьох програмістів-аматорів використовувати цю мову разом з Lazarus, у тому числі слухачів моїх курсів.

Що ж, давайте тоді просто трохи додамо «розуму» нашим проектам на Lazarus, зменшимо розмір exe файлу і трохи його оптимізуємо. Загалом, зробимо все те, що особисто мене, та й думаю, що багатьох дратує в цьому середовищі. Тож поїхали!

Відразу обмовлюся, у мене коштує Lazarus 1.6, як на вінді, так і на Убунту (хоча, парадокс, але на лінуксах озвучених мною приколів у рази менше, зате там є мій «улюблений» Glade).

У принципі, загальні моменти оптимізації залишаться тими самими, що у більш старих версіях середовища. Однак візьміть собі за правило встановлювати все найсвіжіше, благо воно безкоштовне в нашому випадку.

Отже, я створю порожній проект Hello World.

наlazarus

Як бачите, я не перенавантажував форму квітами, малюнками та іншими радощами, які могли збільшити розмір. Код також мінімалістичний, тільки є дві події при натисканні кнопки та закритті форми. Обидві викликають функцію ShowMessage, параметрами якої є рядок із вітанням і прощанням, коли форма закривається. Загалом, третій клас, як кажуть, але не суть.

Тепер, якщо ми нічого робити не будемо з проектом і просто натиснемо клавішу F9 або зелену стрілку для складання проекту, то через невеликий час (компілятор все ж тут дуже повільний) побачимо запущений проект.

зменшуємо

Як бачите, умене він зайняв 18,7 MB. З однією формою, без купи контролів, компонентів, мультиформ, вкладок, гридів та коду, якими рясніють проекти моїх учнів разом з моїми. Порожній фактично бінарник важить майже 20 Мб.

Відразу скажу, секрету тут немає. Якщо ви програмували в інших середовищах розробки, то, напевно, звертали увагу на те, що там є вибір між релізною та налагоджувальною компіляцією. Для налагодження програми стоїть опція Debug, для релізної – Release. У Lazarus вважали, що програміст повинен сам налаштувати проект і в опціях компілятора відключити налагоджувальну інформацію (а її там неміряно) і виставити оптимізацію компіляції. Я не писатиму, як це робиться, так як інформації в мережі маса. Просто всі ці танці з бубном ні до чого, оскільки скомпілювавши проект у релізному режимі, ми отримаємо фактично те саме. Тому просто давайте у студії та включимо цей режим.

Для цього перейдемо в «Проект-Параметри проекту»

зменшуємо

Тут нам слід вибрати "Параметри компілятора" і поставити галку в "Режими складання" якщо її там немає і натиснути на кнопку з крапкою.

Після цього ви потрапите у наступне вікно, де потрібно натиснути на кнопку «Створити режими налагоджувальної та кінцевої складання».

розмір

Все, тепер натиснувши на OK, біля зеленої стрілки компіляції проекту в основному вікні, можна вибрати тепер раніше недоступну опцію Release

Після компіляції проекту можна побачити, що тепер бінарник стиснувся майже вдесятеро.

зменшуємо

Але й 2,4 Мб це дуже багато для такого проекту. Отут і доводиться вдаватися до пакерів. Так як нам не потрібно криптувати додаток, протектори нам не потрібні. Досить простого пакувальника. У силу того, що найпоширеніший і халявніший пакер UPX, то його і будемо використовувати. Але дотого, як використовувати пакер, ми виріжемо спеціальною утилітою ще зайву інформацію з бінарника. Ця утиліта називаєтьсяstrip.exe і знайти її можна в папці із встановленим lazarus. Або ж наприкінці статті завантажити у мене архів із усім перерахованим інструментарієм.

Отже, утиліта strip.exe, як я вже раніше і писав, вичищає всю налагоджувальну інформацію з файлу. Її використання у командному рядку виглядає так:

strip.exe-strip-allproject1.exe

У свою чергу,upx це колись популярний безкоштовний пакер. Не думав ніколи, що доведеться його використати. Насправді, колись, до того, як були придумані всякі тамPEid, що спрощують процес виявлення якимсь компілятором і чим запакована програма була, було дуже модно намагатися якось захистити свою програму від злому хоча б такими простими пакувальниками. Так, потім їх різко замінили криптори типуASpack (зараз додалися до цієї лінійкиASprotect ),Armadillo та інші штуки, що «отруюють» життя крекерам. Адже сам злом програми справа дуже нікчемна. Хороший відладчик, моніторинг системи та багато уваги – ось запорука успіху. Криптори шифрують код так, що відладники або збожеволіють разом з тим, хто його запустив, або ж просто вилітають. Ех, занесло мене в нетрі молодості.

Так ось, upx стискав файли і навіть трохи плутав відладчик. Проте маленьке «але» — розпакувати програму так само легко, як і запакувати. Відразу обмовлюся – утиліта консольна.

upx.exe -best project1.exe

Чесно кажучи, як любитель (вірніше, не любитель всього складного) спрощувати завдання, я хотів використати зовнішні засоби Lazarus для моїх потреб, проте середовище до того потрібне, що кілька разів вилітало при стисканні файлу. У результаті найкращим виходом намій погляд - створення батника з розміщенням його в каталозі з програмою.

Upx стиснув мою програму до 750 Кб. В три рази. Це вже щось близьке до реалій. Фактично, невеликими доналаштуваннями та використанням зовнішніх засобів можна перемогти «величезні» розміри.

Однак, мій наказ для читачів – мова Delphi стагнує. Так, мова, оскільки Object Pascal був офіційно прибраний з термінології Borland, хоча у Free Pascal збереглася подібна концепція. Середовище RAD типу Делфі або Лазаря відучує програміста думати над архітектурою проекту, що часто кидають на форму кнопочки та програмуючи для них події. Мені часто мої слухачі скаржилися на те, що я люблю налягати на ОВП у Делфі. Мотивація проста – навіщо, адже все й так працює. Мовляв, класи ні до чого. Підсумок – як програміст така людина не відбудеться, а нову мову їй доведеться буквально з нуля вивчати.

Невелика кількість вакансій ставить цю технологію в невигідне становище. Тим не менш, купу хороших програм на Delphi написано. Це і Everest, і Total Commander, і Aimp, і The KM Player. Пам'ятайте, що Delphi - мова та середовище для саморобкіних. А Lazarus при всій своїй глючності - це безкоштовна альтернатива Делфі, яка успадкувала крім різних мінусів купу різних плюшок у вигляді готової кількості компонентів, що значно полегшують завдання. Я проводжу курси з Delphi і скажу чесно - хоч я його і не сприймаю давно серйозно, але купу теплих емоцій він у мене виникає і ці курси я чесно можу назвати одними з моїх найкращих. Сподіваюся, що описане вирішення проблеми зможе вам допомогти. Архів з усім використаним у статті арсеналом можна завантажити тут. Там же і батники, які можете змінити за своїми обставинами і тестовий проект, який я тут згадував.