XPCOM часть первая: Введение.

image

Вольный перевод первой части статьи про технологию XPCOM от Rick Parrish.

XPCOM — стандарт кросс-платформенной объектной модели компонентов COM, это фреймворк для написания кросс-платформенного модульного программного обеспечения.


XPCOM использует набор библиотек для выборочной загрузки и управления XPCOM-компонентами. Эти компоненты могут быть написаны на C, C++, JavaScript и соответственно использоваться из этих языков (расширения для Perl и Python находятся в разработке, см. Приложения).

В дополнении к модульности XPCOM работает на разных платформах, поддерживаются все платформы с подходящим компилятором C++, в том числе:

  • Microsoft Windows
  • Linux
  • HP-UX
  • AIX
  • Solaris
  • OpenVMS
  • MacOS
  • BSD

Для написания программного обеспечения с использованием XPCOM потребуется: компилятор C++, интерпретатор Perl некоторые утилиты GNU.

Программное обеспечение использующее XPCOM:

Хотя Adobe Acrobat и не является XPCOM приложением, тем не менее он использует модифицированную версию JavaScript движка поставляемого с XPCOM. Это говорит о том что исходники XPCOM хорошо оттестированы и широко используются.

Microsoft COM и XPCOM

Быть может XPCOM это нечто вроде Microsoft COM? И да и нет. Одно из различий — поддержка прокси компонентов. Прокси компонент это не настоящий (поддельный) компонент, выдающий себя за другой (настоящий) компонент, к которому (по некоторым причинам) не может быть получен доступ из клиентского кода. Например, код не может получить доступ к компоненту напрямую потому что компонент существует в другом процессе или даже на другой машине.

Microsoft COM поддерживает сложный прокси механизм координации того как различные типы приложений взаимодействуют с компонентами, включая те которые запущены отдельными программами и даже на отдельных машинах. MSCOM позволяет вам создавать компоненты с различными моделями потоков или ограничить компонент специфичной моделью. Компоненты могут быть созданы в том же процессе (запущены внутри приложения) или в другом процессе (как стороннее приложение). Однопоточный компонент должен иметь свой собственный поток, а другие потоки должны использовать прокси механизм для доступа к нему. Разделяемые компоненты могут использовать общие потоки, но все еще нуждаются в прокси. Потоконезависимые компоненты не требуются прокси механизма внутри одного процесса. Прокси механизм MSCOM предоставляет подходящее количество безопасных потоков для компонентов которые имеют свои потоковые ограничения.

XPCOM осуществляет поддержку отдельных компонентов на уровне приложения, поэтому прокси сервисы поддерживают только многопоточное разделение или не реентрабельные компоненты. Если вы хотите получить доступ к компоненту удаленно, то Вам придется написать свой собственный прокси для передачи данных до и от удаленного объекта. Существует несколько компонентов которые помогут, это не так сложно как кажется.

На самом нижнем уровне, XPCOM и MSCOM идентичны: имеют интерфейсную направленность и требуют что бы каждый интерфейс наследовался от базового интерфейса. Базовый интерфейс определяет три метода QueryInterface, AddRef и Release. Несмотря на общее идеологическое начало, MSCOM и XPCOM компоненты не совместимы и не взаимозаменяемы. Для осуществления взаимодействия между ними необходим код обертки или связывающий код. Хороший пример — обертка для браузера Mozilla позволяет ему выступать как MSCOM ActiveX элемент в то время как сам браузер оперирует XPCOM компонентами.

Существенное различие XPCOM и MSCOM в том что XPCOM — свободное программное обеспечение. Разработчикам программного обеспечения на базе MSCOM, приходится надеяться лишь на доступную документацию в случае возникновения проблем с пониманием того как MSCOM библиотеки загружают и создают компоненты. К счастью Microsoft приложила большие усилия к продвижению своей архитектуры и предоставляет хорошую документацию. Однако, если Microsoft поменяет поведение системных библиотек, то это может отразится и на поведении ваших компонентов и тем самым на поведении всего приложения.

