¿PHP está compilado o interpretado?

142

¿PHP está compilado o interpretado?

nicky
fuente

Respuestas:

127

PHP es un lenguaje interpretado. El binario que te permite interpretar PHP está compilado, pero lo que escribes se interpreta.

Puede ver más en la página de Wikipedia para Idiomas interpretados

Thibault Martin-Lagardette
fuente
26
Significa que se compila la utilidad llamada php (o en Windows php.exe).
sepp2k
77
@nicky Significa que el programa que se utiliza para interpretar PHP está compilado, pero el PHP mismo se interpreta.
Andrew Song
55
¿Pero por qué se menciona así en Wikipedia? goo.gl/YOwZ Desde PHP 4, el analizador PHP compila la entrada para producir código de bytes para el procesamiento por parte del motor Zend, lo que mejora el rendimiento sobre su predecesor de intérprete.
kiranvj
55
@kiranvj De hecho, está compilado para mejorar el rendimiento, pero en tiempo de ejecución. Piense en los "idiomas compilados" como "precompilados", y los idiomas interpretados como "Compilados cuando se ejecutan". Es la diferencia entre estos dos: - JIT ("Justo a tiempo"), donde solo se compila el código que se necesita cuando es necesario (tenga en cuenta, sin embargo, que después de que el intérprete se cierra, el código compilado es mucho) - AOT (" Antes del tiempo "), donde se compila todo el código antes de ejecutarse.
Thibault Martin-Lagardette
44
@kiranvj: Creo que OP quería saber si PHP se compila en el código nativo. Compilarlo en bytecode, que Zend interpreta nuevamente, está en el medio en términos de costo de compilación y rendimiento de tiempo de ejecución. Lol, este es un hilo bastante viejo, solo me di cuenta.
Groo
66

Ambos. PHP se compila en un bytecode intermedio que luego es interpretado por el motor de tiempo de ejecución.

El trabajo del compilador PHP es analizar su código PHP y convertirlo en un formulario adecuado para el motor de tiempo de ejecución. Entre sus tareas:

  • Ignorar comentarios
  • Resolver variables, nombres de funciones, etc. y crear la tabla de símbolos.
  • Construya el árbol de sintaxis abstracta de su programa
  • Escribe el bytecode

Dependiendo de su configuración de PHP, este paso generalmente se realiza solo una vez, la primera vez que se llama al script. La salida del compilador se almacena en caché para acelerar el acceso en usos posteriores. Sin embargo, si se modifica el script, el paso de compilación se realiza nuevamente.

El motor de tiempo de ejecución recorre el AST y el código de bytes cuando se llama al script. La tabla de símbolos se usa para almacenar los valores de las variables y proporcionar las direcciones de código de bytes para las funciones.

Este proceso de compilación a bytecode e interpretación en tiempo de ejecución es típico para los lenguajes que se ejecutan en algún tipo de máquina de tiempo de ejecución virtual, incluidos Perl, Java, Ruby, Smalltalk y otros.

Barry Brown
fuente
El enlace variable ocurre en tiempo de ejecución, no en tiempo de compilación.
jrockway
¿PHP ni siquiera intenta resolver qué nombres están en el alcance en tiempo de compilación?
Barry Brown el
17

En general se interpreta, pero en algún momento puede usarlo como compilado y realmente aumenta el rendimiento. Herramienta de código abierto para realizar esta operación: hhvm.com

Max
fuente
15

PHP es un lenguaje interpretado. Sin embargo, puede compilarse en bytecode mediante herramientas de terceros.

code_burgar
fuente
2
"bytecode" es un término utilizado para pseudo instrucciones específicas de VM, que no son nativas, por lo tanto, no pueden considerarse como "compilación" en este contexto.
Sedat Kapanoglu el
77
El "código objeto" es solo un código de bytes para el decodificador de instrucciones de la CPU. (No cree que las CPU realmente tengan instrucciones nativas como "CMPSB", ¿verdad?)
jrockway
11

Un código compilado puede ser ejecutado directamente por la CPU de la computadora. Es decir, el código ejecutable se especifica en el idioma nativo de la CPU

El código de los idiomas interpretados debe traducirse en tiempo de ejecución desde cualquier formato a las instrucciones de la máquina de la CPU. Esta traducción la realiza un intérprete.

No sería correcto decir que un lenguaje se interpreta o compila porque la interpretación y la compilación son propiedades de la implementación de ese lenguaje en particular y no una propiedad del lenguaje en sí. Por lo tanto, cualquier lenguaje se puede compilar o interpretar, solo depende de lo que haga la implementación particular que está utilizando.

La implementación de PHP más utilizada está impulsada por Zend Engine y se conoce simplemente como PHP. Zend Engine compila la fuente PHP en un formato que puede ejecutar, por lo que el motor Zend funciona como intérprete .

Gaurang Deshpande
fuente
2
" Es decir, el código ejecutable se especifica en el idioma nativo de la CPU " .. El código ejecutable no se especifica en el idioma nativo de la CPU sino en formato binario, el idioma nativo de la CPU podría ser cualquier cosa y cuando los binarios del software no son como es para esto CPU o que la CPU .. Un totalmente compilado y el código ejecutable será en formato binario ..
hagrawal
10

