2009-06-06 12 views
9

Me he enamorado de la programación basada en componentes (ya sea con COM, otro sistema o simplemente usando el paradigma en C++). Requiere un poco de tiempo acostumbrarse, si uno se usa habitualmente para el modelo OOP "tradicional", pero definitivamente vale la pena. Ha hecho que mi código sea más fácil de mantener y más fácil de extender.Alternativa multiplataforma a COM

El proyecto en el que estoy trabajando actualmente usa el paradigma, pero no establece un sistema. Sin embargo, realmente me gustaría encontrar algún tipo de sistema que pueda usar con los siguientes requisitos. Cambiar de lo que tengo ahora a un nuevo sistema tomaría un poco de tiempo, pero ahorraría un múltiplo de ese tiempo más tarde.

Los requisitos:

  1. multiplataforma
  2. rápido
  3. funciona bien con C++
  4. Soporta entre procesos de clasificación

Permítanme desarrollar en esos requisitos:

multiplataforma

Básicamente, lo necesito para trabajar en Windows y Mac. Linux sería bueno, pero no es de ninguna manera esencial. Además, realmente necesita cumplir los otros requisitos para todas las plataformas. Hay un COM para Mac, que sería ideal pero no es compatible con el requisito 4. Además, debe ser compatible tanto con GCC como con MSVC.

rápido

Aquí es donde CORBA lamentablemente pierde, a pesar de que cumple con los otros tres requisitos. Las llamadas a métodos en proceso deben ser lo más rápidas posible (idealmente, como COM), ya que algunas de las rutinas también pueden ser llamadas desde una interrupción de audio.

funciona bien con C++

... Creo que éste es sobre todo evidente. No me importa no utilizar clases de C++ para implementar componentes, aunque eso definitivamente sería útil, y la alternativa debe ser fácil de usar, especialmente dado que con el tiempo tengo la intención de lanzar una API para extensiones de terceros.

Soporta cruzada proceso de cálculo de referencias

Con esto quiero decir, al menos, ser capaz de serializar las llamadas. Si esto se hace a través del código generado desde un IDL, eso está perfectamente bien conmigo, y tampoco me importa implementar la comunicación de proceso cruzado en sí.

COM sería genial, pero no cumple el requisito 1 por completo. CORBA también sería genial, pero no cumple con el requisito 2 (incluso con el ORB más rápido disponible). Es posible que XPCOM no cumpla con el requisito 2 y que no funcione con MSVC, por lo que no cumple con el requisito 1.

¿Alguna idea de qué más hay disponible? Mi próximo paso sería hacer mi propio uso de protobufs o algo similar, pero por supuesto me gustaría evitar eso.

actualización

Elaborar - una interrupción de audio en este contexto puede ser tan bajo como 2-3ms. Ese tiempo ni siquiera está disponible en mi totalidad, ya que otros componentes necesitan procesarse en ese momento, y mi propio software está envolviendo otra pieza de software que necesita procesar en ese momento. Esta es la razón por la cual tanto la clasificación en proceso como la del proceso cruzado deben ser extremadamente rápidas.

+0

XPCOM debería funcionar con MSVC, AFAIK. Además, si no es así, ¿no podrías usar MinGW? – Zifre

+0

Podría usar MinGW, pero por mi parte, toda mi cadena de herramientas está integrada con MSVC, y aunque puedo integrar MinGW en eso también, no puedo usar el maravilloso depurador en MSVC. – arke

+0

Creo que si construyes esto ganarás mucho dinero. En proceso, fuera de proceso, pc, mac, linux, increíblemente rápido. Mucho dinero. :) –

Respuesta

2

CORBA sin duda sería una respuesta: debe probarlo antes de descartarlo en función de la velocidad.

Una alternativa definitiva sería XPCOM http://en.wikipedia.org/wiki/XPCOM - la falta de MSVC no significa que no sea multiplataforma.

buena suerte

+1

¿Puede recomendar una implementación de ORB? Intenté encontrar una página web que comparara diferentes ORB basados ​​en la velocidad, para ver si hay uno que sea lo suficientemente rápido, pero no he tenido suerte con eso. – arke

+1

Realmente no desea usar CORBA si puede evitarlo, créame en este caso. –

+1

TAO, "The ACE Orb" http://www.cs.wustl.edu/~schmidt/TAO.html es una implementación muy respetada. – sdg

3