В противоположность исходный код библиотек создающих XPCOM архитектуру полностью доступен для исследований, трассировки и отладки, так же как и ваш собственный код. Вы можете даже модифицировать исходный код, что бы расширить архитектуру под себя, в противоположность ожиданию этого от Microsoft (MSCOM эволюционировал из простого COM, в DCOM, а затем в COM+).

Если вы до сих пор не знакомы с открытым программным обеспечением, возможно вам захочется исследовать другие примечательные открытые проекты, такие как: GNU projects, OpenBSD, Linux, OpenLDAP, OpenSSL, Apache и другие (см. Приложения).

XPCOM, потоки, CORBA, и прочее

Необходимо понять как XPCOM обрабатывает удаленные объекты, потоки и скрипты. Некоторые технологии XPCOM пришли из OMG CORBA. CORBA — платформенно и языково независимая технология компонентов стандартизированная в Object Managment Group. Она включает общую архитектуру для удаленного вызова процедур, язык описания интерфейсов — Interface Definition Language (IDL, аналогичный COM и XPCOM), и широкий набор общих объектных сервисов.

Строго говоря, XPCOM не поддерживает удаленные объекты как CORBA, возможно написать компонент который использует сокеты или другие средства для взаимодействия со сторонними компонентами. Многие приложения XPCOM используют HTTP как средство вызова удаленных процедур сторонних компонентов расположенных на Web-сервере. Есть даже несколько компонентов для поддержки SOAP. Еще одно наследие CORBA — компилятор XPCOM IDL (XPIDL), — ответвление от открытого компилятора CORBA IDL.

XPCOM поддерживает потоки. Однако, потоко-безопасные компоненты скорее исключения, большинство компонентов написаны что бы сосуществовать в главном потоке приложения. XPCOM использует простую схему определения является ли компонент потоко-безопасным — компонент должен сам указать что является потоко-безопасным.

Поддержка потоков представлена в XPCOM даже на платформах с неполной или отсутствующей многопоточностью. XPCOM поддерживает скрипты через дополнительный слой (называемый XPConnect) который включает движок JavaScript и механизм библиотечных типов. Это позволяет манипулировать компонентами XPCOM и даже реализовывать компоненты на JavaScript, эти компоненты также будут доступны из C++ кода.

Краткая история Mozilla

Около трех лет назад, Netscape открыла исходный код браузерного движка как открытый проект Mozilla. Разработчики стороннего программного обеспечения начали изучать фреймворк Mozilla, в некоторых случаях разработка уходила далеко от браузера и почтового клиента. Основная идея Netscape при создании модели XPCOM была в осуществлении поддержки собственных разработок модульного и кросс-платформенного программного обеспечения — большая часть которого была написана с использованием C и C++.

Mozilla это так же веб-сайт mozilla.org, родной дом для XPCOM и отличный источник кода и информации. Возвращаясь в январь 1998, пожалуй пик браузерных войн, Netscape анонсирует планы открыть их исходный код. В феврале того же года появляется mozilla.org, а в конце марта Netscape публикует исходные коды, тем самым сдержав свое обещание. Читатели могут исследовать open source FAQ, free FAQ и Mozilla FAQ более детально (см. Приложения).

Mozilla.org непросто FTP сервер где люди могут скачивать последние архивы. Это:

  • Web система отслеживания ошибок называемая Bugzilla
  • A Web-based source code cross-referencing system
  • Сервер новостей и групп обсуждений разработчиков Mozilla
  • Поисковая система онлайн документации
  • Хранилище HTML документации

Вопросы лицензирования

Многие компании не знакомы с лицензированием открытого кода. Существует явный конфликт межу бесплатным программным обеспечением и проприетарным программным обеспечением. Главный вопрос: можно ли продавать программное обеспечения написанное с использованием XPCOM? В общем случае да.

Если вы разарбатываете отдельную программу которая использует XPCOM библиотеки, то все что вам нужно, — сказать вашим клиентам что часть программы разработана в Mozilla (например разместив логотип «Mozilla Powered» внутри секции «О программе»). Вы так же обязаны предоставить исходный код XPCOM вашим клиентам. Большинство людей соблюдает это условие предоставив ссылку на веб-сайт Mozilla.

