O PHP é compilado ou interpretado?

142

O PHP é compilado ou interpretado?

Nicky
fonte

Respostas:

127

PHP é uma linguagem interpretada. O binário que permite interpretar o PHP é compilado, mas o que você escreve é ​​interpretado.

Você pode ver mais na página da Wikipedia para idiomas interpretados

Thibault Martin-Lagardette
fonte
26
Ele quer dizer que o utilitário chamado php (ou no windows php.exe) é compilado.
31516 sepp2k
7
@ Nicky Isso significa que o programa usado para interpretar o PHP é compilado, mas o próprio PHP é interpretado.
Andrew Song
5
Mas por que é mencionado assim na wikipedia? goo.gl/YOwZ Desde o PHP 4, o analisador PHP compila entrada para produzir bytecode para processamento pelo Zend Engine, fornecendo desempenho aprimorado em relação ao antecessor do seu interpretador.
kiranvj
5
@kiranvj É realmente compilado para melhorar o desempenho, mas em tempo de execução. Pense em "idiomas compilados" como "pré-compilados" e os idiomas interpretados como "compilados quando executados". É a diferença entre os dois: - JIT ("Just in time"), onde apenas o código necessário é compilado quando necessário (observe, porém, que após o encerramento do intérprete, o código compilado é muito) - AOT (" Ahead of time "), onde todo o código é compilado antes de ser executado.
Thibault Martin-Lagardette
4
@kiranvj: Eu acredito que o OP queria saber se o PHP é compilado no código nativo. Compilá-lo no bytecode, que é novamente interpretado pelo Zend, está no meio em termos de custo de compilação e desempenho de tempo de execução. Lol, este é um tópico bastante antigo, apenas percebi isso.
Groo
66

Ambos. O PHP é compilado em um bytecode intermediário que é então interpretado pelo mecanismo de tempo de execução.

O trabalho do compilador PHP é analisar seu código PHP e convertê-lo em um formato adequado para o mecanismo de tempo de execução. Entre suas tarefas:

  • Ignorar comentários
  • Resolva variáveis, nomes de funções e assim por diante e crie a tabela de símbolos
  • Construa a árvore de sintaxe abstrata do seu programa
  • Escreva o bytecode

Dependendo da configuração do PHP, essa etapa geralmente é realizada apenas uma vez, na primeira vez em que o script é chamado. A saída do compilador é armazenada em cache para acelerar o acesso em usos subsequentes. Se o script for modificado, no entanto, a etapa de compilação será feita novamente.

O mecanismo de tempo de execução percorre o AST e o bytecode quando o script é chamado. A tabela de símbolos é usada para armazenar os valores das variáveis ​​e fornecer os endereços de bytecode para funções.

Esse processo de compilação para bytecode e interpretação em tempo de execução é típico para linguagens executadas em algum tipo de máquina de tempo de execução virtual, incluindo Perl, Java, Ruby, Smalltalk e outros.

Barry Brown
fonte
A ligação variável ocorre no tempo de execução, não no tempo de compilação.
jrockway
O PHP nem tenta resolver quais nomes estão no escopo no momento da compilação?
Barry Brown
17

Geralmente é interpretado, mas algum tempo pode usá-lo como compilado e realmente aumenta o desempenho. Ferramenta de código aberto para executar esta operação: hhvm.com

Máx.
fonte
15

PHP é uma linguagem interpretada. Ele pode ser compilado no bytecode por ferramentas de terceiros.

code_burgar
fonte
2
"bytecode" é um termo usado para pseudo-instruções específicas da VM, que não são nativas e, portanto, não podem ser consideradas como "compilação" neste contexto.
Sedat Kapanoglu 03/10/2009
7
"código do objeto" é apenas um código de código para o decodificador de instruções da CPU. (Você não acha que CPUs realmente tem instruções nativas como "CMPSB", certo?)
jrockway
11

Um código compilado pode ser executado diretamente pela CPU do computador. Ou seja, o código executável é especificado no idioma nativo da CPU

O código dos idiomas interpretados deve ser traduzido em tempo de execução de qualquer formato para as instruções da máquina da CPU. Esta tradução é feita por um intérprete.

Não seria apropriado dizer que uma linguagem é interpretada ou compilada porque a interpretação e a compilação são propriedades da implementação dessa linguagem específica e não uma propriedade da própria linguagem . Portanto, qualquer idioma pode ser compilado ou interpretado - depende apenas do que a implementação específica que você está usando faz.

A implementação PHP mais usada é alimentada pelo Zend Engine e conhecida simplesmente como PHP. O Zend Engine compila a fonte PHP em um formato que pode ser executado, portanto, o mecanismo Zend funciona como um intérprete .

Gaurang Deshpande
fonte
2
" Ou seja, o código executável é especificado no idioma nativo da CPU ". O código executável não é especificado no idioma nativo da CPU, mas em formato binário, o idioma nativo da CPU pode ser qualquer coisa e quando os binários de software não são assim. CPU ou que CPU .. Um totalmente compilado e código executável será em formato binário ..
hagrawal
10

