programacion - ¿Es Perl un lenguaje de programación compilado o interpretado?
perl licencia (7)
¿Se compila o interpreta Perl?
Ambos, en serio. Perl5 compila el código fuente en un objeto OPCODE, luego interpreta los objetos OPCODE. La respuesta larga sigue.
De Wikipedia,
Un compilador es un programa informático (o conjunto de programas) que transforma el código fuente escrito en un lenguaje de programación (el idioma fuente) en otro lenguaje informático (el idioma objetivo, que a menudo tiene una forma binaria conocida como código objeto).
Por esa definición, Perl5 es un compilador. Toma el código fuente de Perl5 y produce un gráfico de objetos OPCODE.
$ perl -MO=Concise,-exec -E''for (1..3) { say "Hello, World!" }''
1 <0> enter
2 <;> nextstate(main 48 -e:1) v:%,2048
3 <0> pushmark s
4 <$> const(IV 1) s
5 <$> const(IV 3) s
6 <$> gv(*_) s
7 <{> enteriter(next->c last->f redo->8) lKS/8
d <0> iter s
e <|> and(other->8) vK/1
8 <;> nextstate(main 47 -e:1) v:%,2048
9 <0> pushmark s
a <$> const(PV "Hello, World!") s
b <@> say vK
c <0> unstack v
goto d
f <2> leaveloop vK/2
g <@> leave[1 ref] vKP/REFC
-e syntax OK
Sin embargo, el compilador de Perl5 no produce código de máquina. Entonces, ¿cómo se ejecuta el gráfico OPCODE? Desde Wikipedia, una definición para un intérprete es algo que
ejecuta explícitamente el código precompilado almacenado creado por un compilador que forma parte del sistema de intérprete
Así que eso significa que los gráficos OPCODE se interpretan.
Se está trabajando para proporcionar la opción de compilar Perl5 a bytecode LLVM. Esto, a su vez, puede compilarse en el código de máquina. Este es el mismo enfoque que utiliza Java.
Ambos. Primero, el script de Perl 6 se compila a bytecode (y se optimiza). Luego se ejecuta (sin embargo, todavía necesita el intérprete de Perl para esto). Bytecode es una especie de código ejecutable, que es independiente del entorno en el que se ejecuta (el mismo bytecode puede ejecutarse en el entorno Unix en el procesador ARM, el sistema Windows con x86 y Haiku en x64).
Perl 6 se puede compilar con el bytecode VM (máquina virtual) de Parrot. Parrot VM también es utilizado por Python y Ruby.
Esto es lo que hace que Perl, Ruby y Python sean más rápidos que PHP, que solo se interpreta (también se puede compilar, pero para esto se necesitan componentes de terceros).
Bueno, eso depende de lo que entiendas por un lenguaje compilado. Tal vez es por eso que Google no dio una respuesta clara a su pregunta.
Un punto de vista es que la compilación significa compilar de una descripción de código fuente a otra, es decir , la generación de código .
Si aceptamos estas premisas, entonces Perl 6 se puede compilar y Perl 5 y versiones anteriores son idiomas interpretados.
Perl 6 se compila específicamente para el bytecode de Parrot . Perl 6 es, por lo tanto, un lenguaje compilado correctamente, de la misma manera, digamos, Java es .
Perl 5 y versiones anteriores analizan el código fuente de Perl en una lista interna o árbol, pero no creo que deba llamarse un compilador adecuado, excepto tal vez en un sentido teórico. No genera ningún código de bytes, ensamblaje o código de máquina real generalmente asociado con los compiladores. La etapa de análisis de Perl para verificar la sintaxis de Perl solía llamarse "compilación" de la fuente. Se utiliza para verificar la validez sintáctica de un archivo fuente de Perl sin ejecutarlo.
Se invoca como:
perl -c myprog.pl
Pero si nos fijamos en la ayuda para las opciones de Perl, -c en realidad significa "cheque".
-c check syntax only (runs BEGIN and CHECK blocks)
(Para complicar aún más las cosas, Perl 5 tenía soporte para escribir el código de bytes interno, pero se eliminó en la versión 5.10 . Presumiblemente porque estaba defectuoso, no lo sé).
Por otro lado , si argumenta que la compilación es el acto de analizar un árbol de origen en cualquier otro tipo de representación, bueno, el análisis hace de Perl un lenguaje compilado. Perl debe analizar completamente un archivo fuente antes de que pueda comenzar a ejecutarlo. Según esta definición, cualquier idioma que pueda comenzar a ejecutar un archivo fuente inmediatamente antes del análisis sería un lenguaje interpretado.
Una tercera forma de ver esto es a partir de cómo estas palabras, "interpretadas" y "compiladas" son las más utilizadas por los profesionales en el campo. Apostaría mucho dinero a que si un subconjunto aleatorio de programadores tuviera que elegir "compilado" o "interpretado" cuando pensara en Perl, la mayoría elegiría "interpretado". No debido a algún argumento teórico sobre la naturaleza de Perl, sino porque "compilado" generalmente invoca pensamientos de "compilar", "enlazar", "código objeto", etc., mientras que "interpretado" significa "escribir el código, inténtalo" ". Correcto o incorrecto, puede ser bueno saberlo cuando se trata de determinar si Perl es, realmente , interpretado o, de hecho, compilado. Vas a encontrarte con muchos argumentos en tu búsqueda.
Lo más a menudo interpretado pero puede ser compilado también. sobre el compilador de perl
No va a obtener una respuesta definitiva, porque no ha proporcionado una pregunta definitiva.
Perl siempre está en uno de dos estados: está compilando o está ejecutando. Es por eso que ve hablar de "en tiempo de compilación" frente a "en tiempo de ejecución". Normalmente, obtienes una frase de compilación seguida de una fase de ejecución, pero no tiene por qué ser así.
Estas dos fases también pueden intercambiarse una y otra vez. Una eval STRING
es una forma en que el intérprete puede llamar al compilador (por lo tanto, también es necesario do FILE
y require
). Un bloque BEGIN
es una forma en que el compilador llama al intérprete (por lo tanto, también son de use
y no
).
Cuando ejecuta perl -c
, omite la fase de tiempo de ejecución. Hay varias formas de omitir la fase de compilación, pero ninguna de ellas es particularmente conveniente o común. El mod_perl
de Apache solo compila scripts una vez, pero los ejecuta muchas veces. Si usas el Byteloader, puedes hacer lo mismo. Etcétera.
La respuesta correcta a si Perl se compila o interpreta es simplemente SÍ.
Perl es un lenguaje interpretado. Sin embargo, se compila internamente en p-code para mayor eficiencia.