¿Cómo interactuar dos programaciones diferentes con dos idiomas diferentes?

26

No sé si esto es demasiado amplio o no, pero todavía soy un programador joven en la universidad, es mi tercer año. Siento que tengo una buena comprensión de diferentes idiomas y una buena base. Pero me tropiezo al pensar cómo, por ejemplo, si estoy tratando de crear un programa y digo que escribí una parte en Python solo porque es fácil y hace el trabajo, pero este programa necesitaría obtener resultados de otro programa que escribí en C y estoy usando C debido a su velocidad. No estoy seguro de cómo hacer que los dos programas e idiomas diferentes interactúen entre sí para crear un programa total en general. Estoy seguro de que puedes escribir en un archivo, pero entonces, ¿qué pasaría si los programas python y C acceden a un archivo? Necesito pensar en bloqueos.

La mayoría de las veces que hice esto fue con la importación de archivos en un programa, pero en ese caso son del mismo idioma, así que es fácil, solo uso la función de importación, pero con dos idiomas / programas interactuando para crear una salida coherente, estoy teniendo problemas .

Estaba pensando en esta pregunta porque estaba pensando en sumergirme en la creación de algunas aplicaciones web básicas solo para aprender, pero no tengo idea de cómo decir que el archivo javascript sea interactivo con algo que escribí en python o viceversa.

Siento que me estoy perdiendo algo realmente fácil aquí y simplemente no lo entiendo. Lo siento si esta pregunta es demasiado amplia, pero realmente no pude encontrar una respuesta clara en línea, estaba tratando de mirar a través de una aplicación web de código abierto, pero realmente no pude obtener una respuesta, perdóneme si la pregunta parece tonta, pensé este es un buen lugar para preguntar Me encanta leer en stackexchange.

Gracias por cualquier respuesta

Anatoly Torchinsky
fuente
Sé que hay Swig , parece hacer lo que quieres, pero no lo he usado. Así que lo intentas y ves :).
user712092
1
Tenga en cuenta que su pregunta contiene dos temas completamente no relacionados, uno es la comunicación general entre 2 procesos / aplicaciones en el mismo host, otro es la arquitectura habitual de servidor web / cliente, utilizando JS en el cliente y python en el servidor.
João Pinto
¿Has revisado el concepto LAMP? Puede comunicarse mucho a través de bases de datos.
SDsolar

Respuestas:

28

El código escrito en diferentes idiomas puede interactuar de varias maneras.

En el nivel fuente, se puede realizar una compilación cruzada de un idioma a otro para algunas combinaciones de idiomas (por ejemplo, el GWT de Google incluye un compilador java a javascript; el compilador Glasgow Haskell puede compilarse en C; versiones anteriores de C ++ compilado a C). La mayoría de las veces, sin embargo, esto no es realmente factible.

Los lenguajes que comparten una plataforma virtual, como el JVM o el tiempo de ejecución .NET, generalmente pueden interactuar a través de los mecanismos expuestos por la plataforma; por ejemplo, todos los lenguajes JVM pueden acceder a las bibliotecas Java y usarlas para comunicarse entre sí, y pueden llamar a métodos y usar clases creadas en cualquier otro lenguaje JVM.

Muchos lenguajes de programación, incluido Python, ofrecen un mecanismo para interactuar con bibliotecas nativas, generalmente escritas en C. Usando dicho mecanismo, es posible llamar a funciones nativas desde otro lenguaje de más alto nivel. Las bibliotecas populares a menudo tienen enlaces fácilmente disponibles. Esta técnica generalmente se conoce como una "Interfaz de función externa" . La interfaz Python-into-C es el CFFI .

Otra opción es construir dos programas completamente separados y hacer que interactúen en tiempo de ejecución. Hay varios mecanismos para lograr esto; lo más fácil es a través de una tubería (mira el subprocessmódulo para python): básicamente, un programa llama al otro, enviando información a su stdin y leyendo el resultado desde su stdout. Esto hace que un programa sea un subproceso del otro; Si necesita que ambos tengan una larga vida útil y se inicien de forma independiente, los datos se pueden pasar de un lado a otro a través de canalizaciones con nombre, sockets de red (locales), archivos compartidos y (según la plataforma) otros medios. Cuál es el mejor depende.

tdammers
fuente
Gran respuesta. Otra posibilidad es que se integre un intérprete en el programa primario, comúnmente realizado entre C ++ y Lua para el desarrollo del juego. O vea la décima regla de Greenspun: en.wikipedia.org/wiki/Greenspun%27s_tenth_rule
Andrew
11

Hay varias formas bien establecidas para que dos programas se comuniquen entre sí. Ya ha identificado uno obvio, al compartir archivos, y una dificultad obvia con él. Pero hay otras maneras.

La mayoría de los sistemas operativos modernos contienen un mecanismo llamado canalizaciones con nombre , que es básicamente un flujo de datos con su extremo de entrada en un programa y su extremo de salida en un programa diferente. Si necesita enviar datos de un programa a otro programa que se ejecuta en la misma computadora, puede ser un buen método para usar.

Si necesita configurar una API para que un programa use para llamar al otro programa, es posible que desee buscar en RPC (llamadas a procedimientos remotos), que nuevamente es compatible a nivel del sistema operativo.

Si desea comunicarse entre dos programas en dos computadoras diferentes, las cosas se vuelven más complicadas. Entonces necesita trabajar con redes y protocolos. Necesita uno de los programas para poder abrir un socket y escuchar los mensajes entrantes, decodificarlos en una llamada de método interno, procesarlos y devolver una respuesta. Hay muchas bibliotecas disponibles para proporcionar esta funcionalidad en varios lenguajes diferentes, incluidos C y Python.

Básicamente, el método que debe usar depende de los detalles de lo que está tratando de hacer. Investigue un poco sobre las diversas formas de comunicación entre procesos y mensajes de red, y debería ser capaz de descubrir qué se adapta mejor a sus necesidades.

Mason Wheeler
fuente
2

El paso de mensajes parece ser el concepto general aquí, ya que hay varios ejemplos en los que uno puede tener diferentes idiomas interactuando, por ejemplo, uno podría usar ASP clásico con componentes COM y algo de JavaScript para obtener una combinación de 3 idiomas diferentes utilizados en la misma aplicación.

En el ejemplo que declaras, ¿no serían los bloqueos algo que el sistema operativo pueda manejar en el sistema de archivos? Cada programa no sabe sobre el otro necesariamente recordar.

JB King
fuente
0

La mayoría de los componentes de software no deben comunicarse en términos de instrucciones, sino enviar y recibir datos: interactuar con una base de datos, enviar / recibir solicitudes JSON / XML, etc.

vemv
fuente
0

Dependiendo de su tipo de problema, el uso de shell estándar de las tuberías puede ser suficiente (escriba su shell):

programa1 | programa2

De esta manera, la salida del programa1 va directamente a la entrada del programa2. Por supuesto, esto no funciona para todos los problemas, pero muchos de los problemas (no interactivos) pueden resolverse bien con este enfoque.

markijbema
fuente