2012-08-02 23 views
5

Esta es una pregunta general "novato" sobre el diseño de software, por lo que me disculpo si parece vago, pero realmente agradecería el consejo. Tenga en cuenta que el sistema descrito a continuación es solo un ejemplo, no un producto específico que tengo en mente.Uso de IPC para combinar varios idiomas

A menudo tengo la necesidad de combinar la funcionalidad de varias bibliotecas o utilidades, escritas en diferentes idiomas. Por ejemplo, si deseo codificar una aplicación de procesamiento de audio de alto rendimiento para el escritorio, la escribiré en C/C++. Entonces, quiero agregar una buena GUI. Pero no quiero aprender Qt. Me gusta la apariencia de Adobe Air y me gustaría usar eso. Más tarde, tengo la necesidad de acceder a un dispositivo USB. Pero la biblioteca USB solo tengo una API en Java. ¿Cómo puedo combinar todos estos elementos para aprovechar sus puntos fuertes relativos?

Claramente, no puedo compilar estos diversos elementos en un único ejecutable. Entonces necesito crearlos y ejecutarlos por separado, y darles un medio para comunicarse. La forma más común de hacer esto parece ser el uso de IPC (Inter Process Communication), por ejemplo, memoria compartida o zócalos. Prefiero la idea de los sockets, ya que los programas podrían ejecutarse en máquinas separadas en una red.

Así que decido crear un sistema cliente/servidor local, con una API personalizada, para permitir que estos elementos se comuniquen. Por ejemplo, la aplicación Air recibirá un mensaje de la aplicación C, diciéndole que actualice su interfaz de usuario. La aplicación USB que se ejecuta en Java usará los sockets para transmitir audio desde el hardware USB a la aplicación C.

Mi pregunta: ¿está utilizando enchufes locales de esta manera una manera típica de diseñar un sistema así? ¿El rendimiento será mucho peor que el de una aplicación verdaderamente nativa (por ejemplo, todo en Java o C, en un único ejecutable)? También parece probable que ese enfoque sea propenso a errores y difícil de mantener.

Con frecuencia me encuentro frente a los límites de las bibliotecas de software existentes (por ejemplo, una biblioteca de gráficos con una interfaz de usuario bonita y flexible pero sin acceso a hardware de bajo nivel o una biblioteca multimedia que puede mezclar muchas transmisiones de audio, no tiene soporte para la reproducción de videos), y lo encuentro muy frustrante. Si alguien pudiera aconsejar la mejor manera de combinar bibliotecas de software arbitrarias como esta, realmente lo agradecería.

¡Gracias de antemano!

Respuesta

4

Como se ha identificado correctamente, la combinación de las bibliotecas de diferente idioma o plataformas es difícil. Hay varias formas de hacerlo, pero ninguna es ideal. Ejemplos:

  • interfaces de llamada nativo (por ejemplo JNI/JNA) - muy rápidos pero difíciles de hacer el trabajo correctamente, y usted tiene el problema de que los tipos de datos utilizados por lo general no se asignan limpiamente a través de diferentes plataformas. Agrega dependencias nativas
  • IPC basado en sockets con protocolo de texto (XML, JSON, etc.): funciona bien y es probable que los formatos comunes sean compatibles en ambos extremos, pero agrega una gran cantidad de sobrecarga. Puede ser un dolor de mantener las asignaciones de esquema personalizado etc.
  • Socket basado IPC con el protocolo binario (por ejemplo, tampones de protocolo de Google) - bastante eficiente, necesita mucho trabajo para conseguir un protocolo propio de funcionar correctamente en ambos extremos
  • Comunicación a través de un tercer sistema (p. ej., base de datos, cola de mensajes, sistema de archivos): una gran cantidad de sobrecarga, puede volverse frágil, introduce una gran dependencia en un tercer sistema.

En mi experiencia, por lo general no vale la pena la integración de un nuevo lenguaje/plataforma sólo para obtener una biblioteca o característica específica. Tomemos el ejemplo de su interfaz de usuario: no importa cuán agradable sea Adobe Air, dudo que valga la pena tratar de integrarlo con una aplicación existente de C/C++.

