Есть ли эквивалент в COM в *nix системах? Если нет, то каков *nix подход к повторному использованию?
У меня есть понимание окон COM и идей, стоящих за ним. Я пытаюсь понять, есть ли у систем *nix даже эквивалент или почему их нет?
3 ответа
Модель Unix построена на идее легких процессов, которые взаимодействуют друг с другом через сокеты, каналы, сигналы и командные строки. Исторически в Unix не было потоков (модель потоков POSIX IIRC всего около 10 лет), но процессы в Unix всегда были намного дешевле, чем в Windows, поэтому было удобнее разделять функциональность на отдельные исполняемые файлы, чем разрешать Единая программа для выращивания больших и монолитных.
В COM вы определяете двоичные интерфейсы, которые разрешают обмен данными с общей памятью. COM привязан к объектно-ориентированной парадигме. В классической модели Unix вы определяете потоково-ориентированные интерфейсы, которые обеспечивают связь по каналам без разделяемой памяти. Концептуально это намного ближе к парадигме функционального программирования.
Модель Unix поощряет создание небольших программ, которые могут быть легко объединены с помощью облегченной "оболочки", в то время как модель COM поощряет создание больших программ, которые предоставляют "компоненты", которые могут повторно использоваться другими большими программами. Это действительно сравнение яблок и апельсинов, так как обе модели дают преимущества и недостатки для разных сценариев.
Конечно, современные Unix-системы могут иметь COM-подобные возможности. Mozilla имеет XPCOM, кроссплатформенную инфраструктуру, основанную на тех же принципах, что и COM. В GNOME долгое время использовался Bonobo, который концептуально очень похож на Microsoft OLE, который был предшественником COM. Но последние версии GNOME отошли от Bonobo в пользу D-Bus, который является скорее шаблоном событий / обмена сообщениями.
Ближайшим, вероятно, будет D-Bus. D-Bus - это легкий протокол IPC и Object Request Broker (ORB), очень похожий на COM и вдохновленный предшественниками COM и D-Bus DCOP (KDE) и CORBA (GNOME), а также Netlink (ядро Linux).
До D-Bus обе основные среды рабочего стола Unix имели свои собственные модели компонентов и настольные шины. У GNOME был Bonobo, основанный на CORBA, а в KDE был KParts, основанный на DCOP. А в ядре Linux есть Netlink, который является протоколом связи между ядром и пользовательским пространством, который используется, например, iproute2
инструмент всякий раз, когда вы настраиваете сетевой интерфейс.
Разработчики ядра постоянно получали запросы на выпуск Netlink в качестве отдельной части для взаимодействия между программами пользовательского пространства, однако они опасались, что это приведет к раздутию функций и проблемам обслуживания. В конце концов, под эгидой организации Free Desktop, целью которой является создание кросс-десктопных стандартов, разработчики KDE и GNOME собрались вместе, чтобы разработать систему обмена сообщениями IPC, основанную на лучших частях DCOP и Netlink, и результат был D-Bus.
В текущих версиях GNOME и KDE D-Bus полностью заменил CORBA и DCOP, что позволило запускать приложения GNOME в KDE и наоборот с гораздо более высокой точностью. D-Bus также использовался многими другими рабочими средами и приложениями не только в Linux, но и в других системах Unix, а также в OSX и даже в Windows.
Альтернативой, которую следует хотя бы упомянуть, является Mozilla XPCOM, представляющая собой кроссплатформенную объектную модель, в значительной степени вдохновленную CORBA и COM. (На самом деле XPCOM является аббревиатурой для кроссплатформенной объектной модели компонентов.) Он использует IDL, очень похожий на CORBA, называемый XPIDL. Однако, насколько мне известно, никто на самом деле не использует XPCOM, его признают как критики, так и разработчики Firefox и других приложений Mozilla как один из основных источников вздора, и разработчики Mozila фактически активно работают над сокращением использования XPCOM особенно внутри таких компонентов, как Gecko.
Однако, как отмечает @Daniel Pryden, в Unix уже есть много вещей, которые следует отдавать предпочтение D-Bus в тех случаях, когда тесная интеграция с рабочим столом не требуется. Я говорю о таких вещах, как трубы, именованные трубы и сокеты.