PHP è compilato o interpretato?


142

PHP è compilato o interpretato?

Risposte:


127

PHP è un linguaggio interpretato. Il binario che ti consente di interpretare PHP viene compilato, ma ciò che scrivi viene interpretato.

Puoi vedere di più sulla pagina di Wikipedia per le lingue interpretate


26
Vuol dire che l'utilità chiamata php (o su windows php.exe) è compilata.
sepp2k,

7
@nicky Significa che il programma utilizzato per interpretare PHP è compilato, ma il PHP stesso è interpretato.
Andrew Song,

5
Ma perché è menzionato in questo modo su Wikipedia? goo.gl/YOwZ Da PHP 4, il parser PHP compila l'input per produrre il bytecode per l'elaborazione da parte del motore Zend, offrendo prestazioni migliori rispetto al suo predecessore interprete.
Kirirvj,

5
@kiranvj È infatti compilato per migliorare le prestazioni, ma in fase di esecuzione. Pensa ai "linguaggi compilati" come "precompilati" e ai linguaggi interpretati come "Compilati all'avvio". È la differenza tra questi due: - JIT ("Just in time"), in cui viene compilato solo il codice necessario quando è necessario (notare, tuttavia, che dopo l'interruzione dell'interprete, il codice compilato è molto) - AOT (" In anticipo "), in cui tutto il codice viene compilato prima che venga eseguito.
Thibault Martin-Lagardette,

4
@kiranvj: Credo che OP volesse sapere se PHP viene compilato nel codice nativo. Compilarlo in bytecode, che viene poi nuovamente interpretato da Zend, è da qualche parte nel mezzo in termini di costi di compilazione e prestazioni di runtime. Lol, questo è un filo piuttosto vecchio, me ne sono appena reso conto.
Groo

66

Tutti e due. PHP viene compilato in un bytecode intermedio che viene quindi interpretato dal motore di runtime.

Il compito del compilatore PHP è di analizzare il codice PHP e convertirlo in un modulo adatto al motore di runtime. Tra i suoi compiti:

  • Ignora i commenti
  • Risolvi le variabili, i nomi delle funzioni e così via e crea la tabella dei simboli
  • Costruisci l'albero di sintassi astratto del tuo programma
  • Scrivi il bytecode

A seconda della configurazione di PHP, questo passaggio viene in genere eseguito una sola volta, la prima volta che viene chiamato lo script. L'output del compilatore viene memorizzato nella cache per accelerare l'accesso agli usi successivi. Se lo script viene modificato, tuttavia, la fase di compilazione viene ripetuta.

Il motore di runtime accompagna AST e bytecode quando viene chiamato lo script. La tabella dei simboli viene utilizzata per memorizzare i valori delle variabili e fornire gli indirizzi bytecode per le funzioni.

Questo processo di compilazione in bytecode e di interpretazione in fase di runtime è tipico per i linguaggi eseguiti su un tipo di macchina virtuale di runtime, tra cui Perl, Java, Ruby, Smalltalk e altri.


L'associazione delle variabili avviene in fase di esecuzione, non in fase di compilazione.
jrockway,

PHP non tenta nemmeno di risolvere quali nomi rientrano nell'ambito al momento della compilazione?
Barry Brown,

17

In generale viene interpretato, ma un po 'di tempo può usarlo come compilato e aumenta davvero le prestazioni. Strumento open source per eseguire questa operazione: hhvm.com


15

PHP è un linguaggio interpretato. Tuttavia, può essere compilato in bytecode da strumenti di terze parti.


2
"bytecode" è un termine usato per pseudo istruzioni specifiche della VM, che non sono native quindi non possono essere considerate "compilation" in questo contesto.
Sedat Kapanoglu,

7
"codice oggetto" è solo bytecode per il decodificatore di istruzioni della CPU. (Non pensi che le CPU abbiano effettivamente istruzioni native come "CMPSB", giusto?)
jrockway,

11

Un codice compilato può essere eseguito direttamente dalla CPU del computer. Cioè, il codice eseguibile è specificato nella lingua nativa della CPU

Il codice delle lingue interpretate deve essere tradotto in fase di esecuzione da qualsiasi formato alle istruzioni della macchina CPU. Questa traduzione è fatta da un interprete.

Non sarebbe corretto dire che una lingua è interpretata o compilata perché l'interpretazione e la compilazione sono entrambe proprietà dell'implementazione di quella particolare lingua e non una proprietà della lingua stessa. Quindi, qualsiasi linguaggio può essere compilato o interpretato - dipende solo da ciò che fa l'implementazione particolare che stai usando.

L'implementazione PHP più utilizzata è alimentata da Zend Engine e nota semplicemente come PHP. Zend Engine compila il sorgente PHP in un formato che può essere eseguito, quindi il motore Zend funziona come un interprete .


2
" Cioè, il codice eseguibile è specificato nella lingua nativa della CPU " .. Il codice eseguibile non è specificato nella lingua nativa della CPU ma in formato binario, la lingua nativa della CPU potrebbe essere qualsiasi cosa e quando i binari del software non arrivano come è per questo CPU o quella CPU .. Un codice completamente compilato ed eseguibile sarà in formato binario ..
hagrawal

10

