Блог → Углубимся в историю: Borland Kylix 3 и C++. Часть 3

Итак, продолжаем углубляться в историю Borland Kylix 3, в которой впервые появился C++ IDE. Сейчас следует сказать также пару слов о создании разделяемых библиотек. Вообще говоря, Kylix C++ IDE предоставляла возможность создавать библиотеки на С и C++, как с поддержкой потоков, так и без таковой. Библиотеки, написанные на C++, в большинстве случаев были совместимы только с другими проектами Kylix (про несовместимость форматов классов я уже писал в предыдущих частях статьи, см. тут и вот тут).



В отличие от Delphi Language, в языке C++ отсутствуют директивы, позволяющие указывать такие параметры библиотек, как внутреннее имя. Эти параметры следует указывать на вкладке Project Options -> Application. Резюмируя сказанное выше, можно сказать, что сфера применения C++ в Kylix 3 IDE была ограничена теми же рамками, что и сфера Delphi Language. Иными словами, C++ Kylix IDE предназначался скорее для создания прикладного ПО.

При программировании на обычном С также возникали некоторые сложности. Кончено, в активе Kylix IDE оставались такие преимущества, как интеллектуальный редактор кода, на мой взгляд, лучший в своем жанре не только на платформе Linux, но и на платформе Windows, и встроенный интерактивный отладчик. Однако интерактивный отладчик есть и в KDevelop. Кроме того в KDevelop основан на GCC и создает стандартные configure- и make-скрипты, которые можно затем использовать для сборки приложения в любой Linux-системе (и не только). Таким образом, пользователи, привыкшие к GCC/KDevelop, скорее всего, захотят использовать новую среду только в том случае, если им понадобятся компоненты для создания интернет-приложений и работы с базами данных. О новых компонентах и технологиях, реализованных в Kylix 3 и пойдет речь в следующем разделе.

Настало время перейти к Delphi для Linux. Что нового ждало нас тут? В обзоре Kylix 2, который я писал в своё время, я отмечал, что одно из стратегических направлений развития средств разработки от Borland связано с сетевыми технологиями. Вот и новая версия Kylix как нельзя лучше подтвердила это предположение. Разработчики Kylix 3 ввели в среду принципиально новое средство - отладчик web-приложений (в оригинале - Web Application Debugger). Отладчик фактически представляет собой связанный с IDE web-сервер, по умолчанию "слушающий" порт 8081 (если в вашей системе указанный порт используется другим интернет-сервисом, вы можете изменить это значение в диалоговом окне Server -> Options приложения Web Арр Debugger). Web Арр Debugger позволяет запускать web-приложения в системах, где обычный web-сервер вообще не установлен. Кроме того, по сравнению с обычным сервером,сервер-отладчик предоставляет дополнительные возможности по отладке и анализу параметров работы web-приложения.

Появление отладчика web-приложений в третьей версии Кайликса выглядит вполне логично. Как и разделяемые библиотеки, такие приложения не могут запускаться непосредственно из IDE и нуждаются в специальных средствах для интерактивной отладки. Для того чтобы задействовать отладчик web-приложения, необходимо при создании нового проекта указать тип приложения "Web Арр Debugger executable" (соответствующая опция присутствует в мастерах создания всех классов web-проектов). После окончания отладки приложение можно конвертировать в приложение CGI или разделяемый модуль (DSO) для сервера Apache.

Рассмотрим работу отладчика на примере простейшего web-приложения Web Dispatcher. На вкладке New диалогового окна New Items (меню File -> New -> Other) выбираем пункт "Web Server Application". В открывшемся окне выбираем тип приложения - "Web Арр Debugger executable", а в строке Class name указываем имя класса "МуАрр". Кроме формы TWebModule в заготовку нового приложения добавляется необычная для web-приложений форма-наследник TForm, но удивляться этому не следует, ведь по сути - мы создаём приложение для запуска в IDE. Помещаем в созданную форму WebModule1 компонент TPageProducer. В поле HTMLDoc компонента PageProducerl вводим следующий текст:

[HTML]
[HEAD]
[TITLE]My WebApp: Hello World![/TITLE]
[/HEAD]
[BODY]Hello World![/BODY]
[/HTML]


Создаём в модуле WebModule1 новый элемент WebActionItem и связываем его с компонентом PageProducer1. В поле PathInfo элемента указываем "/". Сохраняем проект под именем WAPr1. Всё! Приложение готово - его можно запустить командой Run.

