XS (Perl) (XS (Perl))
XS (от англ. «eXternal Subroutine») — это макроязык интерфейса внешних функций языка программирования Perl, через который программа на языке Perl может вызывать подпрограмму на C или C++.
Макроязык XS описывает интерфейс функций и служит для согласования модели вызова Perl-функций с моделью вызова C-функций, что включает в себя преобразование типов и манипуляции с размещением аргументов функций и возвращаемых значений. Каждую отдельно описанную функцию в интерфейсе принято называть XSUB.
XS используется в тех случаях, когда требуется сделать обёртку или интерфейс к существующим C-библиотекам для использования в Perl.
Описание
[править | править код]В программировании на Perl интерфейс между Perl и другими языками также называется расширением. Популярным языком интерфейса, используемым в программировании на Perl, является XS. Язык XS используется в файле описания интерфейса для создания расширенного интерфейса между Perl и кодом на C или C++. Интерфейс XS компонуется с некоторыми библиотеками для создания новой библиотеки, которая может быть либо динамически, либо статически связана с Perl. Описание интерфейса пишется на макроязыке XS и является ключевым компонентом интерфейса расширения Perl.[1]
XSUB формирует основную единицу для интерфейса XS и представляет собой прямой перевод между C/C++ и Perl, поэтому он сохраняет интерфейс. После того, как интерфейс XSUB скомпилирован с использованием компилятора xsubpp, он обеспечивает прямое сопоставление между кодом Perl и C и "склеивает" их вместе.[1]
История появления
[править | править код]Библиотеки подпрограмм в Perl называются модулями, а модули, содержащие XSUB, называются модулями XS. Perl предоставляет основу для разработки, упаковки, распространения и установки таких модулей.
Появление XS вызвано необходимостью написания подпрограмм, которые выполняют задачи с очень интенсивным использованием ЦП и/или оперативной памяти, взаимодействуют с оборудованием или низкоуровневыми системными средствами, существующими библиотеками подпрограмм на C.
Обёртки
[править | править код]Можно писать модули XS, которые обертывают код C++. В основном это вопрос настройки системы сборки модулей[2].
Пример создания XS-модуля
[править | править код]Эта статья или раздел нуждается в переработке. |
Ниже показан 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:
вызывает функцию чистого C _do_sv_catsv()
, которая была определена в предыдущей секции.
Документация Perl объясняет значение и назначение всех «специальных» символов (например, aTHX_
и RETVAL
), показанных выше.
Чтобы сделать этот модуль доступным для Perl, его необходимо скомпилировать. Инструменты сборки, такие как ExtUtils::MakeMaker, могут делать это автоматически. (Для сборки вручную: инструмент xsubpp анализирует модуль XS и выводит исходный код C; этот исходный код затем компилируется в общую библиотеку и помещается в каталог, где Perl может его найти.) Код Perl затем использует для загрузки и компиляции XS-модуля XSLoader. На этом этапе Perl может вызвать Demo::XSModule::concat('foo', 'bar')
и получить обратно результат в виде строки foobar
, как если бы concat()
сам был написан на Perl.
Обратите внимание, что для создания интерфейсов Perl к уже существующим С-библиотекам, инструмент h2xs может автоматизировать большую часть создания самого файла XS.
Сложности
[править | править код]Создание и сопровождение модулей XS требует опыта работы с самим C, а также с обширным C API Perl. Модули XS могут быть установлены только в том случае, если доступны компилятор C и файлы заголовков, с которыми был скомпилирован интерпретатор Perl. Кроме того, новые версии Perl могут нарушить бинарную совместимость, требуя перекомпиляции модулей XS.
См. также
[править | править код]- SWIG — альтернатива XS, которая также поддерживает вызов функций C и C++ из нескольких других языков.
- FFI — механизм, который позволяет вызывать подпрограммы, написанные на другом языке.
Примечания
[править | править код]- ↑ 1 2 Ying Bai, 2003.
- ↑ Gluing C++ And Perl Together . johnkeiser.com (27 августа 2001). Дата обращения: 15 сентября 2021. Архивировано из оригинала 11 декабря 2001 года.
Литература
[править | править код]- Jenness, Tim & Cozens, Simon (2002). «Extending and Embedding Perl». Greenwich: Manning Publications Co. ISBN 1-930110-82-0
- Ying Bai. Interfaces Between Perl and ANSI C, Visual C++ // Applications Interface Programming Using Multiple Languages: A Windows® Programmer's Guide. — Pearson, 2003. — 864 с.
Ссылки
[править | править код]- perlxs (англ.) Perl XS application programming interface
- perlxstut (англ.) Perl XS tutorial
- perlguts (англ.) Perl internal functions for those doing extensions
- perlapi (англ.) Perl API listing (autogenerated)
- XS Mechanics (англ.) tutorial
- Perl and C++ (англ.) building XS modules for C++
- xs-fun (англ.) XS is fun: a simple and easy tutorial on writing Perl XS
- Mеханика XS
- Введение в Perl XS
- HOWTO по работе с C++ классами из Perl'a
- Использование C++ классов в Perl скриптах