php - paiza - simulador de perl
¿Pueden Ruby, PHP o Perl crear un archivo precompilado para el código como Python? (11)
¿Alguien ha considerado usar el bytecode de LLVM, en lugar de un bytecode aún otro-personalizado?
Para Python, puede crear una versión precompilada file.pyc para que el programa pueda ejecutarse sin que se vuelva a interpretar. ¿Pueden Ruby, PHP y Perl hacer lo mismo en la línea de comandos?
Aquí hay algunos ejemplos de palabras mágicas para la línea de comandos.
perl -MO=Bytecode,-H,-o"Module.pm"c "Module.pm"
De acuerdo con la tercera edición de Programming Perl , es posible aproximar esto en algunas formas experimentales.
No hay una especificación de bytecode portátil para Ruby, y por lo tanto tampoco hay una forma estándar de cargar archivos de bytecode precompilados. Sin embargo, casi todas las implementaciones de Ruby utilizan algún tipo de formato de bytecode o intcode, y varias de ellas pueden volcar y volver a cargar los archivos de bytecode.
YARV siempre compila a bytecode antes de ejecutar el código, sin embargo, eso generalmente solo se hace en la memoria. Hay formas de volcar el código de bytes en el disco. Por el momento, no hay forma de volver a leerlo , sin embargo. Esto cambiará en el futuro: se está trabajando en un verificador de código de bytes para YARV, y una vez hecho esto, el código de bytes se puede cargar de forma segura en la máquina virtual, sin temor a daños. Además, los desarrolladores de JRuby han indicado que están dispuestos a implementar un emulador de YARV VM dentro de JRuby , una vez que el formato de bytecode de YARV y el verificador estén estabilizados, para que pueda cargar el bytecode de YARV en JRuby. (Tenga en cuenta que esta versión es obsoleta .)
Rubinius también siempre compila a bytecode, y tiene un formato para archivos compilados ( archivos .rbc
, análogo a JVM .class
) y se habla de un formato de archivo de bytecode (archivos .rba
, análogo a JVM .jar
). Existe la posibilidad de que Rubinius pueda implementar un emulador YARV, si la implementación de aplicaciones como bytecode de YARV se vuelve popular. Además, los desarrolladores de JRuby han indicado que están dispuestos a implementar un emulador de bytecode de Rubinius dentro de JRuby , si el bytecode de Rubinius se convierte en una forma popular de implementar aplicaciones de Ruby. (Tenga en cuenta que esta versión es obsoleta .)
XRuby es un compilador puro, compila código fuente Ruby directamente a bytecode JVM (archivos .class
). Puede implementar estos archivos .class
como cualquier otra aplicación Java.
JRuby comenzó como un intérprete, pero tiene un compilador JIT y un compilador AOT ( jrubyc
) que puede compilar código fuente Ruby a bytecode JVM (archivos .class
). Además, se está trabajando para crear un nuevo compilador que pueda compilar código Ruby (con anotación de tipo) en el código de bytes JVM que en realidad se parece a una clase Java y se puede usar desde código Java sin barreras.
Ruby.NET es un compilador puro que compila el código fuente de Ruby en el bytecode CIL (archivos PE, .dll
o .exe
). Puede implementar estos como cualquier otra aplicación CLI.
IronRuby también compila en el bytecode CIL, pero normalmente lo hace en la memoria. Sin embargo, puede pasarle los modificadores de la línea de comandos , para que descargue los archivos .dll
y .exe
en el disco. Una vez que los tenga, se pueden implementar normalmente.
BlueRuby automáticamente analiza el código fuente de Ruby en BRIL (BlueRuby Intermediate Language), que es básicamente un parsetree serializado. (Consulte Blue Ruby - A Ruby VM en SAP ABAP (PDF) para obtener más información).
Creo (pero definitivamente no estoy seguro) que hay una manera de hacer que Cardinal descargue los archivos de código de bytes de Parrot . (En realidad, Cardinal solo compila a PAST, y luego Parrot asume el control, por lo que sería tarea de Parrot volcar y cargar archivos de código de bytes).
No para PHP, aunque la mayoría de las configuraciones de PHP incorporan un Caché de Bytecode que almacenará en caché el bytecode compilado para que la próxima vez que se ejecute el script, se ejecute la versión compilada. Esto acelera considerablemente la ejecución.
No hay forma de que sepa llegar al código de bytes a través de la línea de comandos.
Para PHP, el Proyecto Phalanger se compila hasta en ensamblados .Net. No estoy seguro si eso es lo que estabas buscando.
Para Perl puedes intentar usar B::Bytecode y perlcc . Sin embargo, ambos son altamente experimentales. Y Perl 6 saldrá pronto (en teoría) y estará en Parrot y usará un código de byte diferente, por lo que todo esto será un tanto discutible.
Para las pasas histéricas, Perl 5 busca archivos .pmc
por delante de los archivos .pm
cuando busca el módulo. Estos archivos pueden contener código de bytes, aunque Perl no escribe el código de bytes de forma predeterminada (a diferencia de Python).
Module :: Compile (o: ¿qué es esta cosa de PMC?) Profundiza un poco más acerca de esta característica oscura. No son de uso frecuente, pero ...
Las personas inteligentes que escribieron Module::Compile aprovechan esto, para precompilar el código Perl en ... bueno, sigue siendo Perl, pero está preprocesado.
Entre otros beneficios, esto acelera el tiempo de carga y facilita la depuración cuando se utilizan filtros de origen (código Perl que modifica el código fuente de Perl antes de que el intérprete lo cargue).
Perl 5 puede volcar los códigos de byte en el disco, pero tiene errores y es desagradable. Perl 6 tiene un método muy limpio para crear ejecutables de código de bytes que Parrot puede ejecutar.
La compilación justo a tiempo de Perl es lo suficientemente rápida como para que esto no importe en la mayoría de las circunstancias. Un lugar donde sí importa es en un entorno CGI que es para lo que sirve mod_perl .
Ruby 1.8 en realidad no usa el código byte (incluso internamente), por lo que no hay un paso previo a la compilación.
Si usa Zend Guard en sus scripts de PHP, básicamente precompila los scripts a un código de bytes, que luego puede ser ejecutado por el motor de PHP si se carga la extensión Zend Optimizer.
Entonces, sí, Zend Guard / Optimizer permite que se utilicen scripts PHP precompilados.