2013-11-26 4 views
16

Надеюсь, этот вопрос не будет слишком расплывчатым. Читая через спецификацию COM и основную COM-книгу Don Box, есть много разговоров о «проблемах, которые разрешает COM», - и все они звучат важными, актуальными и current.COM в мире, отличном от Windows?

Итак, как проблемы, с которыми обращаются адреса COM в других системах (linux, unix, OSX, android)? Я имею в виду такие вещи, как:

  • бинарную совместимость по компиляторов и версий компилятора
  • бинарный компонент повторного использования
  • компиляции приложения таких зависимостей, что он во время выполнения, а не во время загрузки из них (так что он работает даже тогда, когда зависимость отсутствует)
  • доступа к функциям библиотеки из других, помимо собственного
  • достаточно низко над головой удаленной процедуры библиотеки языков вызовов компонентов, загруженных в адресном пространстве другого процесса
  • и т.д. (я уверен, что этот список можно продолжить)

Я в основном просто пытаюсь понять, почему, например, на Linux CORBA не вещь, как COM является вещь на Windows, (если это делает любой смысл). Может ли разработка программного обеспечения на Linux подписаться на другую философию, чем на основе компонентов, предложенной COM?

И, наконец, COM - это C/C++ вещь? Несколько раз я сталкивался с комментариями людей, говорящих о том, что COM был «устаревшим» .NET, но без объяснения того, что они имели в виду.

+0

https://en.wikipedia.org/wiki/D-Bus предоставляет несколько вещей, которые делает COM (позволяя одному компоненту разговаривать с другим) на linux, хотя совершенно по-другому. – jcoder

ответ

13

На данный момент рассмотрим Linux.

Для Linux первые два пункта имеют относительно низкую релевантность. Большинство программных продуктов с открытым исходным кодом, и многие пользователи привыкли строить из источника в любом случае. Для таких пользователей двоичная совместимость/повторное использование мало или вообще не имеет последствий (на самом деле многие пользователи могут отклонить все программное обеспечение, которое не распространяется в форме исходного кода).

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

Это, прежде всего, поддержка разных уровней цен. Когда программное обеспечение бесплатное, есть только одна цена и одна версия: awesome edition.

Доступ к библиотечным функциям между языками снова больше основан на исходном коде вместо двоичного интерфейса, например, с использованием SWIG, чтобы разрешить использование исходного кода на C или C++ с таких языков, как Python и Ruby. Опять же, COM в основном устраняет проблему, которая возникает в основном из-за отсутствия исходного кода; при использовании программного обеспечения с открытым исходным кодом проблема просто не возникает для начала.

Низкопрофильный RPC для кодирования в других процессах, похоже, в основном связан с программным обеспечением с закрытым исходным кодом. Когда/если вы хотите, чтобы Microsoft Excel мог использовать некоторые внутренние «вещи», например, в Adobe Photoshop, вы используете COM, чтобы они могли общаться. Это добавляет дополнительные накладные расходы и дополнительной сложности, но когда одна из частей кода принадлежит Microsoft, а другая - Adobe, это в значительной степени то, за что вы застряли.

В программном обеспечении с открытым исходным кодом, однако, если проект A имеет некоторые функциональные возможности, которые полезны в проекте B, то, что вы, скорее всего, увидите, является (не более) вилкой проекта A, чтобы превратить эту функциональность в библиотеку, которая затем привязаны как к остальной части проекта A, так и к проекту B, а также, возможно, проекты C, D и E - все, не налагая накладные расходы COM, сквозные RPC и т. д.

Теперь, «Не пойми меня неправильно: я не пытаюсь выступать в качестве представителя программного обеспечения с открытым исходным кодом, и не сказать, что закрытый источник ужасен, а с открытым исходным кодом всегда значительно выше. Что я сказал am, так это то, что COM определен в основном на двоичном уровне, но для программного обеспечения с открытым исходным кодом люди обычно имеют дело скорее с исходным кодом.

Редактировать: Возможно, я должен добавить, что SWIG был всего лишь одним из примеров нескольких инструментов, поддерживающих кросс-языковые разработки на уровне исходного кода. Хотя SWIG широко используется, COM отличается от него одним довольно важным способом: с COM вы определяете интерфейс на одном нейтральном языке, а затем генерируете набор языковых привязок (прокси и заглушки), которые соответствуют этому интерфейсу. Это сильно отличается от SWIG, где вы напрямую сопоставляетесь с одного источника на один целевой язык (например, привязки для использования библиотеки C из Python).

В мире с открытым исходным кодом есть также инструменты для определения интерфейса на языке определения нейтрального интерфейса, а затем сгенерируйте привязки для определенных языков из этого определения интерфейса. CORBA хорошо известна, но обычно рассматривается как большая и сложная, поэтому фактическое использование довольно минимально. Apache Thrift предоставляет некоторые из тех же общих возможностей, но в более простой, более легкий вес. В частности, когда CORBA пытается предоставить полный набор инструментов для распределенных вычислений (в комплекте со всем, от аутентификации до распределенного времени), Thrift гораздо более внимательно следит за философией Unix, пытаясь удовлетворить только одну потребность: создавать прокси и заглушки из определение интерфейса (написанное на нейтральном языке). Если вы хотите, чтобы сделать эти вещи, подобные CORBA, с помощью Thrift, вы, несомненно, можете, но в более типичном случае создания внутренней инфраструктуры, где вызывающий и вызывающий доверяют друг другу, вы можете избежать множества накладных расходов и просто продолжать бизнес под рукой.

+0

Интересная перспектива. –

+5

Преимущество общего стандарта, такого как COM, над такими вещами, как SWIG и JNI, заключается в том, что это решение O (N) вместо решения O (N * N), учитывая N языков. (Это фактически не связано с исходным и двоичным) – MSalters

