La mezcla de lenguajes de programación diferentes ha sido algo que no entiendo muy bien. De acuerdo con this Wikipedia article, una interfaz de función extranjero (o FFI) se puede hacer de varias maneras:Comprender la interfaz de función externa (FFI) y la vinculación de idioma
- Exigir que las funciones de huéspedes de lenguaje, todas para ser anfitrión de lengua exigible especificarse o aplique de una manera particular; a menudo usando una biblioteca de compatibilidad de algún tipo.
- Uso de una herramienta para "ajustar" automáticamente las funciones del lenguaje de invitado con el código de pegamento adecuado, que realiza la traducción necesaria.
- Uso de las bibliotecas contenedoras
- Restricción del conjunto de capacidades de lenguaje de sistema principal que se pueden usar en varios idiomas. Por ejemplo, las funciones de C++ llamadas desde C pueden no incluir (en general) parámetros de referencia o lanzar excepciones.
Mis preguntas:
- ¿Cuáles son las diferencias entre las formas 1ª, 2ª y 3ª? Parece que me están compilando el código de el lenguaje llamado en alguna biblioteca con archivos de objetos y archivos de encabezado , que luego son llamados por el lenguaje de llamada .
One source it links dice, la implementación de un FFI se puede hacer de varias maneras :
- que requieren las funciones llamadas en el idioma de destino implementar un protocolo específico .
- La implementación de una biblioteca envoltorio que tiene una determinada bajo la lengua función, y "envuelve" con código para hacer la conversión de datos a/desde los convenciones del lenguaje de alto nivel.
- Requiere funciones declaradas nativas para usar un subconjunto de funcionalidad de alto nivel (que es compatible con el lenguaje de bajo nivel).
Me preguntaba si la primera forma en la fuente vinculada es la misma que la primera forma en Wikipedia?
¿Qué significa la tercera vía en esta fuente ? ¿Corresponde a la 4ª manera en Wikipedia?
- En the same source, al comparar las tres formas que se enumeran, que parece decir el trabajo de llenar la brecha entre los dos idiomas es gradualmente desplaza de la lengua llamada al lenguaje que llama. Estaba preguntándome cómo entender eso? ¿Este cambio también es cierto para las cuatro formas en Wikipedia?
¿Están Language binding y FFI conceptos equivalentes? ¿Cómo están relacionados y difieren ?
una unión de un lenguaje de programación a una biblioteca o OS servicio es una API prestación de dicho servicio en el idioma .
Me preguntaba de qué manera en la cita de Wikipedia o de la fuente de cada uno de los siguientes ejemplos pertenece?
- Common Object Request Broker Architecture (CORBA)
- Llamando C en C++, por la declaración extern "C" en C++ para nombre desactivar mangling.
- Llamando C en Matlab, por MATLAB Interface to Shared Libraries, es decir, primero compilar código C a la biblioteca compartida a través de C en general compilador tal como gcc, y luego carga, llamar a una función de y descarga de la biblioteca compartida a través de funciones de Matlab LoadLibrary(), calllib() y unloadlibrary().
- Llamando C en Matlab, por Creating C/C++ Language MEX-Files
- Calling Matlab en C, por mcc compiler
- Llamando C++ en Java, por JNI, y llamar a Java en C++, también por JNI
- Llamando C/C++ en otros idiomas , Usando SWIG
- Llamando C en Python, por Ctypes module.
- Cython
- Llamando R en Python, por RPy
- Programming Language Bindings to OpenGL from various languages, tal como Python, Fortran y Java
- Enlaces para una biblioteca de C, tales como Cairo, de varios idiomas, como C++, Python, java, Common Lisp
Gracias por su enlightment! Saludos cordiales!
1 respuesta agradable. Una nota: "Llamar a C en MATLAB al crear archivos MEX" es más parecido a "Opción 1", es el equivalente de escribir una extensión de Python usando su API de C. Crea una biblioteca compartida común con una rutina de puerta de enlace especial que recibe parámetros 'mxArray *'. En cuanto a "llamar a MATLAB en C usando el compilador mcc", no es realmente FFI, ya que es simplemente un código C que llama a otro código C (el compilador de MCC genera bibliotecas compartidas de forma regular). – Amro
Otra opción que no se mencionó es "llamar a MATLAB en C utilizando MATLAB Engine", que es similar a ["incrustación de Python"] (http://docs.python.org/2/extending/embedding.html) para continuar la analogía (lo mismo que llamar a Java en C usando la interfaz JNI) – Amro