Восставший Лазарь. Правильно уменьшаем размер exe на Lazarus


Иногда предпочтения учеников меня ставят в тупик. Парадокс, но самыми популярными курсами, которые я преподаю были и остаются курсы по Delphi. Безусловно, Object Pascal весьма потрясающая штука, да вот только… устарело все это. В свое время помню, как долго программировал и на моем любимом тогда Delphi 7, потом был в восторге от Delphi 2010. Но потом предпочтения уходили. Что и говорить, вакансий и спроса на программистов Delphi все меньше и меньше. И поэтому  постепенно программирование на нем превратилось в этакую детскую шалость, когда нужно быстренько написать простенькую утилитку для винды, для которой на си шарпе это делать чуточку дольше. Что и говорить, Delphi сошел с арены.

Ведь в эпоху кроссплатформенности выигрывает тот, кто сможет охватить большее число платформ, как это видим на смартфонах. Xamarin и прочие кроссплатформенные средства разработки прочно заняли свою нишу. C# вообще благодаря Mono влез много на какие платформы. А что же Delphi? Да, в нем появился Fire Monkey. Благодаря ему теперь удобно делать кроссплатформенные приложения. Даже в своем разделе по 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
Простой проект на Lazarus

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

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

Размер выходного бинарника
Размер выходного бинарника

Как видите, у меня он занял 18,7 MB. С одной формой, без кучи контролов, компонент, мультиформ, вкладок, гридов и кода, которыми пестрят проекты моих учеников вместе с моими. Пустой фактически бинарник весит почти 20 Мб…

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

Для этого перейдем в «Проект->Параметры проекта»

Отсюда всегда стоит начинать настройку проекта
Отсюда всегда стоит начинать настройку проекта

Здесь нам следует выбрать «Параметры компилятора» и поставить галку в «Режимы сборки» если ее там нет и нажать на кнопку с многоточием.

2После этого вы попадете в следующее окно, где нужно нажать на кнопку  «Создать режимы отладочной и конечной сборки».

3

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

После компиляции проекта можно увидеть, что теперь бинарник сжался почти в 10 раз.

Сжатый файл
Сжатый файл

Но и 2,4 Мб это очень много для такого проекта. Вот тут и приходится прибегать к пакерам. Так как нам не нужно криптовать приложение, то протекторы нам не нужны. Достаточно простого упаковщика. В силу того, что самый распространенный и халявный пакер UPX, то его и будем использовать. Но до того, как использовать пакер, мы вырежем специальной утилитой еще лишнюю информацию из бинарника. Эта утилита называется strip.exe и найти ее можно в папке с установленным lazarus. Или же в конце статьи скачать у меня архив со всем перечисленным инструментарием.

Итак, утилита strip.exe, как я уже ранее и писал, вычищает всю отладочную информацию из файла. Ее использование в командной строке выглядит так:

strip.exe —strip-all project1.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 и скажу честно – хоть я его и не воспринимаю давно серьезно, но кучу теплых эмоций он у меня возникает и эти курсы я честно могу назвать одними из самых  моих лучших. Надеюсь, что описанное решение проблемы сможет и вам помочь. Архив со всем использованным в статье арсеналом можно скачать здесь. Там же и батники, которые можете изменить по своим обстоятельствам и тестовый проект, который я здесь и упоминал.

Яндекс.Метрика