Perl XS и Inline::C

В чем разница между использованием XS и модуля Inline::C? Об этом кто-то упомянул в этом вопросе, и мне стало любопытно.


person Nate Glenn    schedule 29.07.2011    source источник


Ответы (2)


Inline::C генерирует XS и строит сгенерированный модуль. Он делает это во время выполнения, хотя и кэширует прошлые сборки.

Inline::C, возможно, проще в использовании, но есть несколько недостатков. При первом запуске он замедляет запуск, требует разрешений для создания файлов во время выполнения и требует инструментов для компиляции модуля. Кроме того, это усложняет установку для системного администратора.

Положительным моментом является то, что вы можете получить сгенерированный XS и исключить Inline::C, как только все начнет складываться. Это делает его полезным для прототипирования.

person ikegami    schedule 29.07.2011
comment
Трудная часть XS — это понимание perl API. И вам придется делать это независимо от того, используете ли вы XS или Inline::C. - person jrockway; 30.07.2011
comment
См. экспериментальный InlineX::XS для способа использования Inline::C для прототипирования и XS для развертывания. - person tsee; 05.08.2011

Inline компилирует код C одновременно с компиляцией вашего Perl и будет перекомпилировать каждый раз, когда ваш исходный код изменяется. XS компилируется один раз, а двоичный файл сохраняется как файл .so, как библиотека.

Perl написан на C, поэтому XS использует собственные типы Perl и механизмы подпрограмм. Модуль, использующий XS, работает почти так же эффективно, как встроенная функция языка. Некоторые вещи в Inline выполнять сложнее, и при вызове или возврате из вашего кода будет этап преобразования. При этом Inline хорошо справляется с тем, что не выполняет перекомпиляцию, когда в этом нет необходимости, а преобразования во встроенный код и из него вряд ли окажут заметное влияние на производительность.

Наконец, написание XS предполагает, что вы упаковываете модуль. Требуется много настроек и знаний Perl и упаковки модулей. Если вам просто нужно вызвать библиотеку C из Perl, вам лучше использовать Inline.

person Steve C    schedule 29.07.2011
comment
Re будет перекомпилироваться каждый раз, когда ваш исходный код будет изменен, и это хорошо. вам все еще нужно перекомпилировать, когда исходный код изменяется при непосредственном использовании XS, но тогда это не происходит автоматически. - person ikegami; 30.07.2011
comment
Re и будет шаг преобразования при вызове или возврате из вашего кода. Один и тот же шаг преобразования обязательно существует как для XS, так и для Inline::C. Фактически, Inline::C позволяет XS выполнять все преобразования. - person ikegami; 30.07.2011