¿Hay alguna herramienta disponible que convierta el código fuente en Perl en código fuente en C? Cualquier plataforma está bien.¿Cómo puedo convertir Perl en C?
Respuesta
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.
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.
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. –
La respuesta canónica a esto es MJD's "Why Not Translate Perl to C?".
+1, disfruta de tu insignia de oro Perl. :) –
-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
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
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?
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.
* "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
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.
- 1. ¿Cómo puedo convertir zonas horarias en Perl?
- 2. ¿Cómo puedo convertir una cadena en un número en Perl?
- 3. ¿Cómo puedo convertir un número en texto en Perl?
- 4. ¿Cómo puedo convertir cadenas hexagonales en números en Perl?
- 5. ¿Cómo puedo convertir Perl one-liners en scripts completos?
- 6. ¿Cómo puedo convertir entre notación científica y decimal en Perl?
- 7. Cómo convertir HTML a RTF en Perl?
- 8. Convertir UTF8 en valores numéricos en Perl
- 9. ¿Cómo puedo convertir cuatro caracteres en un flotador IEEE-754 de 32 bits en Perl?
- 10. ¿Cómo puedo crear un qr // en Perl 5.12 desde C?
- 11. ¿Cómo puedo construir un hash Perl en código C?
- 12. ¿Cómo puedo llamar al script Perl en la aplicación C#?
- 13. ¿Cómo puedo convertir DataRowView en DataRow en C#
- 14. ¿Cómo puedo convertir bitset en abreviado en C++?
- 15. perl cómo convertir una cadena a Datetime?
- 16. ¿Cómo puedo convertir caracteres no ASCII codificados en UTF8 en equivalentes ASCII en Perl?
- 17. Perl: ¿Convertir cadena a referencia?
- 18. ¿Cómo puedo convertir cuerda cirílica al inglés en C#
- 19. ¿Cómo puedo convertir entre midi a wav/mp3 en C#?
- 20. ¿Cómo puedo convertir System.Byte [] en Image? (Formas de ventana C#)
- 21. ¿Cómo puedo convertir números hexadecimales a binarios en C++?
- 22. ¿Cómo puedo convertir Xml a Json y viceversa en C#
- 23. ¿Cómo puedo convertir una marca de tiempo ISO8601 en tiempo Unix en Perl?
- 24. ¿Cómo puedo usar una clase C++ de Perl?
- 25. ¿Cómo puedo cambiar los formatos de fecha en Perl?
- 26. Cómo convertir Perl objetos en JSON y viceversa
- 27. ¿Cómo puedo incluir Perl dentro de una aplicación C++?
- 28. Perl, convertir hash a matriz
- 29. ¿Cómo puedo obtener un rastreo en Perl?
- 30. ¿Cómo puedo deshacer un objeto en Perl?
perlcc y los correspondientes módulos B :: se mantienen por separado en CPAN por Reini Urban. –
Tanto 'B :: C' como' B :: CC' parecen estar rotos en este momento. –