KOL+MCK

Как писать компактные программы на Delphi

Среду Delphi всегда ругают за объём кода, выдаваемого компилятором благодаря библиотеке VCL. Да, конечно, говорят критики, это средство разработки уникально. Великолепная компонентная библиотека, оптимизирующий транслятор в двоичный код, сверхудобная интегрированная среда - это всё зарекомендовало себя в течение долгих лет. Но, завершают они, для написания чего-то миниатюрного это всё совсем-совсем не подходит... Кто-то мог бы спросить, а зачем писать что-то маленькое, если можно докупить памяти? Но мы пойдём другим путём. Сейчас я вам расскажу, как писать на Delphi компактные приложения.


Delphi... без VCL?

В чём причина сравнительно большого размера исполняемых файлов, генерируемых компилятором Delphi? Компилятор не виноват, всё дело в библиотеке Visual Components Library (VCL). Добавление одного только модуля Forms в список используемых модулей в головном файле с текстом программы сразу увеличивает объём выходного файла почти на полмегабайта. В принципе, это не так уж и много, но для небольших утилит, особенно тех, что сидят резидентно в памяти, это уже немало. Что же делать?

Традиционным выходом было писать на чистом Windows API без использования, во-первых, VCL, а во-вторых, и объектно-ориентированного программирования. Выход, что уж там говорить, действенный. Размер приложений сокращался не то что в разы, а на порядки. Но одновременно примерно в такой же пропорции снижалась и скорость создания этих самых приложений. А это было слишком высокой ценой для средства быстрой разработки. Поэтому на чистом WinAPI из программистов на Delphi не делал свои приложения практически никто, даже если нужда в том была велика.

Тем не менее, некоторый компромисс был бы достигнут, если бы можно было пользоваться преимуществами ООП, ведь Delphi (Object Pascal) - объектно-ориентированный язык. Наверное, именно такими соображениями руководствовался новосибирский программист Владимир Кладов, когда начинал создавать Key Objects Library, или просто KOL - кодоэкономичную объектную библиотеку для Delphi. Вот что говорит он сам о назначении KOL: "Библиотека KOL позволяет разрабатывать чрезвычайно компактные GUI-приложения (от 14К без сжатия - при условии использования предлагаемой замены системных модулей system, sysinit). Большая часть кода переведена на ассемблер. К библиотеке прилагается программа - генератор справки (xHelpGen), формирующая подробную документацию по библиотеке в html-формате. Справка формируется на основе комментариев в исходных текстах, так что разработчики всегда имеют доступ к самой свежей и полной документации".

Одна из интереснейших особенностей KOL (а их много, да так много, что, боюсь, какие-то из них забуду) состоит в том, что львиную долю кода Владимир пишет на Ассемблере. Есть, правда, и Object Pascal-варианты многих процедур. Между Ассемблером и Паскалем можно переключаться с помощью специальных директив компилятора в главном модуле библиотеки.

Каким же образом достиг компактности кода автор библиотеки? Оказывается, компилятор тут всё же замешан. Особенность компилятора Delphi состоит в том, что он умеет не включать в код конечного приложения невостребованный код, кроме виртуальных методов используемых классов и объектов. Впрочем, сам Кладов уверяет, что такая возможность потенциально существует, но, согласитесь, написать библиотеку проще, чем компилятор. В KOL из-за этой особенности компилятора нет такой строгой иерархии классов, какую можно встретить в VCL: в KOL один и тот же объектный тип может использоваться для инкапсуляции нескольких подобных друг другу объектов. Кроме того, в архитектуре KOL исправлена и другая "болезнь" родной библиотеки Delphi, в которой многие объекты создаются заранее, когда даже ещё неизвестно, будут они использоваться или нет. Например, таким манером для каждого окна создаются объекты для поддержки технологии Drag-and-Drop ("перетащи и брось"). В KOL такое поведение библиотеки отсутствует.


А как же визуальность? А она есть!

Однако, как бы там ни было, сама по себе KOL хоть и хороша, но довольно неудобна для тех, кто привык, что формы можно не описывать долго и нудно в программном коде, а "рисовать" с помощью мыши. Казалось бы, проблема непреодолима: в среде Delphi могут функционировать только VCL-компоненты, в то время как KOL - библиотека, полностью VCL чуждая. Однако решение, предложенное Кладовым, оказалось изящным и до гениальности простым: для KOL-объектов были созданы "обёртки" в виде VCL-компонентов, которые при изменении своих свойств в среде генерируют код, изменяющий свойства соответствующих KOL-объектов в самой программе. При этом в арсенале разработчика остаются и все преимущества среды быстрой разработки, которые даёт среда Delphi, и компактный размер приложений, который обеспечивает KOL.

Библиотека VCL-компонентов, служащих обёртками для KOL, называется Mirror Components Kit - MCK.

Сам я давно уже попробовал KOL, и должен сказать, что MCK действительно удобна для проектов, которые содержат сколь-нибудь сложные окна, поскольку это действительно сложно - подогнать вслепую все элементы управления так, чтобы окно смотрелось прилично. Но есть, конечно, у MCK и ряд минусов. Например, имеются нюансы в работе со свойствами формы, а также со свойствами проекта. Ну и меня лично раздражало обилие INC-файлов, генерируемых MCK для включения в код модулей. Но вас, вполне возможно, эта мелочь раздражать и не будет. Чтобы не быть голословным, перечислю некоторые нюансы работы с MCK.