Para conseguir la máxima amplitud, yo sólo tiene que utilizar los servicios web. Un enfoque orientado a los servicios está muy cerca de un enfoque orientado a los componentes, ya que solo los contratos de servicios (interfaces) están expuestos, y los clientes no deben conocer ningún detalle del funcionamiento interno del servicio.

+0

Sus requisitos de rendimiento probablemente impidan eso como una opción (aunque estoy de acuerdo, un servicio basado en HTTP de cualquier tipo es un buen comienzo). – Tom

+1

De hecho, si bien suena bien en principio, el requisito de ejecutar esto en una interrupción de audio simplemente no hace que esto sea factible, desafortunadamente. – arke

+0

No vi el requisito de interrupción. Sorprendido de escuchar que hay una implementación de COM que puede manejar eso. –

0

Tome un vistazo a la AF Architecture:

"Af-Arch es un conjunto completo de bibliotecas y herramientas que permite desarrollar el sistema Distribuida especialmente diseñado para hacer frente a los problemas de aplicaciones de bussiness"

Sé que funciona con Linux y Windows. También sé que tiene una API muy rápida C y enlaces C# para ello.

+0

Parecía atractivo al principio, pero esto de alguna manera me desalentó: "El modelo de programación Af-Arch consiste en un sistema cliente-servidor TCP basado en un intercambio de mensajes con formato XML sobre el protocolo BEEP Core. ". Me temo que esto no cumplirá con mis requisitos de velocidad. : / – arke

1

¿Por qué crees que CORBA no es lo suficientemente rápido? ¿Has medido las cosas recientemente?

Las implementaciones modernas de CORBA pueden realizar llamadas remotas en menos de 150 usos. Muy por debajo de su presupuesto de 2 meses. Las implementaciones modernas de CORBA pueden optimizar las llamadas en proceso básicamente a dos llamadas a funciones virtuales, aunque eso generalmente requiere que la aplicación prescinda de algunas características (por ejemplo, interceptores). Incluso un asistente completo en el peor de los casos, las llamadas locales son un par de búsquedas + algunas llamadas virtuales, no tengo números a mano, pero estoy seguro de que está por debajo de 50 usos.

mira esto para algunos números de rendimiento:

http://www.dre.vanderbilt.edu/Stats/performance.shtml

1

Usted dice CORBA sería grande. Solo puedo suponer que nunca lo has usado. Está programando una noche y no ofrece la portabilidad que reclama. Solo lo usaría si una aplicación existente ya lo implementó. Sin embargo, no lo descartaría por motivos de rendimiento: nunca he experimentado ningún problema de rendimiento con ninguna de las implementaciones de CORBA que he utilizado.

3

ICE de ZeroC http://www.zeroc.com/ es otra alternativa.

Para los veteranos de CORBA, Michi Henning fue uno de los gurús de la época. Él ahora está con ZeroC. Es un sistema de código abierto, multiplataforma, que incluye todos sus objetivos (incluido Linux).

C++ es solo uno de los idiomas, y los enlaces CEL de ICE son significativamente mejores que los enlaces de CORBA C++.

1

Eche un vistazo a D-Bus (sí, para windows too), que es el heredero espiritual moderno de varios marcos de componentes (CORBA, Gnome Bonobo, DCOM de KDE).

Si el mapeo de procesos cruzados resulta ser un problema de rendimiento, busque mover la carga pesada a la memoria compartida (boost.interprocess lo ayudará a mantenerlo multiplataforma).

0

Creo que debería echar un vistazo a VortexLibrary.

Es una implementación completa de BEEP que proporciona una buena base para desarrollar cualquier protocolo de aplicación punto a punto. Ya integra la autenticación (usando SASL) y las conexiones seguras (usando TLS), ambos opcionales.

Vortex también incluye una implementación del perfil XML-RPC con un compilador IDL que debe proporcionarle los cimientos suficientes para la recopilación de datos .... y lo mejor es que luego puede proporcionar un protocolo más particular, en al principio de la misma sesión, para hacer una transferencia binaria sin estar limitado por XML-RPC.

Está programado con C pero también funciona con C++. Actualmente se está ejecutando, con pruebas de regresión que garantizan su funcionamiento en Linux, Windows y MAC.

¡Salud!

2

¿No debería Qt ser una alternativa?

http://qt.io

AFAIKT se puede usar al menos en: de Windows | Mac | Linux/X11 | Solaris | Embedded Linux | Windows Embedded | Green Hills Software INTEGRIDAD | QNX | VxWorks

Eso es bastante en mi humilde opinión.