¿Cómo codificaría un motor de IA para permitir la comunicación en cualquier lenguaje de programación?

8

Desarrollé un juego de mesa para iPhone de dos jugadores. Los jugadores de computadora (AI) pueden ser locales (en el código del juego) o remotos en un servidor. En el segundo caso, tanto el código del cliente como el del servidor están codificados en Lua. En el servidor, el código AI real está separado del código de socket TCP y del código de rutina (que genera una instancia separada de AI para cada cliente que se conecta).

Quiero poder aislar aún más el código AI para que esa parte pueda ser un módulo codificado por cualquier persona en su idioma de elección. ¿Cómo puedo hacer esto? ¿Qué técnicas / tecnología permitirían la comunicación entre el socket Lua TCP / código de rutina y el módulo AI?

TokyoDan
fuente
me viene a la mente swig.org ..
Jari Komppa
swig es c / c ++ a otros idiomas. Lua a otros idiomas necesita una ruta diferente.
David Young

Respuestas:

8

Se puede usar un esquema de mensajería basado en sockets para permitir que cualquier lenguaje arbitrario interactúe con la IA. Puede usar mensajes basados ​​en binarios, xml, texto, etc. Simplemente defina claramente cuál es el formato del mensaje y qué mensajes enviará y recibirá.

Esta técnica funciona relativamente bien para un manejo de comunicación ligero a modesto. Hay una penalización de latencia asociada, por supuesto, pero dado que su juego es un estilo de juego de mesa, no tiene que ejecutarse en tiempo real.

David Young
fuente
Ya estoy usando sockets para mover la IA del servidor de IA al cliente iOS. Todo está en Lua. Quiero saber cómo una rutina AI, codificada en Python, por ejemplo (en el servidor) podría comunicarse con la rutina de socket Lua (en el servidor). Por ejemplo, la IA de Python envía su movimiento a la rutina de socket Lua que luego usa el socket TCP para retransmitir el movimiento al cliente iOS.
TokyoDan
Responde a continuación, pero la comunicación de socket a socket se puede utilizar para comunicarse entre dos procesos o programas en la misma computadora. De la misma manera que dos programas que se comunican por internet. Excepto que no necesita todo ese manejo de TCP / IP.
David Young
0

Para cualquier lenguaje X, no puede saber qué función de interoperabilidad tiene o no tiene; no se espera que ningún idioma proporcione ninguna característica de interoperación. El más confiable es el estilo C, ya que es (casi seguro) lo que usa su sistema operativo, aunque esto no significa que el lenguaje lo exponga realmente.

Quizás el más independiente estaría usando una canalización con nombre provista por el sistema operativo y enviando, por ejemplo, mensajes XML. Sin embargo, esto es un poco extremo, la mayoría de los esquemas de encapsulación no llegan a encapsular el lenguaje de autoría.

DeadMG
fuente
Las tuberías son un enfoque útil, especialmente si desea probar algo rápido y sucio. Sin embargo, no es muy escalable y mucho más lento que la comunicación directa de socket a socket.
David Young
Tal vez me estoy perdiendo algo. Soy nuevo en esto. Pensé que los enchufes se usaban para obtener información de una computadora a otra computadora en algún lugar de la red. ¿Los sockets también se pueden usar para la comunicación entre dos programas / procesos / corutinas que se ejecutan en la misma computadora?
TokyoDan
¡Sí! básicamente se está comunicando a través de un socket localhost que en realidad no se enrutará fuera de la tarjeta ethernet. Con la comunicación por socket, podría estar hablando con otro programa en la misma computadora u otro programa en una computadora diferente. Se maneja exactamente igual.
David Young
Gracias. Incluso si esto es posible, la rutina de AI no Lua tendría que codificar las rutinas de comunicación de socket. Quiero alejarme de esto. Solo quiero que la IA que no sea Lua envíe una cadena como "Mover P1 a X Y" a mi código de socket Lua en el servidor. El código de socket Lua retransmitirá la cadena al cliente iOS.
TokyoDan
Puede intentar usar Tuberías directamente entonces. Deje que su servidor Lua genere un proceso secundario que es su programa de IA que no es Lua. Puede comunicarse con el proceso hijo a través de sus tuberías de entrada y salida. lua-users.org/wiki/ExtensionProposal
David Young