2011-03-26 7 views
15

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

  1. 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.
  2. 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.
  3. Uso de las bibliotecas contenedoras
  4. 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:

  1. ¿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 .
  2. 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?

  3. 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?
  4. ¿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 .

  5. Me preguntaba de qué manera en la cita de Wikipedia o de la fuente de cada uno de los siguientes ejemplos pertenece?

Gracias por su enlightment! Saludos cordiales!

Respuesta

13

Puede ser un ejemplo específico que ayude. Tomemos el lenguaje del servidor como Python y el idioma del invitado como C. Esto significa que Python llamará a las funciones C.

  1. La primera opción es escribir la biblioteca C de una manera particular. En el caso de Python, la forma estándar sería escribir la función C con un primer parámetro de Py_Object *, entre otras condiciones. Por ejemplo (from here):

    static PyObject * 
    spam_system(PyObject *self, PyObject *args) 
    { 
        const char *command; 
        int sts; 
    
        if (!PyArg_ParseTuple(args, "s", &command)) 
         return NULL; 
        sts = system(command); 
        return Py_BuildValue("i", sts); 
    } 
    

    es una función C puede llamar desde Python. Para que esto funcione, la biblioteca debe escribirse teniendo en cuenta la compatibilidad con Python.

  2. Si desea utilizar una biblioteca de C ya existente, necesita otra opción. Uno es tener una herramienta que genera envuelve esta biblioteca existente en un formato adecuado para el consumo por el idioma del servidor. Tome Swig que se puede usar para unir muchos idiomas.Dada una biblioteca C existente, puede usar swig para generar efectivamente el código C que llama a su biblioteca existente mientras se ajusta a las convenciones de Python. Vea the example para construir un módulo de Python.

  3. Otra opción para una biblioteca de C ya existente es llamarla desde una biblioteca de Python que envuelve las llamadas en tiempo de ejecución, como ctypes. Mientras que en la opción 2 la compilación fue necesaria, no es esta vez.

Otra cosa es que hay muchas opciones (que se superponen) para llamar a funciones en un idioma de otro idioma. Hay FFI (equivalentes a enlaces de idiomas, por lo que sé) que generalmente se refieren a llamadas entre múltiples idiomas en el mismo proceso (como parte del mismo archivo ejecutable, por así decirlo), y hay medios de comunicación entre procesos (locales y red). Cosas como CORBA y servicios web (SOAP o REST) ​​y COM + y llamadas a procedimientos remotos en general son de la segunda categoría y no se ven como FFI. De hecho, en general no prescriben ningún idioma en particular para usar en ninguno de los lados de la comunicación. Las situaría de forma general como opciones de IPC (comunicación entre procesos), aunque esto es una simplificación en el caso de APi basado en red, como CORBA y SOAP.

Tener un ir en su lista, me aventuraría las siguientes opiniones:

  • Common Object Request Broker Architecture: IPC, no FFI
  • Llamando C en C++, por la declaración extern "C" en C++ para desactivar el cambio de nombre. ****
  • Llamando C en Matlab, por MATLAB interfaz de bibliotecas compartidas Opción 3 (ctypes-like)
  • de llamada C en Matlab, mediante la creación de C/C++ Lenguaje archivos MEX Opción 2 (swig- similares)
  • Calling Matlab en C, por compilador mcc Opción 2 (trago-like)
  • Llamando C++ en Java, por JNI, y Calling Java en C++ por JNI Opción 3 (ctypes-like)
  • Llamando C/C++ en otro idioma s, Usar SWIG Opción 2 (trago)
  • Llamando C en Python, por ctypes la opción 3 (ctypes)
  • Cython Opción 2 (trago-like)
  • Calling R en Python, por RPY Opción 3 (ctypes-like) en parte, y en parte sobre el intercambio de datos (no FFI)

los dos siguientes no son interfaces de función extranjeros en absoluto, como se utiliza el término. FFi se trata de la interacción entre los lenguajes de programación y debe ser capaz de hacer que cualquier biblioteca (con las restricciones adecuadas) de un idioma esté disponible para el otro. No se puede hacer una biblioteca en particular desde un idioma.

  • Lenguaje de programación enlaces a OpenGL de varios idiomas
  • Enlaces para una biblioteca C de varios idiomas
+0

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

+0

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

Cuestiones relacionadas