Esta es una pregunta sin sentido. PHP usa yacc (bison), al igual que GCC. yacc es un "compilador compilador". La salida de yacc es un compilador. La salida de un compilador se "compila". PHP es analizado por la salida de yacc. Entonces, por definición, se compila.

Si eso no satisface, considere lo siguiente. Tanto php (el binario) como gcc leen su código fuente y producen un árbol de sintaxis abstracta. En las versiones 4 y 5, php luego recorre el árbol para traducir el programa a bytecode (el paso de compilación). Puede ver el código de bytes traducido a códigos de operación (que son análogos al ensamblaje) usando el volquete lógico Vulcan . Finalmente, php (en particular, el motor Zend) interpreta el código de bytes. gcc, en comparación, recorre el árbol y genera el ensamblaje; También puede ejecutar ensambladores y enlazadores para finalizar el proceso. Llamar a un programa manejado por uno "interpretado" y otro programa manejado por el otro "compilado" no tiene sentido. Después de todo, los programas se ejecutan a través de un "compilador" con ambos.

En realidad, debería hacer la pregunta que desea hacer en su lugar. ("¿Pago una penalización de rendimiento ya que PHP recompila mi código fuente para cada solicitud?", Etc.)

jrockway
fuente
55
Tokenizar un código fuente no se está compilando. Incluso VBScript puede considerarse como un lenguaje compilado con su definición.
Sedat Kapanoglu el
55
Estoy de acuerdo con esto, aunque en realidad no responde la pregunta del OP. Es tentador crear una taxonomía de idiomas en la que cada idioma se coloca limpiamente en cada categoría. Pero la realidad no es tan clara. Casi todos los idiomas son una mezcla de características. Además, cuando llega el momento, incluso el código nativo de la máquina es "interpretado" por el procesador.
Barry Brown, el
44
Su afirmación de alto nivel es correcta, esta es una pregunta sin sentido. Sin embargo, su argumento no es muy útil, todo lo que ha hecho es tomar definiciones confusas y llevarlas a extremos. La compilación es la transformación de la fuente en código objeto. Sí, puede considerar la transformación de la fuente en un árbol de sintaxis concreto / abstracto como una compilación, pero eso no es lo que la mayoría de la gente quiere decir. En cualquier caso, esta es una pregunta sin sentido, porque una lengua no se INHERENTEMENTE compilado o interpretado, implmentations de una lengua se compilado o interpretado.
Falaina
66
No supervisemos que el tipo es un principiante. Esto me hace interpretar la pregunta como "¿La implementación de Zend produce código nativo fuera de la fuente PHP?". Mira mi respuesta. Creo que estás siendo demasiado estricto sobre la forma en que se hace la pregunta. sabes, estamos tratando de ayudar, no criticar a algunos novatos.
Sedat Kapanoglu el
3
Estoy totalmente de acuerdo con Sedat. Puedes compartir tus conocimientos sin ser un imbécil para el autor de la pregunta
Alexandre Bourlier
10

Sé que esta pregunta es antigua, pero está vinculada por todas partes y creo que todas las respuestas aquí son incorrectas (tal vez porque son viejas).

Hay NO tal cosa como un lenguaje interpretado o un lenguaje compilado. Cualquier lenguaje de programación puede ser interpretado y / o compilado.

En primer lugar, un lenguaje es solo un conjunto de reglas, por lo que cuando hablamos de compilación nos referimos a implementaciones específicas de ese lenguaje.

HHVM , por ejemplo, es una implementación de PHP. Utiliza la compilación JIT para transformar el código en el bytecode intermedio de HipHop y luego se traduce en código de máquina. ¿Es suficiente decir que está compilado? Algunas implementaciones de Java (no todas) también usan JIT. El V8 de Google también usa JIT.

Usar las antiguas definiciones de compilado vs. interpretado no tiene sentido hoy en día.

"¿Está compilado PHP?" es una pregunta no sensorial dado que ya no hay delimitadores claros y acordados entre un lenguaje compilado y uno interpretado.

Una posible forma de delimitarlos es (no encuentro ningún significado en esta dicotomía):

los lenguajes compilados usan la compilación Ahead of Time (C, C ++);

los lenguajes interpretados utilizan la compilación Just in Time o ninguna compilación (Python, Ruby, PHP, Java).

Claudiu Creanga
fuente
Sin embargo, ¿no utiliza Java la compilación anticipada en la mayoría de los casos? Soy un desarrollador de Java bastante nuevo y generalmente compilamos nuestro código antes del tiempo de ejecución.
aCarella
@aCarella in most cases, sí. en todos los casos, no. así que no puede dibujar una línea que sea semánticamente significativa y acordada.
Claudiu Creanga
2

Al menos no compila (o debería decir optimizar) el código tanto como uno podría desearlo.

Este código ...

for($i=0;$i<100000000;$i++);
echo $i;

... retrasa el programa por igual cada vez que se ejecuta.

Podría haber detectado que es un cálculo que solo debe hacerse la primera vez.

Magnus Andersson
fuente
Ahora tenemos una opción llamada generadores.
Ankit Vishwakarma
1

La respuesta aceptada es descaradamente falsa. PHP está compilado. Fin de la historia. Quizás no a las instrucciones nativas sino a un bytecode interpretado.

RichieHH
fuente