Понимать интерфейс внешних функций (FFI) и привязку языка - PullRequest
20 голосов
/ 26 марта 2011

Смешивание разных языков программирования давно не совсем понятно.Согласно этой статье Википедии , интерфейс сторонней функции (или FFI) может быть выполнен несколькими способами:

  1. Требуя, чтобы функции гостевого языка были хостом- язык может быть указан или реализован определенным образом;часто с использованием какой-либо библиотеки совместимости.
  2. Использование инструмента для автоматического «обтекания» функций гостевого языка соответствующим кодом, который выполняет любой необходимый перевод.
  3. Использование библиотек-оболочек
  4. Ограничение набора возможностей основного языка, которые могут использоваться на разных языках.Например, функции C ++, вызываемые из C, не могут (в общем случае) включать ссылочные параметры или генерировать исключения.

Мои вопросы:

  1. В чем различия между 1, 2 и 3 способами?Мне кажется, что все они должны скомпилировать код вызываемого языка в какую-то библиотеку с объектными файлами и заголовочными файлами, которые затем вызываются вызывающим языком.
  2. Один источник, на который он ссылается говорит, что реализация FFI может быть выполнена несколькими способами:

    • Требование вызова функций на целевом языке для реализации определенного протокола.
    • Реализация библиотеки-оболочкикоторая берет данную функцию на низком языке и «оборачивает» ее кодом для преобразования данных в / из соглашений языка высокого уровня.
    • Требование функций, объявленных как собственные, для использования подмножества функций высокого уровня (который совместим с языком низкого уровня).

    Мне было интересно, является ли первый путь в связанном источнике таким же, как первый путь в Википедии?

    Что означает третий путь в этом источнике?Соответствует ли это 4-му способу в Википедии?

  3. В к тому же источнику , при сравнении трех перечисленных способов кажется, что работа заполнения промежутка междудва языка постепенно смещаются от вызываемого языка к языку вызова.Мне было интересно, как это понять?Это изменение также верно для четырех путей в Википедии?
  4. Являются ли привязкой к языку и эквивалентными понятиям FFI?Как они связаны и отличаются?

    привязка языка программирования к библиотеке или службе ОС - это API, обеспечивающий эту службу на языке.

  5. Мне было интересно, каким образом в цитате из Википедии или из источника принадлежит каждый из следующих примеров?

Спасибо за ваше просветление!С наилучшими пожеланиями!

1 Ответ

14 голосов
/ 30 марта 2011

Может конкретный пример поможет.Давайте возьмем язык хоста как Python и язык гостя как C. Это означает, что Python будет вызывать функции C.

  1. Первый вариант - написать библиотеку C определенным образом.,В случае Python стандартным способом было бы написать функцию C с первым параметром Py_Object * среди других условий.Например ( отсюда ):

    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);
    }
    

    - это функция C, вызываемая из Python.Чтобы это работало, библиотека должна быть написана с учетом совместимости с Python.

  2. Если вы хотите использовать уже существующую библиотеку C, вам нужен другой вариант.Одним из них является наличие инструмента, который генерирует обертки этой существующей библиотеки в формате, подходящем для использования языком хоста.Возьмите Swig , который можно использовать для связи многих языков.Имея существующую библиотеку C, вы можете использовать swig для эффективной генерации кода C, который вызывает вашу существующую библиотеку, в соответствии с соглашениями Python.См. пример для создания модуля Python.

  3. Другой вариант для нас, уже существующей библиотеки C, состоит в том, чтобы вызывать ее из библиотеки Python, которая эффективно упаковывает вызовы ввремя выполнения, например ctypes .Хотя в варианте 2 компиляция была необходима, это не время.

Другое дело, что существует множество опций (которые перекрываются) для вызова функций на одном языке из другого языка,Существуют FFI (эквивалентные языковым привязкам, насколько мне известно), которые обычно относятся к вызовам между несколькими языками в одном и том же процессе (как часть одного и того же исполняемого файла, так сказать), и существует межпроцессное взаимодействиесредства (локальные и сетевые).Такие вещи, как CORBA и веб-службы (SOAP или REST), а также COM + и удаленные вызовы процедур в целом относятся ко второй категории и не рассматриваются как FFI.На самом деле, они в основном не предписывают какой-либо конкретный язык, который будет использоваться с обеих сторон общения.Я бы свободно назвал их опциями IPC (межпроцессное взаимодействие), хотя в случае сетевых APi, таких как CORBA и SOAP, это упрощение.

Имея возможность ознакомиться с вашим списком, я бы рискнул высказать следующие мнения:

  • Архитектура брокера запросов общего объекта: IPC, а не FFI
  • Вызов C в C ++ с помощью объявления extern "C" в C ++ для отключения искажения имен.****
  • Вызов C в Matlab через интерфейс MATLAB для общих библиотек Вариант 3 (в стиле ctypes)
  • Вызов C в Matlab путем создания C / C ++Языковые MEX-файлы Вариант 2 (аналогично swig)
  • Вызов Matlab в C, компилятором mcc Вариант 2 (аналогично swig)
  • Вызов C ++ в Java с помощью JNI и Вызов Java в C ++ с помощью JNI Вариант 3 (в стиле ctypes)
  • Вызов C / C ++ на других языках, Использование SWIG Вариант 2 (swig)
  • Вызов C в Python, Ctypes Вариант 3 (ctypes)
  • Cython Вариант 2 (swig-like)
  • Вызов R в Python, RPy Вариант 3 (ctypes-подобный) частично и частично об обмене данными (не FFI)

Следующие дване интерфейсы сторонних функций вообще, как термин используется.FFi касается взаимодействия между языками программирования и должен быть способен сделать любую библиотеку (с подходящими ограничениями) из одного языка доступной для другого.Отдельная библиотека, доступная на одном языке, не делает FFI.

  • Привязки к языку программирования для OpenGL из разных языков
  • Привязки для библиотеки C из разных языков
...