Incluso si lo hace funcionar, complicará significativamente el futuro mantenimiento y desarrollo de su aplicación. Las construcciones se vuelven más complejas. Debe mantener un código de comunicación/"pegamento" adicional. Necesita administrar más dependencias. Sus usuarios recibirán muchos más problemas de configuración. Las pruebas se vuelven más difíciles. Se vuelve más difícil enseñar a alguien nuevo acerca de cómo funciona todo el sistema. Necesita mantener sus habilidades en más idiomas/marcos, etc.

lo recomiendo la siguiente estrategia:

  1. Escoja una plataforma primaria
  2. Siempre que necesite una nueva biblioteca o característica, buscar algo en su plataforma principal en primer lugar. Afortunadamente (¿por lo general?) Hay algo bueno disponible, pero incluso si no fuera así, podría valer la pena codificar algo si el requisito es bastante pequeño.
  3. Sólo si no hay ninguna opción razonable en la plataforma principal, entonces se puede empezar a pensar en integrar un nuevo lenguaje/plataforma

En cuanto a la plataforma principal, yo sugeriría normalmente un lenguaje JVM como Java, Scala o Clojure ya que la JVM está muy bien diseñada, ofrece un gran rendimiento, es altamente portátil y tiene el ecosistema de bibliotecas más grande/más cohesivo (la mayoría de código abierto). Por lo tanto, la JVM es probablemente la mejor opción "propósito general" a menos que tenga algún requisito muy específico que es poco probable que sea posible en la JVM, por ejemplo:

  • Si usted está haciendo un montón de incrustado/en tiempo real/Wque programación de sistemas requiere acceso a hardware que probablemente necesite para C/C++
  • Si está codificando exclusivamente para clientes basados ​​en web, probablemente quiera usar JavaScript (si también está escribiendo código en el lado del servidor, puede considerar los marcos de generación de código JavaScript)/bibliotecas que pueden funcionar en la JVM, por ejemplo, Vaadin o ClojureScript)
+0

Ambas buenas respuestas, pero esta es eas más para entender Como gran parte de mi trabajo requiere C/C++, creo que puede ser seguro apostar por Qt como mi "plataforma". – darasan

2

la respuesta depende mucho de las tecnologías que esté utilizando y no hay una solución a esta situación.

En general, estas soluciones caerán en una de las siguientes categorías:

  • Algunas técnicas de comunicación entre procesos

  • integraciones proporcionadas por el lenguaje/plataforma en sí

  • base de datos/alguna almacenamiento común (incluso archivos :))

Ejemplo del primero: Sockets/pipes/lo que sea que su sistema operativo permita. CORBA - permite escribir código distribuido en diferentes idiomas. Google protobuf - permite la serialización/deserialización de objetos de datos y su lenguaje agnóstico

Por el segundo, realmente depende del idioma/ecosistema que esté utilizando. Ejemplos de Java:

  • JNI - Java Native Interface - permiten ejecutar código (DLL/SO) fuera de la JVM.
  • JCA: si se encuentra en el entorno empresarial, puede escribir la integración con los sistemas heredados en este.

Para los idiomas que se compilan en el código nativo sus menos complicado - puede escribir y compilar un código, por ejemplo en Pascal, y luego utilizar el archivo DLL en C.

A veces, cuando estamos hablando de Java existe una gran cantidad de lenguajes que tienen su propia sintaxis y compilador, pero su compilador se compila en código binario java que se puede ejecutar dentro de jvm. Entonces, si su solución se basa en estos idiomas, la integración será más fácil. Los lenguajes como Scala, Groovy, Closure, Jython, etc. entran en esta categoría.

La última pero no menos importante tecnología a mencionar son los servicios web. Esta es una herramienta muy popular para la integración de diferentes sistemas, aunque es más utilizada en entornos empresariales. Básicamente es una abstracción sobre la capa de sockets que permite enviar objetos de datos en formato XML/JSON entre los procesos/servidores. Tanto XML como JSON son independientes del idioma, por lo que no es un problema crear un XML en un programa escrito en C++ y luego consumirlo en JAVA.

Esperanza esto ayuda

Cuestiones relacionadas