Esta é uma pergunta sem sentido. O PHP usa yacc (bison), assim como o GCC. O yacc é um "compilador compilador". A saída do yacc é um compilador. A saída de um compilador é "compilada". O PHP é analisado pela saída do yacc. Por isso, é, por definição, compilado.

Se isso não satisfizer, considere o seguinte. Tanto o php (o binário) quanto o gcc leem seu código-fonte e produzem uma árvore de sintaxe abstrata. Nas versões 4 e 5, o php percorre a árvore para converter o programa em bytecode (a etapa de compilação). Você pode ver o bytecode traduzido para opcodes (que são análogos ao assembly) usando o Vulcan Logic Dumper . Finalmente, o php (em particular, o mecanismo Zend) interpreta o bytecode. gcc, em comparação, percorre a árvore e monta saídas; Ele também pode executar montadores e vinculadores para concluir o processo. Chamar um programa tratado por um "interpretado" e outro programa tratado pelo outro "compilado" não faz sentido. Afinal, os programas são executados através de um "compilador" com ambos.

Você realmente deve fazer a pergunta que deseja fazer. ("Pago uma penalidade de desempenho porque o PHP recompila meu código-fonte para cada solicitação?", Etc.)

jrockway
fonte
5
Tokenizar um código fonte não está sendo compilado. Até o VBScript pode ser considerado como uma linguagem compilada com sua definição.
Sedat Kapanoglu 03/10/2009
5
Eu estou com jrockway nisso, embora isso realmente não responda à pergunta do OP. É tentador criar uma taxonomia de idiomas em que todos os idiomas sejam colocados corretamente em cada categoria. Mas a realidade não é tão clara. Quase todas as línguas são uma mistura de características. Além disso, quando você vai direto ao ponto, até o código nativo da máquina é "interpretado" pelo processador.
Barry Brown
4
Sua afirmação de alto nível está correta, isso é uma pergunta sem sentido. Seu argumento, no entanto, não é muito útil, tudo o que você fez foi levar definições difusas e levá-las ao extremo. Compilação é a transformação da fonte em código de objeto. Sim, você pode considerar a transformação da fonte em uma árvore de sintaxe concreta / abstrata uma compilação, mas não é isso que a maioria das pessoas quer dizer, é? Independentemente disso, essa é uma pergunta sem sentido, porque um idioma não é compilado ou interpretado de forma INERENTE , as implantações de um idioma são compiladas ou interpretadas.
Falaina 03/10/2009
6
não vamos supervisionar que o cara é iniciante. isso me faz interpretar a pergunta como "a implementação do Zend produz código nativo a partir da fonte PHP?". confira minha resposta. Eu acho que você está sendo muito rigoroso com a maneira como a pergunta é feita. você sabe, estamos tentando ajudar, e não para bater alguns novatos.
Sedat Kapanoglu 04/10/09
3
Eu concordo plenamente com Sedat. Você pode compartilhar seu conhecimento sem ser um idiota com o autor da pergunta
Alexandre Bourlier
10

Sei que essa pergunta é antiga, mas está vinculada a todos os lugares e acho que todas as respostas aqui estão incorretas (talvez porque sejam antigas).

NO tal coisa como uma linguagem interpretada ou uma linguagem compilada. Qualquer linguagem de programação pode ser interpretada e / ou compilada.

Antes de tudo, uma linguagem é apenas um conjunto de regras; portanto, quando estamos falando de compilação, nos referimos a implementações específicas dessa linguagem.

HHVM , por exemplo, é uma implementação do PHP. Ele usa a compilação JIT para transformar o código no bytecode intermediário do HipHop e depois convertido em código de máquina. Basta dizer que é compilado? Algumas implementações de Java (nem todas) também usam JIT. O V8 do Google também usa o JIT.

Usar as definições antigas de compilado versus interpretado não faz sentido atualmente.

"O PHP é compilado?" é uma pergunta não sensorial, uma vez que não há mais delimitadores claros e acordados entre o que é uma linguagem compilada e a linguagem interpretada.

Uma maneira possível de delimitá-los é (não acho nenhum significado nesta dicotomia):

linguagens compiladas usam compilação Ahead of Time (C, C ++);

linguagens interpretadas usam compilação Just in Time ou nenhuma compilação (Python, Ruby, PHP, Java).

Claudiu Creanga
fonte
O Java não usa compilação antecipada na maioria dos casos? Sou um desenvolvedor Java relativamente novo e geralmente compilamos nosso código antes do tempo de execução.
aCarella
@aCarella in most cases, sim. em todos os casos, não. portanto, você não pode desenhar uma linha que seja semanticamente significativa e concordada.
Claudiu Creanga
2

Pelo menos, ele não compila (ou, devo dizer, otimizar) o código tanto quanto se deseja.

Este código ...

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

... atrasa o programa igualmente sempre que é executado.

Poderia ter detectado que é um cálculo que só precisa ser feito na primeira vez.

Magnus Andersson
fonte
Agora temos uma opção chamada geradores.
Ankit Vishwakarma
1

A resposta aceita é descaradamente falsa. O PHP É compilado. Fim da história. Talvez não para instruções nativas, mas para um código de código interpretado.

RichieHH
fonte