2009-07-11 21 views

Respuesta

16

Hay perlcc la que "traduce" a Perl C

No es realmente un Perl para el compilador de C; su resultado es simplemente un paquete del intérprete de Perl y el bytecode analizado de su programa.

+2

perlcc y los correspondientes módulos B :: se mantienen por separado en CPAN por Reini Urban. –

+0

Tanto 'B :: C' como' B :: CC' parecen estar rotos en este momento. –

9

La respuesta va a ser más o menos "No". Perl es un lenguaje extremadamente dinámico. C es un lenguaje para tipos de datos de tamaño estático. Cualquier traducción de Perl a C probablemente sea más o menos "ejecutar esta llamada de subrutina para simular lo que hace Perl" repetidamente. Y no tiene sentido construir un traductor de este tipo, ya que es poco probable que ejecute Perl mucho más rápido que Perl.

+0

Bueno, Perl tiene tipos de datos fijos, pero no muchos de ellos. El problema es que Perl es dinámico. Puede compilarse de manera diferente dependiendo de cualquier cantidad de factores, y eso puede cambiar la forma en que el compilador actúa para el próximo código fuente. –

26

La respuesta canónica a esto es MJD's "Why Not Translate Perl to C?".

+3

+1, disfruta de tu insignia de oro Perl. :) –

+0

-1, la antigua publicación de blog de MJD es de 2001 y está obsoleta. No obtendrá diferencias con las funciones de división y otras funciones de manejo de cadenas, pero obtendrá una gran cantidad de ahorro de memoria, tiempo de inicio, tiempo de destrucción y también tiempo de ejecución para int, float y esp. manejo de matrices, como señaló MJD al final de su publicación. Ver p. http://blogs.perl.org/users/rurban/2012/10/optimizing-compiler-benchmarks-part-3.html para un punto de referencia 6 veces más rápido con B :: CC compiled perl. – rurban

+0

Honestamente, he vuelto a opinar que lo siguiente se afirma en un comentario, ya que sé que es difícil de tragar. La dura verdad ... Perl es lento como el infierno, pero para ser justos también lo son la mayoría de los intérpretes, excluyendo a lua. Esa publicación es engañosa y responde la pregunta muy estrechamente. Si hicieras todas las cosas ineficientes que tu Perl hace actualmente, aún así será compilado increíblemente lento. Ahora bien, si de alguna manera reescribe manualmente el significado de lo que logra su código Perl, en C/C++/OCAML/GO ... todos sabemos que se ejecuta exponencialmente más rápido – TechZilla

0

El convertidor se llama un programador , y el proceso de conversión programación. En serio, el lenguaje propio de perl es tan vasto y poderoso, que cualquiera que intente escribir un convertidor miraría hacia abajo en una tarea de toda la vida. Además, el efecto en la mejora del rendimiento puede no ser un orden de magnitud, entonces, ¿para qué molestarse?

2

Escribí un programa bastante grande en Perl que crea PDF basado en HTML y consultas de bases de datos que prácticamente actúa como un navegador. El volumen total del código fuente es más de 1 MB. Los programas evalúan HTML, crean consultas SQL y recuperan datos, buscan imágenes en el disco o las descargan de servidores HTTP, construyen una estructura de documentos, hacen todos los cálculos de diseño y, finalmente, producen un PDF.

Tuve que averiguar cómo acelerar la operación de varias maneras. Basándome en eso, afirmo que Perl es bastante rápido, y que muchas tareas que se completaron rápida y exitosamente en Perl llevan mucho tiempo en C e incluso en C++.

Hay dos formas de hacer que Perl sea lento o consuma mucha memoria: una gran cantidad de estructuras de datos complejas (necesitan mucha memoria) y una gran cantidad de cálculos. Sí, el cálculo es de hecho muy lento en Perl. Un término simple como

$a = $b * $c 