Во-первых, не следует изменять свойства самой формы, кроме изменения ее размеров и позиции. Вместо этого нужно изменять свойства компонента TKOLForm, лежащего на ней. Во-вторых, нельзя бросать на форму не-MCK компоненты. В-третьих, многие свойства компонентов из MCK предназначены исключительно и только для времени проектирования и будут недоступны во время исполнения. Несколько мешает поначалу и то, что визуальное отображение элементов управления на этапе разработки выполняется схематически. Это совсем не похоже на VCL, где почти все компоненты можно было увидеть именно в таком виде, каком они предстанут перед конечным пользователем. Но привыкнуть к этому несложно, а если так уж надо узнать, как будет выглядеть тот или иной элемент управления, всегда можно откомпилировать и запустить готовую программу.

Зато MCK предлагает разработчику ещё одну крайне любопытную технологию, позволяющую ещё больше ужать код. Называется она Collapse. Достигается дополнительная экономия путем замены части машинного кода более компактным байт-кодом виртуальной машины. MCK умеет генерировать П-код параллельно генерации Паскаль-кода для инициализации форм, и далее при включении соответствующих опций компилятор включает в результирующий файл исполнимый П-код и его интерпретатор. Но эффект уменьшения размеров проявляется для достаточно больших проектов, так как хотя байт-код примерно вдвое меньше по размеру, по сравнению с машинным, сначала должно быть добавлено некоторое количество дополнительных процедур, в том числе и интерпретатор.


А ещё что хорошего?

Во-первых, что касается совместимости с разными версиями Delphi, то она... ну, я бы сказал, довольно своеобразная. Библиотекой поддерживаются версии Delphi 2, Delphi 3, Delphi 4, Delphi 5, Delphi 6, Delphi 7. Плюс ещё есть поддержка Free Pascal, но к ней я ещё вернусь. Поддержка Kylix (аналог Delphi для Linux, разработка этого проекта давно прекращена) объявлена как частичная, для неё нужен специальный конвертер и набор дополнительных модулей.

А что касается поддержки Free Pascal, то это, на мой взгляд, очень хорошо. Поскольку и сама библиотека свободная, и компилятор также, то можно вполне легально разрабатывать программы, не затрачивая средств на покупку инструментария для этого дела. Учитывая ещё и тот факт, что для Free Pascal есть среда быстрой разработки приложений Lazarus, с которой KOL+MCK также совместимы, мы получаем вообще великолепную комбинацию для разработки. Кстати, на этом плюсы от "сотрудничества" библиотеки с Free Pascal'ем не кончаются: Lazarus и Free Pascal поддерживают создание программ под WinCE, редакцию ОС Windows для портативных устройств. KOL тоже может компилироваться под эту систему. Вот, кстати, где действительно может найти наилучшее применение кодоэкономичная библиотека.

Есть ещё один нерешённый вопрос. А именно - компоненты от сторонних разработчиков. Но я потому и оставил этот важный вопрос в конце статьи, что ответ на него краток: с ними всё в ажуре. Сторонних компонентов, конечно, не столько, сколько для VCL, но совсем не мало. Есть графические компоненты, диалоги, компоненты для работы с сетью и Интернетом, базами данных и отчётами, элементы управления, мультимедийные компоненты... Львиная их доля имеет и "зеркала", т.е. MCK-компоненты, соответствующие KOL'овским. Среди прочего есть и адаптированные под KOL+MCK компоненты известной библиотеки Indy.

Найти в Интернете KOL+MCK можно по одному из двух адресов: www.kolnmck.ru или же www.kolmck.net. Поскольку автор библиотеки - россиянин, то оба сайта на русском (второй, правда, имеет и англоязычную версию). Много компонентов, примеров, документации. Есть даже учебник по KOL+MCK, и на русском языке. Владимир Кладов очень регулярно обновляет своё детище, да и другие разработчики не так уж редко пополняют копилку компонентов, так что библиотека поддерживает и Windows Vista, и всё такое прочее, с ней связанное.


Резюме

KOL+MCK - замечательная свободная объектно-ориентированная библиотека, уникальная в своём роде. Кстати, если не поленитесь заглянуть на сайте в раздел "Об авторе" (kolmck.net/r_author.htm), то обнаружите его статьи с очень интересными мыслями на разные темы. Это именно тот случай, когда талантливый человек талантлив во всём - и в программировании, и в философии, и даже в литературе (да, на сайте есть и фантастика, написанная Кладовым). А что касается библиотеки... Прибавить к сказанному выше, пожалуй, нечего. Это реально конкурентоспособная альтернатива VCL, которая действительно для некоторых проектов слишком громоздка. И уж точно кладёт на лопатки KOL родную библиотеку Lazarus'а, LCL, которая выдаёт исполняемые файлы по 5 Мб и более. Для программирования под КПК объём - по-прежнему значимый фактор, значит, KOL и далее есть куда развиваться. Так что стоит сказать спасибо Владимиру Кладову и пожелать ему дальнейших успехов. А самим иметь в виду эту библиотеку. Кто знает, что понадобится завтра?

Вадим СТАНКЕВИЧ,
dreamdrusch@tut.by

Версия для печатиВерсия для печати

Номер: 

41 за 2007 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!