XS is a
Perl
Perl is a high-level, general-purpose, interpreted, dynamic programming language. Though Perl is not officially an acronym, there are various backronyms in use, including "Practical Extraction and Reporting Language".
Perl was developed ...
foreign function interface
A foreign function interface (FFI) is a mechanism by which a program written in one programming language can call routines or make use of services written or compiled in another one. An FFI is often used in contexts where calls are made into a bin ...
through which a program can call a
C or
C++ subroutine
In computer programming, a function (also procedure, method, subroutine, routine, or subprogram) is a callable unit of software logic that has a well-defined interface and behavior and can be invoked multiple times.
Callable units provide a ...
. XS or xsub is an
abbreviation
An abbreviation () is a shortened form of a word or phrase, by any method including shortening (linguistics), shortening, contraction (grammar), contraction, initialism (which includes acronym), or crasis. An abbreviation may be a shortened for ...
of "eXtendable Subroutine".
XS also refers to a
glue language
In computing, a script is a relatively short and simple set of instructions that typically automate an otherwise manual process. The act of writing a script is called scripting. A scripting language or script language is a programming language t ...
for specifying calling interfaces supporting such interfaces (see below).
Background
Subroutine libraries in Perl are called ''modules'', and modules that contain xsubs are called ''XS modules''. Perl provides a framework for developing, packaging, distributing, and installing modules.
It may be desirable for a Perl program to invoke a C subroutine in order to handle very
CPU
A central processing unit (CPU), also called a central processor, main processor, or just processor, is the primary processor in a given computer. Its electronic circuitry executes instructions of a computer program, such as arithmetic, log ...
or
memory
Memory is the faculty of the mind by which data or information is encoded, stored, and retrieved when needed. It is the retention of information over time for the purpose of influencing future action. If past events could not be remembe ...
intensive tasks, to interface with
hardware or low-level system facilities, or to make use of existing C subroutine libraries.
Perl interpreter
The
Perl interpreter is a C program, so in principle there is no obstacle to calling from Perl to C. However, the XS interface is complex and highly technical, and using it requires some understanding of the interpreter. The earliest reference on the subject was th
perlguts POD.
Wrappers
It is possible to write XS modules that
wrap C++ code. Doing so is mostly a matter of configuring the module
build system.
Example code
The following shows an XS module that exposes a function
concat()
to concatenate two strings (i.e., the equivalent of Perl’s
.
operator).
#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 )
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
The first four lines (
#define
and
#include
statements) are standard boilerplate.
After then follow any number of plain C functions that are callable locally.
The section that starts with
MODULE = Demo::XSModule
defines the Perl interface to this code using the actual XS macro language. Note that the C code under the
CODE:
section calls the
_do_sv_catsv()
pure-C function that was defined in the prior section.
Perl’s documentation explains the meaning and purpose of all of the “special” symbols (e.g.,
aTHX_
and
RETVAL
) shown above.
To make this module available to Perl it must be compiled. Build tools lik
ExtUtils::MakeMakercan do this automatically. (To build manually: th
xsubpptool parses an XS module and outputs C source code; that source code is then compiled to a shared library and placed in a directory where Perl can find it.) Perl code then uses a module lik
XSLoaderto load the compiled XS module. At this point Perl can call
Demo::XSModule::concat('foo', 'bar')
and receive back a string
foobar
, as if
concat()
were itself written in Perl.
Note that, for building Perl interfaces to preexisting C libraries, the
h2xs can automate much of the creation of the XS file itself.
Difficulties
Creation and maintenance of XS modules requires expertise with C itself as well as Perl’s extensive C API. XS modules may only be installed if a
C compiler
C, or c, is the third letter of the Latin alphabet, used in the modern English alphabet, the alphabets of other western European languages and others worldwide. Its name in English is ''cee'' (pronounced ), plural ''cees''.
History
"C ...
and the
header file
An include directive instructs a text file processor to replace the directive text with the content of a specified file.
The act of including may be logical in nature. The processor may simply process the include file content at the location of ...
s that the Perl interpreter was compiled against are available. Also, new versions of Perl may break
binary compatibility requiring XS modules to be recompiled.
See also
*
SWIG
The Simplified Wrapper and Interface Generator (SWIG) is an open-source software tool used to connect computer programs or libraries written in C or C++ with scripting languages such as Lua, Perl, PHP, Python, R, Ruby, Tcl, and other lang ...
, an alternative to XS which also supports calling C and C++ functions from several other languages.
*
FFI, a mechanism which enables calling routines written in another language.
References
* Jenness, Tim &
Cozens, Simon (2002). "Extending and Embedding Perl". Greenwich: Manning Publications Co.
External links
perlxsPerl XS application programming interface
Perl XS tutorial
Perl internal functions for those doing extensions
Perl API listing (autogenerated)
tutorial
building XS modules for C++
xs-funXS is fun: a simple and easy tutorial on writing Perl XS
{{Perl
Perl