Questa è una domanda insignificante. PHP usa yacc (bisonte), proprio come GCC. yacc è un "compilatore del compilatore". L'output di yacc è un compilatore. L'output di un compilatore è "compilato". PHP viene analizzato dall'output di yacc. Quindi, per definizione, è compilato.

Se ciò non soddisfa, considerare quanto segue. Sia php (il binario) che gcc leggono il codice sorgente e producono un albero di sintassi astratto. Nelle versioni 4 e 5, php quindi cammina l'albero per tradurre il programma in bytecode (il passo della compilazione). Puoi vedere il bytecode tradotto in codici operativi (che sono analoghi all'assembly) usando il Vulcan Logic Dumper . Infine, php (in particolare il motore Zend) interpreta il bytecode. gcc, in confronto, cammina l'albero e genera l'assemblaggio; può anche eseguire assemblatori e linker per completare il processo. Chiamare un programma gestito da uno "interpretato" e un altro programma gestito dall'altro "compilato" non ha senso. Dopotutto, entrambi i programmi vengono eseguiti attraverso un "compilatore" con entrambi.

Dovresti invece porre la domanda che vuoi porre. ("Devo pagare una penalità per le prestazioni quando PHP ricompila il mio codice sorgente per ogni richiesta?", Ecc.)


5
Il tokening di un codice sorgente non viene compilato. Anche VBScript può essere considerato come un linguaggio compilato con la tua definizione.
Sedat Kapanoglu,

5
Sono d'accordo con questo, anche se in realtà non risponde alla domanda del PO. È allettante creare una tassonomia di lingue in cui ogni lingua è inserita in modo pulito in ogni categoria. Ma la realtà non è così pulita. Quasi ogni lingua è una miscela di caratteristiche. Inoltre, quando ci si arriva fino in fondo, anche il codice macchina nativo viene "interpretato" dal processore.
Barry Brown,

4
La tua affermazione di alto livello è corretta, questa è una domanda insignificante. Il tuo argomento tuttavia non è molto utile, tutto ciò che hai fatto è stato preso definizioni sfocate e portate agli estremi. La compilazione è la trasformazione del codice sorgente in codice oggetto. Sì, puoi considerare la trasformazione della fonte in un albero di sintassi concreto / astratto una compilazione, ma non è quello che la maggior parte delle persone intende? Indipendentemente da ciò, questa è una domanda senza senso perché una lingua non è INTRINSECAMENTE compilato o interpretato, implmentations di una lingua sono compilati o interpretati.
Falaina,

6
non sorvegliamo che il ragazzo sia un principiante. questo mi fa interpretare la domanda come "l'implementazione di Zend produce codice nativo dall'origine PHP?". controlla la mia risposta. penso che tu sia troppo severo riguardo al modo in cui viene posta la domanda. sai, stiamo cercando di aiutare, non di colpire alcuni neofiti.
Sedat Kapanoglu,

3
Sono pienamente d'accordo con Sedat. Puoi condividere le tue conoscenze senza essere un
coglione

10

So che questa domanda è vecchia ma è collegata dappertutto e penso che tutte le risposte qui siano errate (forse perché sono vecchie).

NON esiste una lingua interpretata o una lingua compilata. Qualsiasi linguaggio di programmazione può essere interpretato e / o compilato.

Innanzitutto una lingua è solo un insieme di regole, quindi quando parliamo di compilazione ci riferiamo a implementazioni specifiche di quella lingua.

HHVM , ad esempio, è un'implementazione di PHP. Utilizza la compilazione JIT per trasformare il codice in bytecode HipHop intermedio e quindi tradotto in codice macchina. Basta dire che è compilato? Alcune implementazioni Java (non tutte) usano anche JIT. V8 di Google utilizza anche JIT.

L'uso delle vecchie definizioni di compilato vs. interpretato non ha senso al giorno d'oggi.

"Il PHP è compilato?" è una domanda non sensata, dato che non esistono più delimitatori chiari e concordati tra ciò che è un linguaggio compilato e uno interpretato.

Un modo possibile per delimitarli è (non trovo alcun significato in questa dicotomia):

i linguaggi compilati utilizzano la compilazione Ahead of Time (C, C ++);

i linguaggi interpretati usano la compilazione Just in Time o nessuna compilation (Python, Ruby, PHP, Java).


Nella maggior parte dei casi, tuttavia, Java non utilizza la compilazione anticipata? Sono uno sviluppatore Java abbastanza nuovo e di solito compiliamo il nostro codice molto prima del runtime.
aCarella,

@aCarella in most cases, si. in tutti i casi, no. quindi non puoi tracciare una linea che sia semanticamente significativa e concordata.
Claudiu Creanga,

2

Almeno non compila (o dovrei dire ottimizzare) il codice quanto si potrebbe desiderare.

Questo codice ...

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

... ritarda il programma allo stesso modo ogni volta che viene eseguito.

Potrebbe aver rilevato che si tratta di un calcolo che deve essere eseguito solo la prima volta.


Ora abbiamo un'opzione chiamata generatori.
Ankit Vishwakarma,

1

La risposta accettata è palesemente falsa. PHP È compilato. Fine della storia. Forse non per istruzioni native ma per un bytecode interpretato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.