Вам не нужно публиковать или предоставлять исходный код взаимодействующий с XPCOM. Тем не менее, если вы меняли исходный код XPCOM, то вы обязаны предоставить свои изменения сообществу.

Происхождение различных частей программного обеспечения используемого в Mozilla широко и разнообразно. Некоторое программное обеспечение дважды лицензировано, что означает необходимость выбора лицензии которой вы будете придерживаться. Вам необходимо прочитать Netscape Public License (NPL), the Mozilla Public License (MPL), и the GNU Public License (GPL), возможно так же потребуется прочитать несколько других лицензий для программного обеспечения лицензированного не стандартными лицензиями.

Если вы планируете построить проект на базе лицензированного программного обеспечения (открытого или нет), то в любом случае стоит проконсультироваться с адвокатом, что бы не попасть в неприятную ситуацию, как в случае с NVIDIA случайно нарушившей лицензию GPL (см. Приложения).

Начало работы с XPCOM

Предположим вам поручили разработку собственного XPCOM проекта. Здесь описано то что необходимо знать вам и любому компетентном участнику проекта. Программисты команды должны уверенно знать C и С++. XPCOM использует макросы в стиле C и шаблоны C++ для умных указателей. Кто-либо незнакомый с этими концепциями потратит кучу времени пытаясь понять исходный код Mozilla, и исходный код примеров.

Наличие опыта в области COM это большой плюс, но этого недостаточно, все равно потребуется обучение приемам кодирования (шаблоны и макросы) и утилитам разработки. Основная часть кода достаточно сложная, некоторые вещи не встречаются в жизни обычного программиста. Если повезет, вы сможете найти кого-то (возможно стороннего консультанта) с некоторым опытом работы с XPCOM, который станет наставником новичков проекта, что позволит им быстрее профессионально развиваться.

Mozilla.org прекрасный источник информации, как и новостная группа Mozilla где разработчики могут задавать технические вопросы, запрашивать обзоры кода и высказывать мнения о будущем развитии XPCOM. Реорганизация новостной группы неизбежна, но можно ожидать заблаговременного оповещения об этом на сайте.

Вот список наиболее полезных сайтов:

В дополнение к C++, вы и ваши последователи должны понимать как использовать компилятор IDL и базовый интерфейс XPCOM. Вы так же должны быть способны описать предназначение методов QueryInterface, AddRef и Release (даже если Вас разбудить ночью).

Вы должны понимать сложности компонентной агрегации. Под агрегацией понимается помещение одного компонента внутрь другого более крупного компонента, с передачей ответственности за часть интерфейса внутреннему компоненту. Это не более чем реализация сокрытия информации — одного из базовых принципов ООП. Проблемы агрегации возникают из за того что все интерфейсы XPCOM должны включать метод QueryInterface. Это значит что код использующий компонент должен уметь переключаться от одного интерфейса к другому. Это создает проблему при написании компонента наследника другого существующего компонента. Метод QueryInterface существующего компонента должен как то обработать запросы к новым (дополнительным) интерфейсам введенным наследуемым компонентом без каких либо предположений о новом коде. Это звучит неприятно, но так оно и есть.

В конечном итоге, ответственные за тестирование и качество должны понимать как писать скрипты и разбираться в JavaScript. Им так же необходимы знания: операционных систем и вашего кросс-платформенного проекта для осуществления поддержки. Их знания в области скриптов помогут создать тесты и автоматизировать регрессионное тестирование.

И все это не гарантирует успех, обладание этими навыками позволит вашей команде быть продуктивной в использовании XPCOM.

Заключение

С высоты птичьего полета мы увидели владения XPCOM — на что он способен и что необходимо знать что бы его использовать. В следующих частях мы приземлимся, возьмем образцы почвы и немного покопаемся. Произведем настройку окружения разработки, внесем функциональность XPCOM позволяющую использовать компоненты, напишем свой компонент и изучим возможности специального и систематического регрессионного тестирования  на базе JavaScript.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s