Недавно выпущенный фирмой Borland продукт - Kylix (Delphi for Linux) вызвал большой интерес в среде разработчиков. На предрелизном этапе разработки мнения о Kylix порой были диаметрально противоположны, от экзальтированно-восторженных до агрессивно-негативных.
Автор попытался в данной статье изложить свое мнение о данном продукте, основанное на недельном опыте работы его эксплуатации. Претендовать на 100% объективность, поработав столь недолгое время, трудно, но надеюсь, что мои мысли будут интересны и полезны читателям.
Итак, то, что нам так долго обещала компания Borland, свершилось, Kylix выпущен. О начале разработки компания Borland (тогда еще Inprise) объявила приблизительно год назад (или даже ранее). Это вызвало огромную заинтересованность в мире разработчиков ПО, т.к на сегодня Linux является одной из наиболее быстро растущих операционных систем. В последнее время рост Linux намечается не только как ОС для серверов, но и как операционной системы настольных ПК. (в подтверждение этого, я пишу эти строки в Linux) Развитие Linux, как ОС для настольных систем вызвало необходимость создания средств разработки приложений с графическим интерфейсом. Конечно, разработчики графических систем GNOME и KDE предлагают свои средства разработки, такие как GLADE и KDeveloper (которые к тому же бесплатны), но ни одно из этих средств разработки не может полностью удовлетворить возрастающие требования разработчиков. Таким образом, незаполненная ниша средств разработки приложений под Linux и огромная популярность Delphi дает Borland отличные шансы закрепиться на данном рынке.
Для тестирования была выбрана версия Kylix Server Developer Version 1.0 Build 5.62. Комплект поставки включал 2 CD. Один собственно с Kylix, а второй содержит дополнительные инструменты и компоненты. Откуда все взялось ? Вопрос риторический (ларек за углом). Сразу хочу принести искренние извинения компании Borland, ну нет меня нужной суммы (~2000$) чтобы оценить качество продукта (спонсоры где вы :-) ). Ну хватит о грустном .
В качестве ПК использовался P-III 500 , RAM 64 Mb, HD 10 Gb. Опрерационные системы - Red Hat Linux 7.0, Red Hat Linux 6.2. В качестве графической оболочки использовалась KDE KDE 2, GNOME. Установка проводилась как под аккаунтом root, так и под простым пользователем. Сразу отмечу, что инсталляция проходила гладко и без проблем (если не считать установку патчей glibc, что было запрошено программой инсталляции и также не вызвало затруднений). Графическая оболочка сделана удобно и интуитивно понятна.
После установки запуск графической оболочки также проходил без проблем. Не скажу, что скорость работы IDE меня поразила, но была вполне приемлема и не вызывала неприятных ощущений от заторможенности.
Резюме: инсталляция и запуск IDE не должны вызывать проблем.
IDE Kylix практически дублирует IDE Delphi 5, чего, вообще говоря, и следовало ожидать. Первое впечатление, что ты и не покидал Delphi. Однако, по прошествии некоторого времени, обнаруживаешь, что отсутствует меню Database (где любимый SQL Explorer?). Средства создания приложения с поддержкой нескольких языков также не обнаружились . Наблюдаются различия и в палитре компонентов: отсутствует закладка Win32 (ну еще бы), на закладку Additional перенесены таймер и PaintBox (закладка System, в которой они находятся в Delphi упразднена, по всей видимости за ненадобностью), введены новые компоненты LCDNumber (ЖК индикатор), TextBrowser и TextViewer.
Естественно, что так как сама Borland позиционирует Kylix как Delphi под Linux я часто буду сравнить эти два средства разработки.
Начнем с набора визуальных компонентов в палитре. Большинство визуальных компонентов для создания пользовательского интерфейса присутствуют в обеих средах разработки. Отметим, что в Kylix стандартные компоненты получили свое дальнейшее развитие, т.е были добавлены новые свойства и методы, расширяющие функциональность компонентов и делающие их использование более гибким. В то же время в компонентах Kylix не были замечены какие-либо средства для поддержки восточных языков (Bidi Modes), так же отсутствуют свойства, связанные с плавающими окнами (docking).
Каких-либо кардинальных нововведений в процессе визуального программирования в Kylix мной замечено не было, да и, наверное они не нужны, т.к Delphi предоставляет одну из лучших (если не лучшую) среду визуальной разработки пользовательского интерфейса. Минут за 20-30 без всяких проблем мне удалось написать тестовое приложение типа редактора Notepad.
Резюме: Таким образом, можно сказать, что Kylix является одним из самых удобных средств быстрой разработки графических интерфейсов под Linux.
Решив разработать небольшое приложение для просмотра и редактирования БД, я разместил на форме SQLConnection и попытался связаться с сервером MySQL (ver 10.8 Distrib 3.23.22-beta, входит в поставку Red Hat Linux 7.0). Здесь я наступил на первые грабли в виде сообщения Unable to load libmysql.so.6.0.0. После недолгих поисков обнаружилась /usr/lib/myslq/libmysql.so.9.0.0, которая и была прописана в свойстве VendorLib, но и это не помогло мне, т.к на все последующие попытки ввода login/password я с неизменным успехом видел Invalid User/Password. Обозлившись на это дело и перепробовав все возможные комбинации host/database name/login/password, с соседней машины Windows подключился к базе без всяких проблем (через ODBC), из командной строки подключение к MySQL проблем тоже не вызвало. Через несколько дней на сайте Borland обнаружилось подтверждение, того что я не одинок. Как было указано, с версией MySQL 3.23 dbExpress не работает. К Interbase 6 на локальной машине подключение не вызвало проблем. Протестировать подключение к Oracle и DB2 не представилось возможным за отсутствием оных. Драйверов для других типов баз данных в поставке не обнаружилось.
Далее по старой памяти кинув на форму DataSource и SQLTable, настроив их нужные свойства (по аналогии с Delphi) и активизировав SQLTable (Active:=true), я было попытался установить свойство DataSource в сетке данных (DBGrid), и тут меня ждали вторые грабли - Operation not allowed on unidirectional dataset. После тщетных попыток найти ошибку в своих действиях, когда уже ничего не помогало, я прибегнул к самому отвратительному :) - чтению документации.
Как оказалось, все компоненты типа DataSet делятся на два типа
Unidirectional - данный вид набора данных предназначен для извлечения данных через SQL запросы. Он позволяет двигаться по данным только вперед (согласно сортировке заданной order by) и не кэширует изменения, что делает его более быстрым и менее требовательным к ресурсам. Однако, он не позволяет пользователю редактировать данные, накладывать фильтры и Lookup. По вышеуказанным причинам я и не смог подключить unidirectional dataset для отображения в DBGrid.
Второй тип наборов данных - Client dataset. Данный тип наборов данных сохраняет записи из БД в буфер, позволяя перемещаться по записям в любом направлении. Именно данный тип набора данных может быть отображен в DBGrid и других элементах пользовательского интерфейса.
На основе всего вышесказанного, в документации предложено несколько архитектур взаимодействия с БД.
1. Работа на локальной машине с набором данных формируемым TClientDataSet. В Delphi 5 данная модель взаимодействия называлась briefcase. В Kylix (по крайней мере сегодня) нет возможности передавать изменения на сервер, т.е они остаются в файлах *.cds (или xml). В данном случае файлы *.cds представляют собой аналог локальных БД. Загружать/выгружать содержимое на диск можно соответственно функциями LoadFromFile/SaveToFile. Что неудобно в данном методе - определять структуру таблиц.
Данная архитектура позволяет просматривать только одну запись из базы в каждый момент времени. Редактирование недоступно, двигаться по набору записей можно только вперед. Данный вид архитектуры полезен для статистического анализа записей БД, но на его основе практически нельзя построить приложение для ввода и редактирования данных пользователями.
3. Комбинация client и unidirectional dataset. Unidirectional dataset используется для извлечения данных с сервера БД, client dataset для буферизации, отображения, редактирования данных. Здорово завернуто, правда, особенно после Delphi, где до такого еще не додумались. Практически здесь выделены все компоненты трехзвенной архитектуры, но сервер приложений находится в одном приложении с презентационным слоем.
Но не спешите радоваться, т.к внизу как всегда есть приписочка, что компоненты типа Connection component придется приобретать отдельно, когда это станет возможно не сказано. Фактически, в той поставке, что тестировалась, создать трехзвенное приложение было невозможно. Причины этого на мой взгляд, в том что в Delphi было по большому счету две технологии взаимодействия приложений DCOM и CORBA. При тщательном рассмотрении оказывалось, что CORBA в Delphi являлась надстройкой над DCOM, а последний является на сегодня жестко привязанным к платформе Windows. Из данной ситуации есть два выхода: реализовывать DCOM для Linux (кстати частично это все же присутствует в Kylix), либо переходить на платформно незвависимую технологию CORBA. Оба эти пути достаточно сложны и имеют свои подводные камни, так что не будем судить Borland слишком строго.
Генерация отчетов и диаграмм. Решения данной задачи (т.е каких-либо генераторов отчетов) я не обнаружил вовсе. Что, мягко говоря, не очень понятно прикладным программистам.
Подведем итоги. Итак, базы данных и приложения работы с ними, по их устройству можно классифицировать на
1. Локальные БД (Dbase, Paradox). Решения для работы с локальными базами данных, даже формата dbf я не обнаружил, что для меня не понятно. Остается лишь вариант ClientDataSet+*.cds (архитектура 1), что не вызывает у меня большого восторга, т.к на сегодняшний день существует большое количество унаследованных систем хранящих данные именно в формате DBase или Paradox.
2. Двухуровневые БД (клиент - сервер). Приемлемо, достаточно удобно, хотя и непривычно.
3. Многоуровневые. Сейчас невозможно. Хотя в документации описание присутствует. Надеюсь, что в ближайшее время разработка многоуровневых БД станет доступной.
Резюме: работа с базами данных в Kylix еще далека от совершенства. Реально, на сегодня можно разрабатывать приложения клиент-сервер для работы с DB2, Oracle, MySQL( надеюсь, что в ближайшее время ошибки будут устранены) и Interbase.
Что действительно порадовало меня, так это включение в Kylix набора компонентов для работы с Internet - Indy. Данная библиотека содержит большое количество компонентов, обеспечивающих работу с многими сервисами интернета (сокеты TCP и UDP, DNS, FTP итд). Причем для многих протоколов реализованы не только клиенты, но и сервера. Включение Indy явилось безусловным плюсом в развитии Kylix (и Delphi, т.к Indy должен войти в Delphi 6). Большое количество примеров работы с данной библиотекой находится в архиве /demos/Internetdirect/IndyDemos.tar.gz.
Другой стороной работы с Internet является расширение возможностей Web серверов, помимо CGI сценариев, Kylix позволяет разрабатывать и модули популярного Web сервера Apache. Принцип построения модулей Apache аналогичен написанию CGI, т.е используется WebModule итд. По ставнению c Delphi технология разработки не претерпела изменений, поэтому останавливаться подробно на ней мы не будем. Для запуска примеров, по крайней мере под RedHat, пришлось перекомпилировать сервер Apache с включением поддержки DSO. Данная процедура подробно была описана в документации Kylix и не вызывала проблем. А вот инсталляция примера заставила меня немного потрудиться. Вызвано это было тем, что в документации и примере содержались ошибки, связанные с тем, что параметры конфигурации были указаны неверно, вернее был неправильно указан регистр букв( замечу, что для Apache в Unix имена параметров HelloWorld и Helloword две большие разницы). В конце концов тестовый пример был благополучно запущен, но впредь было бы хорошо, чтобы Borland более внимательно относилась к тестированию примеров.
Резюме: разработка приложений для взаимодействия с сервисами Internet удобна и достаточно развита. Создание CGI приложений было дополнено средствами создания модулей для популярного Web сервера Apache. Однако отсутствие поддержки регулярных выражений (а HTTP текстоориентированный протокол ), на мой взгляд, является заметным недостатком в данной области.
Библиотека CLX (Borland Component Library for Cross Platform - произносится как кликс) , на основе которой построена иерархия объектов в Kylix, является дальнейшим развитием объектной библиотеки Delphi - VCL. Главной целью разработки CLX стало стремление создать независимую от операционной системы библиотеку классов и компонентов. Наверное, с выходом Delphi 6 эта цель будет окончательно достигнута.
Все основные классы VCL обнаружились и в CLX, т.е родитель - это TObject итд. Миграция от VCL к CLX, как мне кажется, не вызовет серьезных проблем у большинства разработчиков.
Как и в Delphi кроме классов в иерархии присутствуют интерфейсы. Вот тут и кроется один интересный момент. В иерархии интерфейсов явно виднеется IUnknown, в интерфейсах есть GUID, wine для оболочки, чую Windows. Думаю, далее следует вопрос, а сможет ли когда-либо Kylix окончательно стать независимым от Windows COM или Borland будет последовательно переносить COM на Linux?
Конечно, COM является одним из лидеров технологий распределенных приложений, но ведь в последнее время все более заметной становится другая технология CORBA, объективно обладающая рядом достоинств, по сравнению с COM. CORBA активно и довольно успешно поддерживалась на платформе Windows, был разработана версия VisiBroker для Linux.
Если касаться внутреннего устройства CLX, то надо отметить, что она базируется на мультиплатформенной библиотеке Qt фирмы TrollTech http://www.troll.no/. Поскольку Qt написана на C++, необходимо было реализовать промежуточный слой, транслирующий модель компонентов Kylix в вызовы функций Qt (напомню, что в С++ не поддерживаются свойства). Данный в слой был назван CLXDisplay. Отношения между Qt и CLX по части визуальных компонентов сродни отношениям VCL и Win32 API (в части элементов управления). В CLX "общение" c Qt происходит по следующим правилам
QLabel(QWidget *parent=0, const char *nome=0, WFlags f=0)Транслируется в Object Pascal
function QLabel_create(parent: QWidgetH; name: PAnsiChar; f: WFlags): QLabelH; overload; cdecl;
virtual void setText(const QString &)в Object Pascal будет выглядеть как
TxtLbl := 'this is a test'; QLabel_setText(LabelHandle,@Txtlbl);
// Декларация bool connect (const QObject *sender, const char *signal, const char *member) // Привязка connect(Button,SIGNAL(clicked()),App,SLOT(quit())В Object Pascal
function QObject_connect(sender: QObjectH; signal: PAnsiChar; Receiver: QObjectH; member: PAnsiChar): Boolean; overload;
Так например если связать сигнал нажатия кнопки со слотом quit приложения, то при нажатии на кнопку приложение будет закрываться. Таким образом осуществляется делегирование обработки событий. Однако данная техника не позволяет в Kylix (в отличии от С++) писать собственные обработчики событий (слоты). Так, в нашем примере мы не сможем выдать диалог подтверждения закрытия.
Все вышеописанное говорит о большой работе, проделанной программистами Borland при разработке CLX. За подробностями взаимодействия CLX с Qt рекомендую обратиться к статье Bruno Sonnino "Programming Kylix with the CLXDisplay API", размещенную на сайте Borland.
В связи со всем сказанным возникает вопрос - как будет взаимодействовать с Qt анонсируемый Borland аналог C++ Builder. С одной стороны он должен поддерживать CLX, с другой вышеописанные проблемы с созданием собственных слотов перед ним стоять, по идее, не должны.
Одной из задач разработки Kylix являлось обеспечение максимальной совместимости с Delphi. Данную задачу можно разбить на несколько подзадач.
Документация Kylix содержит довольно большой раздел, посвященный переносу приложений и совместимости с Delphi.
В частности, о чем придется забыть в Kylix
1. Вызовы Windows APIРеестр Windows
2. COM & ActiveX
3. BDE&ADO
4. CORBA
5. Трехзвенные БД
Таким образом, на сегодняшний день можно говорить о частичной совместимости Delphi и Kylix, и то на уровне графического интерфейса пользователя.
Моя личная попытка перенести простейший проект с одной формой из Delphi в Kylix и обратно увенчались успехом, однако, по моему мнению, ни один из серьезных проектов автоматически или даже полуавтоматически из Delphi5 в Kylix портирован не будет.
Ранее для Delphi неоднократно отмечалось, что размер даже минимального проекта с одной формой составлял более 200 кбайт. Kylix, к сожалению, поддержал и развил эту традицию. Размер вышеуказанного проекта составил 385 к байт.
Резюме: Разработчики приложили максимум усилий для совместимости Kylix и Delphi. По анонсам Delphi 6 должна быть максимально совместима с Kylix, однако глубокие различия Linux и Windows приводят к тому, что на практике 100% совместимость будет вряд ли достигнута.
Функциональность | Оценка |
IDE&Help | 5 |
Создание консольных приложений | 5 |
Создание графического интерфейса пользователя GUI | 5 |
Работа с БД | |
А) Создание графического интерфейса к БД | 5- |
Б) Работа с локальными БД | 3- |
В) работа с серверами баз данных (классический клиент - сервер) | 4 |
Г) многоуровневые приложения работы с БД | 2 |
Создание приложений для работы с сервисами Internet | 5 |
Создание приложений, расширяющих функциональность Web серверов | 5- |
Библиотека компонентов | 5 |
Взаимодействие распределенных объектов | 2 |
Совместимость с Delphi 5 | 4- |
Общая оценка | 4 |
Итак, подведем итоги. Безусловно, что выход Kylix является событием в мире разработчиков программного обеспечения. Необходимость в продукте данного класса назрела и нужно выразить большую благодарность Borland за усилия, затраченные на разработку. Сильной стороной продукта являются:
Как мне кажется, как среда разработки Kylix дозрел до уровня Delphi 2-3. Можно рекомендовать его как средство разработки графического интерфейса, работы с серверами базами данных клиент-сервер, разработки приложений для работы с сервисами интернета. В остальных областях программирования ( мультимедиа, распределенные объекты, трехзвенные БД) налицо наличие нереализованного потенциала развития. Данному продукту можно поставить твердую четверку. В заключении еще раз поблагодарю Borland и принесу свои извинения за нелицензионное использование ее продукции. Надеюсь, что когда-либо выпадет возможность не нарушать закон.
Внимание! Запрещается перепечатка данной
статьи или ее части без согласования с автором. Если вы хотите разместить эту
статью на своем сайте или издать в печатном виде, свяжитесь с автором.
Автор статьи: Mike Goblin