SWIG generates a C/C++ wrapper. It can do so directly from the header files, but you're often better off writing your own interface file (in a language similar to C/C++, but cleaner than XS). As for why people use XS, it comes with Perl, while SWIG is yet another complex dependency.