No he usado SWIG, así que no puedo hablar directamente con él. Pero estoy pretty familiar con Inline::CPP.
Si desea compilar el código de C++ que se compila y se puede llamar desde Perl, Inline :: CPP lo facilita. Siempre que el código de C++ no cambie, solo debería compilarse una vez. Si basa un módulo en Inline :: CPP, el código se compilará en el momento de la instalación del módulo, por lo que otro usuario nunca verá realmente el primer retraso de compilación; sucede en el momento de la instalación, justo antes de la fase de prueba.
Inline :: CPP no es 100% libre de problemas de portabilidad. El usuario de destino debe tener un compilador de C++ que sea similar al compilador de C utilizado para compilar Perl, y las bibliotecas estándar de C++ deben ser de versiones que produzcan código compatible con binario con Perl. Inline :: CPP tiene una tasa de éxito de aproximadamente 94% con los probadores de CPAN. Y esos últimos 6% casi siempre se reducen a problemas del proceso de instalación que no descifran correctamente qué compilador y bibliotecas de C++ deben usar. ... y de esos, generalmente se reduce a las bibliotecas.
Asumamos que usted como autor del módulo se encuentra en ese 95% que no tiene problemas para obtener Inline :: CPP instalado. Si sabe que su público objetivo se ubicará en la misma categoría, entonces producir un módulo basado en Inline :: CPP es simple. Básicamente, debe agregar un par de directivas (VERSIÓN y NOMBRE) y cambiar la llamada ExtUtils :: MakeMaker de su Makefile.PL a Inline :: MakeMaker (invocará a ExtUtils :: MakeMaker). Es posible que también desee una directiva CONFIGURE_REQUIRES para especificar una versión actual de ExtUtils :: MakeMaker cuando cree su distribución; esto asegura que sus usuarios tengan una experiencia de instalación más limpia.
Ahora, si está creando el módulo para consumo general y no tiene idea de si su usuario objetivo se ajustará a la mayoría del 94% que puede usar Inline :: CPP, sería mejor que elimine la dependencia de Inline :: CPP. Es posible que desee hacer esto solo para minimizar la cadena de dependencia de todos modos; es más agradable para tus usuarios. En ese caso, redacte su código para trabajar con Inline :: CPP, y luego use InlineX :: CPP2XS para convertirlo a un antiguo módulo XS. Su usuario ahora podrá instalar sin el proceso que tira de Inline :: CPP en primer lugar.
C++ es un lenguaje extenso, y Inline :: CPP maneja un gran subconjunto de él. Preste atención al archivo de mapa de tipos para determinar qué tipos de parámetros se pueden pasar (y convertir) automáticamente, y qué tipos se solucionan mejor usando llamadas "agallas y API". Una característica que no recomendaría es la conversión automática de cadenas, ya que produciría conversiones poco amigables para Unicode. Es mejor manejar cadenas explícitamente a través de llamadas API.
La parte de C++ que Inline :: CPP no maneja correctamente es la metaprogramación de plantillas. Puede usar plantillas en su código y usar STL de forma gratuita. Sin embargo, no puede simplemente pasar parámetros de tipo STL y esperar que Inline :: CPP sepa cómo convertirlos. Se trata de POD (tipos de datos básicos), no de STL. Además, si compone una función basada en plantilla o un método de objeto, el compilador de C++ no sabrá en qué contexto Perl planea llamar la función, por lo que no sabrá qué tipo aplicar a la plantilla en tiempo de compilación. En consecuencia, las funciones y métodos de objetos expuestos directamente a Inline :: CPP deben ser funciones o métodos simples; no funciones de plantilla o clases.
Estas limitaciones en la práctica no son difíciles de tratar siempre y cuando sepa qué esperar. Si desea exponer una clase de plantilla directamente a Inline :: CPP, solo escriba una clase contenedora que herede o se componga de la clase de plantilla, pero le da un tipo concreto para que Inline :: CPP trabaje con ella.
Inline :: CPP también es útil para generar automáticamente envoltorios de funciones para las bibliotecas C++ existentes. La documentación explica cómo hacerlo.
Una de las ventajas de Inline :: CPP sobre trago es que si ya tiene alguna experiencia con perlguts, perlapi y perlcall, se sentirá como en casa ya. Con Swig, tendrás que aprender la manera Swig de hacer las cosas primero, y luego descubrir cómo aplicar eso a Perl, y posiblemente, cómo hacerlo de una manera que sea distribuible por CPAN.
Otra ventaja del uso de Inline :: CPP es que es una herramienta algo familiar en la comunidad de Perl. Encontrarás muchas más personas que entienden Perl XS, Inline :: C y, en cierta medida, Inline :: CPP, que encontrarás personas que hayan usado Swig con Perl. Aunque XS puede ser complicado, es un camino más transitado que usar Perl con Swig.
Inline :: CPP también es un tema común en la lista de correo [email protected]. Además de mí, el mantenedor de Inline :: C y varios otros encargados de la familia en línea frecuentan la lista, y hacen todo lo posible para ayudar a las personas que necesitan ayuda con la familia de módulos Inline.
También puede encontrar my Perl Mongers talk on Inline::CPP útil para explorar cómo podría funcionar para usted. Además, Math::Prime::FastSieve se erige como una prueba de concepto para basar un módulo en Inline :: CPP (con una dependencia Inline :: CPP). Además, Rob (sisyphus), el actual mantenedor en línea y autor de InlineX :: CPP2XS ha incluido un ejemplo en la distribución InlineX::CPP2XS que toma mi Math :: Prime :: FastSieve y la convierte en código XS simple usando su InlineX :: CPP2XS.
No, casi todos los módulos XS se escriben a mano (XS simple) o se inicializan con [InlineX :: C2XS] (http://p3rl.org/InlineX::C2XS), una minoría que solo se genera con la ayuda de SWIG . – daxim
@daxim: thanx, volvió a editar la pregunta – kobame