java - Vinculación de idiomas




c++ python (6)

Hice una pregunta anterior sobre qué idioma usar para un prototipo de IA. El consenso parece ser que si quiero que sea rápido, necesito usar un lenguaje como Java o C ++, pero Python / Perl / Ruby sería bueno para los bits de la interfaz.

Entonces, esto me lleva a otra pregunta. ¿Qué tan fácil es vincular estos idiomas? ¿Y qué combinación funciona mejor? Entonces, si quería tener un programa tipo CGI de Ruby que llamara a las funciones C ++ o Java AI, ¿es fácil de hacer? ¿Alguna sugerencia para buscar información sobre cómo hacer ese tipo de cosas? ¿O una combinación diferente sería mejor?

Mi principal experiencia con la escritura de aplicaciones web comenzó con C ++ CGI y luego pasé a los servlets de Java (hace unos 10 años) y luego, después de un largo intervalo de programación, hice algo de PHP. Pero no he tenido la experiencia de escribir una aplicación web en un lenguaje de scripting que luego llama a un lenguaje compilado para los bits de velocidad crítica. ¡Así que cualquier consejo será bienvenido!


En primer lugar, un comentario meta: recomendaría encarecidamente codificar todo en un lenguaje de alto nivel, perfilar como loco, y optimizar solo cuando los perfiles lo muestren necesario. Primero optimice el algoritmo, luego el código, luego piense en traer el hierro pesado. Tener un algoritmo óptimo y un código limpio facilitará las cosas cuando / si necesita volver a implementar en un idioma de nivel inferior.

Hablando en Python, IronPython / C # es probablemente la ruta de optimización más fácil.

CPython con C ++ es factible, pero creo que C es mucho más fácil de manejar (pero no tan fácil, ya que es C). Dos herramientas que facilitan esto son cython / pyrex (para C) y shedskin (para C ++). Estos compilan Python en C / C ++, y desde allí se puede acceder a bibliotecas C / C ++ sin demasiado preámbulo.

Nunca he usado jython, pero escuché que la ruta de optimización de jython / Java no es tan mala.


Estoy de acuerdo con la Idea de codificación primero en un lenguaje de alto nivel como Python, Profiling y luego Implementación de cualquier código que necesite aceleración en C / C ++ y envolviéndolo para usarlo en el lenguaje de alto nivel.

Como una alternativa para impulsar, me gustaría sugerir que SWIG cree un código invocable de Python desde C. Es bastante fácil de usar y compilará módulos invocables para una amplia gama de idiomas. (Python, Ruby, Java, Lua., Por nombrar algunos) del código C.

El proceso de envoltura es semiautomático, por lo que no es necesario agregar nuevas funciones al código C base, lo que facilita el flujo de trabajo.


Puede construir su programa en uno de los lenguajes de nivel superior, por ejemplo Python o Ruby, y luego llamar a los módulos compilados en el idioma de nivel inferior para las partes que necesita rendimiento. Puede elegir una plataforma dependiendo del idioma de nivel inferior que desee.

Por ejemplo, si desea hacer C ++ para las cosas rápidas, puede usar simplemente Python o Ruby y llamar a las DLL compiladas en C ++. Si desea usar Java, puede usar Jython o uno de los otros lenguajes dinámicos en la plataforma Java para llamar al código Java, esto es más fácil que la ruta C ++ porque tiene una máquina virtual común para que un objeto Java pueda usarse directamente. en Jython o JRuby. Lo mismo se puede hacer en la plataforma .Net con Iron-languages ​​y C #, aunque parece que tienes más experiencia con C ++ y Java, por lo que esas serían mejores opciones.


Puede ser un buen enfoque comenzar con un script y llamar a un lenguaje basado en compilación desde ese script solo para necesidades más avanzadas.

Por ejemplo, llamar a Java desde el script de ruby funciona bastante bien.

require "java"
# The next line exposes Java's String as JString
include_class("java.lang.String") { |pkg, name| "J" + name }
s = JString.new("f")

Si el dominio del problema es difícil (y los problemas de IA a menudo pueden ser difíciles), primero elegiría un lenguaje expresivo o adecuado para el dominio, y luego me preocuparé por acelerarlo en segundo lugar. Por ejemplo, Ruby tiene primitivas de metaprogramación (capacidad para examinar y modificar fácilmente el programa en ejecución) que pueden hacer que sea muy fácil / interesante implementar ciertos tipos de algoritmos.

Si lo implementa de esa manera y luego necesita acelerarlo, puede utilizar la evaluación comparativa / el perfil para localizar el cuello de botella y vincularlo a un lenguaje compilado para eso, u optimizar el algoritmo. En mi experiencia, la mayor ganancia de rendimiento proviene de ajustar el algoritmo, no de usar un lenguaje de implementación diferente.


Tengo una perspectiva diferente, he tenido mucha suerte con la integración de C ++ y Python para el procesamiento de imágenes de video en vivo en tiempo real.

Yo diría que debe hacer coincidir el idioma con la tarea de cada módulo. Si está respondiendo a una red, hágalo en Python, Python puede mantenerse al día con el tráfico de la red. IU: Python, las personas son lentas y Python es ideal para UI que usan wxPython o PyObjC en Mac o PyGTK. Si está haciendo cálculos en muchos datos, procesamiento de señales o procesamiento de imágenes ... codifíquelo en C o C ++ con pruebas unitarias, luego use SWIG para crear el enlace a cualquier lenguaje de nivel superior.

Usé las bibliotecas de imágenes en wxWidgets en mi C ++, que ya están expuestas a Python a través de wxPython, por lo que fue extremadamente potente y rápido. SCONS es una herramienta de compilación (como make) que sabe qué hacer con los archivos .i de swig.

El nivel más alto puede estar en C o Python, tendrás más control y menos problemas de empaquetado y despliegue si el nivel superior está en C o C ++ ... pero tomará mucho tiempo duplicar lo que Py2EXE o Py2App te brindan en Windows o Mac (o congelado en Linux)

¡Disfruta el poder de la programación híbrida! (Llamo el uso de múltiples idiomas de una manera estrechamente acoplada 'híbrida', pero es solo una peculiaridad mía).





perl