es bastante lento en Perl, pero muy rápido en cualquier lenguaje compilado. Los operandos aquí pueden ser enteros, no variables de punto flotante, es lento. Supongo que esta es la razón por la cual Perl puntúa bastante mal en el concurso de tiroteos en el idioma [http://shootout.alioth.debian.org/](El juego de comparaciones de idiomas por computadora].

Encontré mi programa bastante grande -también usa muchos módulos Perl core y CPAN adicionales- para comenzar rápidamente, a pesar de ser interpretado.

Funciona muy bien ... hasta que se trata del cálculo de tamaños de texto y coordenadas de diseño. Eso consume mucho tiempo. Después de afirmar esto, escribí pequeños programas de prueba de Perl simplemente haciendo millones de cálculos aritméticos y los encontré muy lentos.

Además, estoy usando un enfoque orientado a objetos para modelar cada elemento de diseño. Cada objeto está representado por un hash, es decir, al menos unos 10kBytes por objeto. Si hay una gran cantidad de datos para imprimir, un consumo de memoria de varios 100 MB no es inusual para ese programa.

Por lo tanto, todavía tengo una buena razón para mover la pieza calculando el diseño a C, usando estructuras donde ahora tengo hashes con teclas fijas y tengo C aritmética de enteros donde ahora Perl hace un trabajo lento.

Pero todo lo demás se hizo y probó rápidamente y funciona tan rápido que no veo ningún motivo para cambiar. También encuentro que el código Perl es mucho más cómodo de escribir y probar que el código C. Y muchos módulos de CPAN brindan soluciones que no tiene que resolver usted mismo. Muchos de ellos están bien probados y documentados.

Después de esta bastante larga discusión concluyo: si se trata de un servidor o programa de línea de comando, considere Perl. Pero si este programa tiene que construir enormes estructuras de datos o muchos aritméticos, considere algo más rápido. A veces, puede ser un programa Perl con un módulo escrito en C.

+0

* "muchas tareas completadas rápida y exitosamente en Perl llevan mucho tiempo en C, e incluso en C++." * ¿Estás seguro de eso? Recuerde, Perl está escrito en C, por lo que todo lo que Perl está haciendo ya se está haciendo en C :-) – psmears

1

Hay traductores de Perl a C, pero ninguno es perfecto. Lo ideal es que quieras un traductor que sea correcto y elegante. Por desgracia, no puedes tener ambos, el simple código Perl no es un código C simple equivalente, por lo que debes tener una traducción que no sea 100% correcta o que sea tan compleja como Perl. Esto ha llevado a algunos a creer que no deberías tratar de traducir Perl. Sería más exacto decir que necesita tener claro lo que quiere lograr de la traducción, y no esperar milagros.

100% correcto es fácil: si su script de Perl es myperl.pl, entonces el programa C void main(){system("perl myperl.pl")} hará exactamente lo que myperl.pl hará; esto es bastante inútil sin embargo. El compilador perlcc es un poco más sofisticado, pero aún así no parece dar mucho beneficio. No he notado que perlcc sea más rápido que el simple Perl. Además, aunque el código de Perl puede ser notoriamente difícil de leer, prefiero print "Hello World\n" a la monstruosidad de 700 líneas que se traduce en perlcc. No he visto estos programas producir nada que pase una revisión de código así como un elegante código C escrito. OTOH, si quieres un compilador porque no quieres distribuir tu código fuente de forma no ofuscada, entonces perlcc podría hacer maravillas.

RPerl puede lograr aceleraciones, pero es muy limitado en lo que se puede traducir.

Para ver un ejemplo de un traductor trivial "elegante pero no correcto", consulte el prototipo perl2c++.pl. Esto funciona reemplazando (unos pocos) Perl-ismos estándar con C++ - ismos. C++ fue elegido porque es un lenguaje de alto nivel como Perl, pero todavía comparte el mismo espíritu-metal desnudo de C.

En el caso de un simple generador LCG.pl número LCG Pseudo-Random, la salida de perl2c++.pl está limpio y un código sucinto de C++ que se ejecuta docenas de veces más rápido que el Perl original y no depende de ninguna biblioteca de Perl. Podría extenderse para buscar todas las respuestas estándar a "Cómo hacer X en Perl" y reemplazarlo por "Cómo hacer X en C++". Entonces podría traducir con éxito muchos scripts Perl simples pero reales, y ayudar a un humano a traducir el software Perl no trivial en un elegante código C++. Esto sería más útil si te encuentras escribiendo software numérico en Perl que debería haber sido escrito en C++ en primer lugar.

Para el software para el cual Perl se adapta bien, pero solo quiere ir un poco más rápido, el enfoque JIT utilizado por JavaScript (y finalmente Perl 6) es más prometedor.

Cuestiones relacionadas