2012-07-23 15 views
5

En this pregunta vi dos respuestas diferentes cómo llamar directamente a funciones escritas en C++Uso de Inline :: CPP vs SWIG: ¿cuándo?

  1. Inline::CPP (y aquí están más, como Inline :: C, Inline :: Lua, etc ..)
  2. SWIG
  3. hecho a mano (como se dijo daxim - mayoría de los módulos son manuscrita)

acabo navegado a casi todas las preguntas en SO etiquetada [perl] [] swig para encontrar respuesta a las siguientes preguntas:

  • ¿Cuáles son las principales diferencias al usar (elegir entre) SWIG e Inline :: CPP o Handwritten?
  • ¿Cuándo es la "buena práctica"? ¿Se recomienda utilizar Inline :: CPP (o Inline: C) y cuándo se recomienda usar SWIG o Handwritten?

Como he de pensar en ello, utilizando el TRAGO es más universal para otros usos, como el pedido in this question y Inline :: CPP-perl es específica. Pero, desde el punto de vista del perl, es aquí alguna (alguna) diferencia significativa?

+2

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

+0

@daxim: thanx, volvió a editar la pregunta – kobame

Respuesta

6

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.

+1

geniue answer. Gracias por tu tiempo. – kobame

1

Probablemente también deba darle una mirada a ExtUtils::XSpp. Creo que requiere que declares algo más que Inline :: CPP o SWIG, pero es bastante poderoso.