После запуска приложения можно запустить и отладчик (меню Tools -> Web Арр Debugger). В открывшемся окне нажимаем кнопку Start и щелкаем по ссылке http://local-host:8081/Serverinfo.Serverinfo. В запущенном браузере открывается страница Registered Servers, на которой перечислены все зарегистрированные отладчиком приложения-серверы. Выбираем в списке пункт WAPr1.МуАрр и нажимаем кнопку Go. После этого в окне браузера должна появиться страница, созданная компонентом PageProducer1.

Работая с отладчиком web-приложений в Kylix 3, можно выполнять все стандартные отладочные операции: устанавливать точки останова в исходном тексте, просматривать значения переменных и пр. Кроме того, Web Арр Debugger позволяет получить данные о числе запросов и времени их обработки (вкладка Statistics), а также просматривать log-файл обращений к серверу (вкладка Log).

После окончания отладки вы, скорее всего, захотите преобразовать приложение в CGI-приложение или модуль Apache. Для этого можно создать заготовку нового приложения соответствующего типа, с помощью менеджера проектов удалить из него созданные по умолчанию файлы web-модулей и при помощи того же менеджера скопировать файлы Web-модулей старого приложения в новый проект.

Но можно пойти и другим путем, а именно - поместить отлаженный web-модуль в репозиторий объектов и затем вставить его в проект нового приложения. Для этого щёлкаем правой кнопкой мыши в окне WebModule1 (не Form - обратите внимание!) и в контекстном меню выбираем пункт Add to Repository. В открывшемся окне вводим в поле Title значение МуАрр, а в поле Page выбираем значение Data Modules. Можно также задать иконку нового шаблона, описание и имя автора. Нажимаем OK. Теперь создаём новую заготовку приложения Web Server Application нужного нам типа и удаляем из нового проекта файлы web-модуля. Затем снова открываем окно File -> New -> Other, и на странице Data Modules выбираем компонент МуАрр. Отлаженный модуль успешно перенесён в новый проект!

Рассмотрим подробнее еще одно новшество Kylix 3 - компонент XSLPageProducer. Этот компонент продолжает сразу две тенденции развития интернет-технологий в средах разработки от Borland. С одной стороны, XSLPageProducer можно рассматривать как дальнейшее развитие средств работы с данными в формате XML. С другой стороны, данный компонент продолжает серию компонентов-генераторов динамических страниц на основе шаблонов. Первые генераторы контента появились в эпохальной версии Delphi 3, и с тех пор новая технология непрерывно развивалась. В предыдущей версии Kylix были введены шаблоны, использующие скрипты на стороне сервера. С появлением же третьей версии Кайликса, Borland добавила технологию шаблонов, являющуюся стандартом в мире интернета.

Компонент XSLPageProducer преобразует данные, поступающие в формате XML, в "понятные" браузеру страницы на основе шаблона, заданного в формате XSL (Extensible Stylesheet Language). В принципе, современные браузеры способны корректно отображать XML-страницы, содержащие ссылку на XSL-шаблон. Компонент XSLPageProducer может получать данные как из XML-документов (для этого он должен быть связан, например, с компонентом XMLDocument), так и напрямую из потока XML-данных (для этого его следует связать с компонентом XMLBroker). С помощью этого компонента можно отображать и информацию, полученную из баз данных. Для этого компонент XSLPageProducer следует использовать в связке с компонентами XMLTransformClient и XMLTransformProvider.

В качестве примера предлагаю рассмотреть приложение, получающее ссылки на XML- и XSL-файлы и генерирующее web-страницу при помощи компонента XSLPageProducer. Проект web-приложения, использующего компонент TXSLPage-Producer, создается следующим образом: открываем окно New Items и выбираем пункт Web Server Application. В открывшемся окне указываем желаемый тип создаваемого приложения.



В созданную форму web-модуля помещаем компоненты XSLPageProducer, PageProducer и XMLDocument. Свойству HTMLDoc компонента PageProducer1 присваиваем текст:

[html]
[head]
[title]XSL/XML Explorer[/title]
[/head]
[body]
Enter XML and XSL filenames and press "submit"

