XS (Перл)
XS — это Perl интерфейс внешней функции , через который программа может вызывать C или C++ подпрограмму . XS или xsub — это аббревиатура от «расширяемая подпрограмма».
XS также относится к связующему языку для указания вызывающих интерфейсов, поддерживающих такие интерфейсы (см. ниже).
Фон
[ редактировать ]Библиотеки подпрограмм в Perl называются модулями , а модули, содержащие xsub, называются модулями XS . Perl предоставляет основу для разработки, упаковки, распространения и установки модулей.
Может оказаться желательным, чтобы программа Perl вызывала подпрограмму C для выполнения задач, требующих интенсивного использования процессора или памяти , для взаимодействия с аппаратным обеспечением или низкоуровневыми системными средствами или для использования существующих библиотек подпрограмм C.
Perl-интерпретатор
[ редактировать ]Интерпретатор Perl — это программа на языке C, поэтому в принципе нет препятствий для вызова с Perl на C. Однако интерфейс XS сложен. [ почему? ] и очень технический, и его использование требует некоторого понимания интерпретатора. Самым ранним упоминанием на эту тему был Perlguts POD .
Обертки
[ редактировать ]Можно писать модули XS, которые обертывают код C++ . В основном это вопрос настройки системы сборки модулей . [1]
Пример кода
[ редактировать ]Ниже показан модуль XS, предоставляющий функцию. concat()
для объединения двух строк (т. е. эквивалент Perl .
оператор).
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
SV* _do_sv_catsv (pTHX_ SV* one_sv, SV* two_sv ) {
SV* one_copy = newSVsv(one_sv);
sv_catsv(one_copy, two_sv);
return one_copy;
}
MODULE = Demo::XSModule PACKAGE = Demo::XSModule
SV*
concat (SV* one_sv, SV* two_sv)
CODE:
SV* to_return = _do_sv_catsv( aTHX_ one_sv, two_sv );
RETVAL = to_return;
OUTPUT:
RETVAL
Первые четыре строки ( #define
и #include
операторы) являются стандартным шаблоном.
После этого следует любое количество простых функций C, которые можно вызывать локально.
Раздел, который начинается с MODULE = Demo::XSModule
определяет интерфейс Perl для этого кода, используя реальный язык макросов XS. Обратите внимание, что код C под CODE:
раздел называет _do_sv_catsv()
функция pure-C, определенная в предыдущем разделе.
Документация Perl объясняет значение и назначение всех «специальных» символов (например, aTHX_
и RETVAL
), показано выше.
Чтобы сделать этот модуль доступным для Perl, его необходимо скомпилировать. Инструменты сборки, такие как ExtUtils::MakeMaker, могут делать это автоматически. (Для сборки вручную: инструмент xsubpp анализирует модуль XS и выводит исходный код C; затем этот исходный код компилируется в общую библиотеку и помещается в каталог, где Perl может его найти.) Затем код Perl использует модуль, такой как XSLoader, для загрузки скомпилированный модуль XS. В этот момент Perl может вызвать Demo::XSModule::concat('foo', 'bar')
и получить обратно строку foobar
, как будто concat()
сами были написаны на Perl.
Обратите внимание, что для создания интерфейсов Perl к уже существующим библиотекам C, h2xs [ нужны дальнейшие объяснения ] может автоматизировать большую часть создания самого файла XS.
Трудности
[ редактировать ]Создание и поддержка модулей XS требует знаний как самого C, так и обширного C API Perl. Модули XS можно устанавливать только в том случае, если компилятор C и файлы заголовков доступны , с которыми был скомпилирован интерпретатор Perl. Кроме того, новые версии Perl могут нарушить двоичную совместимость , требующую перекомпиляции модулей XS.
См. также
[ редактировать ]- SWIG — альтернатива XS, которая также поддерживает вызов функций C и C++ из нескольких других языков.
- FFI — механизм, позволяющий вызывать процедуры, написанные на другом языке.
Ссылки
[ редактировать ]- ^ «Склеивание C++ и Perl вместе» . johnkeiser.com. 27 августа 2001 года. Архивировано из оригинала 11 декабря 2001 года . Проверено 5 мая 2005 г.
- Дженнесс, Тим и Козенс, Саймон (2002). «Расширение и встраивание Perl». Гринвич: Manning Publications Co. ISBN 1-930110-82-0
Внешние ссылки
[ редактировать ]- perlxs Интерфейс прикладного программирования Perl XS
- perlxstut Учебное пособие по Perl XS
- perlguts Внутренние функции Perl для тех, кто занимается расширениями
- perlapi Список API Perl (создается автоматически)
- по XS-механике Учебное пособие
- Perl и C++ создают модули XS для C++
- xs-fun XS — это весело: простой и легкий урок по написанию Perl XS