+0

Это действительно интересно, весь открытый/закрытый исходный аспект не упоминался ни в одном из чтения COM, которое я сделал до сих пор, и это имеет большой смысл. Тем не менее, это не редкость (не так ли?) Иметь двоичный файл с зависимостями времени загрузки от общих объектов, которые он ожидает найти (уже скомпилированные) в вашей системе (в/lib или/usr/lib), даже когда вы компилируете сам проект из источника. Запуск ldd в исполняемом файле может показать, что это зависит от таких вещей, как libc.so, libtinfo.so, libdl.so, libpthread.so и т. Д. Не было бы проблем с связыванием, если версия вашего компилятора была несовместимой? –

4

В мире Linux чаще всего разрабатываются компоненты, которые статически связаны или выполняются в отдельных процессах и обмениваются сообщениями (возможно, JSON или XML) взад и вперед.

Некоторые из этого обусловлены традициями. Разработчики UNIX делали такие вещи задолго до того, как существовали CORBA или COM. Это «путь UNIX».

Как говорит Джерри Коффин в своем ответе, когда у вас есть исходный код для всего, двоичные интерфейсы не так важны, и на самом деле просто сделать все сложнее.

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

CORBA никогда не попадала в мир с открытым исходным кодом, поскольку первоначальные реализации были проприетарными и дорогостоящими, и к тому времени были доступны высококачественные бесплатные реализации, спецификация была настолько сложной, что никто не хотел ее использовать, если они Это не требуется.

+0

Спасибо. Любопытно, хотя в отношении того, что вы говорите о компьютерах, намного быстрее, поэтому не нужно загружать компоненты в пространство процессов приложения по соображениям производительности - будет ли проблема производительности еще не актуальной (и, возможно, даже более) для мобильных устройств с ограниченной оперативной памятью ? или где сохранение циклов ЦП (путем запуска собственного кода) может помочь сократить время автономной работы? –

+0

Даже дешевый смартфон во много раз более мощный, чем компьютер 1990-х годов. Использование собственного кода по-прежнему важно в некоторых приложениях (например, в 3D-играх), но динамическая загрузка компонентов из нескольких поставщиков не является обычным явлением в таких приложениях. Приложения для Android запускаются на виртуальной машине; Приложения iOS используют объектно-ориентированную среду выполнения. Многие приложения для смартфонов на самом деле представляют собой только просмотры веб-страниц с использованием пользовательских интерфейсов на основе HTML/CSS с кодом Javascript. –

5

Быстрый ответ на последний вопрос: COM еще не устарел. Почти все в мире Microsoft основано на COM, включая движок .NET (CLR) и включает в себя новый Windows 8.x Windows Runtime.

Вот что говорит Microsoft о .NET в нем последние C++ страниц Welcome Back to C++ (Modern C++):

C++ переживает ренессанс, потому что власть короля снова. Языки, такие как Java и C#, хороши, когда производительность программиста важна, но они показывают свои ограничения, когда мощность и производительность имеют первостепенное значение. Для высокой эффективности и мощности, особенно на устройствах , которые имеют ограниченное оборудование, ничто не сравнится с современным C++.

PS: что-то вроде шока для разработчика, который инвестировал более 10 лет на .NET :-)

+0

re: C++ вернулась - да, это, казалось, в значительной степени тема на конференции C++ и Beyond в этом году. тоже рад, мне очень нравится C++; re: COM не устарел - да, видите, это точно, что я думал об этом, но поиск «объектной модели компонента» дает удивительно мало результатов, которые не являются MSDN или некоторым университетским курсом PDF; поиск чего-то более конкретного, например «register com object», еще менее плодотворен, и ограничение ваших поисков в прошлом году практически не дает результатов; поэтому я был заинтригован: почему интернет не говорит о COM? следовательно, вопрос .. –

+0

Дело в том, что в мире Microsoft .NET был стандартом для большинства разработок за последние 10 лет или около того, и хотя COM всегда был под прикрытием, он не был действительно заметен. Управляемый C++ или C++/CLI никогда не получал тот же успех, что и C# (частично потому, что они были расширениями для Microsoft), а возможности взаимодействия (P/Invoke, COM или нет) CLR действительно хороши. Действительно, в Windows Runtime Windows 8.x это все еще не очень заметно, поскольку для большинства языков есть система проекции/привязки, включая javascript. –

+0

Ваши первые два предложения связаны друг с другом.Вы имели в виду «далеко не устаревший» (то есть совсем не устаревший), а не «все, кроме устаревшего» (то есть не полностью устарели, но почти)? –

1

В значительной степени, проблемы, решаемые COM просто игнорируются на Linux ,

Верно, что двоичная совместимость менее важна, когда у вас есть исходный код. Однако вам все равно придется беспокоиться о модуляции и управлении версиями. Если две разные программы зависят от разных версий одной и той же библиотеки, вам нужно как-то ее поддерживать.

Тогда есть случай такая же программа, используя различные версии той же библиотеки. Это часто полезно при работе с крупными устаревшими программами, где обновление может быть слишком дорогостоящим, но вы все равно хотите использовать новые функции. С COM старые части программы можно просто оставить в покое, так как новые версии библиотек легче сделать обратно совместимыми.

Кроме того, необходимость компиляции из источника вместо бинарной совместимости - огромная проблема. Особенно, если вы на самом деле разрабатываете программное обеспечение, поскольку двоичная несовместимость означает, что вам приходится перекомпилировать гораздо чаще. Если одна маленькая часть изменяется в большой программе на C++, вам может потребоваться перекомпиляция 30 минут. Если разные части совместимы, необходимо перекомпилировать только измененную часть.

Смежные вопросы