[form action=#actionname method=GET]
XML:
[input type=text size=32 name=xmlname]

XSL:
[input type=text size=32 name=xslname]

[input type=submit name=submit]

[/form]
[/body]
[/html]


А событию OnHTMLTag - присваиваем вот такой вот обработчик:

procedure
TWebModule2.PageProducer1HTMLTag
(Sender: TObject;
Tag: TTag;
const TagString: String;
TagParams: TStrings;
var ReplaceText: String);
begin
ReplaceText := Request.PathTranslated + '/showxml';
end;


Свойству XMLData компонента XSLPageProducer1 присваиваем ссылку на компонент XML-Document1. После этого запускаем редактор свойства Actions web-модуля и создаем два объекта WebActionItem. Значения свойств первого объекта:

Default : True
Pathlnfo : "/"
Producer : PageProducer1


Свойству Pathlnfo второго объекта присваиваем значение "/showxml". Кроме того, для данного объекта назначаем обработчик события OnAction:

procedure
TWebModule2.WebModule2 WebActionltem2Action
(Sender: TObject;
Request: TWebRequest;
Response: TWebResponse;
var Handled: Boolean);

var XMLName, XSLName : String;
begin
XMLName := Request.QueryFields.Values['xmlname'];
XSLName := Request.QueryFields.Values['xslname'];
if not FileSxists(XMLName) then
begin
Response.Content := 'File 1 + XMLName + ' not found';
Exit;
end;

if not FileExists(XSLName) then
begin
Response.Content := 'File 1 + XSLName + 1 not found1;
Exit;
end;

XMLDocument1.DOMVendor := DOMVendors.Vendors[0];
XMLDocument1.FileName := XMLName;
XMLDocument1.Active := True;
XSLPageProducer1.DOMVendor := DOMVendors.Vendors[0];
XSLPageProducer1.FileName := XSLName;
XSLPageProducer1.Active := True;

Response.Content := XSLPageProducerl.Content;
end;


Собственно, и всё - наше приложение готово, и его можно запустить, используя соответствующий локальный web-сервер. При запуске приложения в окне браузера появляется форма с полями ввода для имен XLM-файла и XSL-шаблона. После щелчка по кнопке Submit браузер выводит соответствующую страницу, а при помощи команды браузера View HTML Source можно убедиться, что страница передана в формате HTML. Подчеркну ещё раз: наше тестовое приложение должно выполняться на локальной системе, так как имена файлов задаются в локальной файловой системе. Кроме того, не следует передавать компоненту-генератору XML-страницы, уже содержащие ссылку на XSL-шаблон.

Ну и кое-что о недочётах. К добрым словам в адрес старого доброго Kylix 3 я, к сожалению, не могу не добавить пару ложек дегтя. Компоненты TextViewer и TextBorwser по-прежнему не позволяли указывать кодировку текста и игнорировали оную в HTML-страницах. Ещё одно неудобство возникало при отладке в IDE многопоточных проектов. При приостановке или перезапуске потока процесс получает сигналы SIGSTOP и SIGCONT, о которых IDE "добросовестно" информирует программиста (прерывая выполнение программы и выводя диалоговое окно). Такая навязчивость существенно замедляла процесс отладки и, судя по отзывам, сильно раздражала новичков. Разработчикам следовало бы, пожалуй, предусмотреть опциональную возможность отключения вывода сообщений о подобных "штатных" сигналах. Лично я решал эту проблему следующим образом: сначала отлаживал весь код без приостановки потоков, а уже затем вставлял фрагменты, вызывающие методы Suspend и Resume.

И ещё кое-что о вызовах. Проблемы возникали при обращении к свойствам типа "массив записей" (речь не идёт о свойствах-наследниках TCollection). Например, следующая конструкция:

SomeObject.ArrayProperty.
SomeField := ...;


нередко приводила к выдаче сообщения о внутренней ошибке компилятора! Нехорошо.

Итак, подводя итоги, скажу одно - третья версия Kylix достойно продолжила линию сред визуальной разработки от Borland. Она, не претендуя на роль средства системного программирования, безусловно, являлась лидером в области разработки интернет-приложений и приложений баз данных. Нельзя не отметить изобретательность, с которой разработчики Borland интегрировали поддержку новых интернет-технологий в традиционные средства разработки, а возможность работать с XML и SOAP, не покидая знакомой среды, безусловно облегчила освоение этих технологий. В области удобства редактирования кода и быстроты создания программ Borland, по состоянию на 2002 год, по-прежнему была "впереди планеты всей", и выпустив C++ IDE для Linux, компания завершила процесс унификации средств разработки для обеих платформ.