PHP est-il compilé ou interprété?

142

PHP est-il compilé ou interprété?

Nicky
la source

Réponses:

127

PHP est un langage interprété. Le binaire qui vous permet d'interpréter PHP est compilé, mais ce que vous écrivez est interprété.

Vous pouvez en voir plus sur la page Wikipédia des langues interprétées

Thibault Martin-Lagardette
la source
26
Il signifie que l'utilitaire appelé php (ou sous windows php.exe) est compilé.
sepp2k
7
@nicky Cela signifie que le programme utilisé pour interpréter PHP est compilé, mais que PHP lui-même est interprété.
Andrew Song
5
Mais pourquoi est-il mentionné comme ça dans wikipedia? goo.gl/YOwZ Depuis PHP 4, l'analyseur PHP compile les entrées pour produire du bytecode à traiter par le moteur Zend, ce qui améliore les performances par rapport à son prédécesseur d'interpréteur.
kiranvj
5
@kiranvj Il est en effet compilé pour des performances améliorées, mais au moment de l'exécution. Pensez aux "langages compilés" comme "pré-compilés" et aux langages interprétés comme "Compilés lors de l'exécution". C'est la différence entre ces deux: - JIT ("Just in time"), où seul le code nécessaire est compilé quand on en a besoin (notez cependant qu'après la fermeture de l'interpréteur, le code compilé est beaucoup) - AOT (" Ahead of time "), où tout le code est compilé avant son exécution.
Thibault Martin-Lagardette
4
@kiranvj: Je crois qu'OP voulait savoir si PHP était compilé avec le code natif. Le compiler en bytecode, qui est ensuite à nouveau interprété par Zend, se situe quelque part au milieu en termes de coût de compilation et de performances d'exécution. Lol, c'est un fil assez ancien, je viens de le réaliser.
Groo
66

Tous les deux. PHP est compilé en un bytecode intermédiaire qui est ensuite interprété par le moteur d'exécution.

Le travail du compilateur PHP est d'analyser votre code PHP et de le convertir en une forme adaptée au moteur d'exécution. Parmi ses tâches:

  • Ignorer les commentaires
  • Résolvez les variables, les noms de fonctions, etc. et créez la table de symboles
  • Construisez l'arbre de syntaxe abstraite de votre programme
  • Écrivez le bytecode

Selon votre configuration PHP, cette étape est généralement effectuée une seule fois, la première fois que le script est appelé. La sortie du compilateur est mise en cache pour accélérer l'accès lors des utilisations suivantes. Si le script est modifié, cependant, l'étape de compilation est recommencée.

Le moteur d'exécution parcourt l'AST et le bytecode lorsque le script est appelé. La table des symboles est utilisée pour stocker les valeurs des variables et fournir les adresses de bytecode pour les fonctions.

Ce processus de compilation en bytecode et d'interprétation au moment de l'exécution est typique pour les langages qui s'exécutent sur une sorte de machine d'exécution virtuelle, notamment Perl, Java, Ruby, Smalltalk et d'autres.

Barry Brown
la source
La liaison de variable se produit au moment de l'exécution, pas au moment de la compilation.
jrockway
PHP n'essaye même pas de résoudre quels noms sont dans la portée au moment de la compilation?
Barry Brown
17

En général, il est interprété, mais un certain temps peut l'utiliser comme compilé et cela augmente vraiment les performances. Outil open source pour effectuer cette opération: hhvm.com

Max
la source
15

PHP est un langage interprété. Il peut cependant être compilé en bytecode par des outils tiers.

code_burgar
la source
2
"bytecode" est un terme utilisé pour les pseudo-instructions spécifiques aux VM, qui ne sont pas natives et ne peuvent donc pas être considérées comme une "compilation" dans ce contexte.
Sedat Kapanoglu
7
"code objet" est juste un bytecode pour le décodeur d'instructions du CPU. (Vous ne pensez pas que les processeurs ont en fait des instructions natives comme "CMPSB", non?)
jrockway
11

Un code compilé peut être exécuté directement par le processeur de l'ordinateur. Autrement dit, le code exécutable est spécifié dans la langue native du processeur

Le code des langues interprétées doit être traduit au moment de l'exécution de n'importe quel format vers les instructions de la machine CPU. Cette traduction est effectuée par un interprète.

Il ne serait pas juste de dire qu’une langue est interprétée ou compilée parce que l’interprétation et la compilation sont toutes deux des propriétés de l’implémentation de cette langue particulière et non une propriété de la langue elle-même. Ainsi, n'importe quel langage peut être compilé ou interprété - cela dépend simplement de ce que fait l'implémentation particulière que vous utilisez.

L'implémentation PHP la plus largement utilisée est alimentée par Zend Engine et connue simplement sous le nom de PHP. Le Zend Engine compile les sources PHP dans un format qu'il peut exécuter, ainsi le moteur Zend fonctionne comme un interpréteur .

Gaurang Deshpande
la source
2
" Autrement dit, le code exécutable est spécifié dans la langue native du CPU " .. Le code exécutable n'est pas spécifié dans la langue native du CPU mais au format binaire, la langue native du CPU peut être n'importe quoi et lorsque les binaires logiciels ne sont pas comme c'est le cas pour cela CPU ou ce CPU .. Un code entièrement compilé et exécutable sera au format binaire ..
hagrawal
10

C'est une question dénuée de sens. PHP utilise yacc (bison), tout comme GCC. yacc est un "compilateur compilateur". La sortie de yacc est un compilateur. La sortie d'un compilateur est "compilée". PHP est analysé par la sortie de yacc. Il est donc, par définition, compilé.

Si cela ne satisfait pas, considérez ce qui suit. Php (le binaire) et gcc lisent votre code source et produisent un arbre de syntaxe abstrait. Sous les versions 4 et 5, php parcourt ensuite l'arborescence pour traduire le programme en bytecode (étape de compilation). Vous pouvez voir le bytecode traduit en opcodes (qui sont analogues à l'assemblage) à l'aide du Vulcan Logic Dumper . Enfin, php (en particulier, le moteur Zend) interprète le bytecode. gcc, en comparaison, parcourt l'arborescence et produit l'assemblage; il peut également exécuter des assembleurs et des éditeurs de liens pour terminer le processus. Appeler un programme géré par l'un "interprété" et un autre programme géré par l'autre "compilé" n'a aucun sens. Après tout, les programmes sont tous deux exécutés via un «compilateur» avec les deux.

Vous devriez plutôt poser la question que vous souhaitez poser. ("Dois-je payer une pénalité de performance car PHP recompile mon code source pour chaque requête?", Etc.)

jrockway
la source
5
Tokeniser un code source n'est pas une compilation. Même VBScript peut être considéré comme un langage compilé avec votre définition.
Sedat Kapanoglu
5
Je suis avec jrockway à ce sujet, même si cela ne répond pas vraiment à la question du PO. Il est tentant de créer une taxonomie des langues dans laquelle chaque langue est placée proprement dans chaque catégorie. Mais la réalité n'est pas si nette. Presque chaque langue est un mélange de caractéristiques. De plus, lorsque vous y arrivez, même le code machine natif est "interprété" par le processeur.
Barry Brown
4
Votre affirmation de haut niveau est correcte, c'est une question dénuée de sens. Votre argument n'est cependant pas très utile, tout ce que vous avez fait est de prendre des définitions floues et de les pousser à l'extrême. La compilation est la transformation de la source en code objet. Oui, vous pouvez considérer la transformation de la source en un arbre de syntaxe concret / abstrait comme une compilation, mais ce n'est pas ce que la plupart des gens veulent dire, n'est-ce pas? Peu importe, c'est une question dénuée de sens parce qu'une langue n'est pas INTRINSÈQUEMENT compilé ou interprété, implmentations d'une langue sont compilées ou interprétées.
Falaina
6
ne veillons pas à ce que le gars soit un débutant. cela me fait interpréter la question comme "l'implémentation de Zend produit-elle du code natif à partir d'une source PHP?". regardez ma réponse. Je pense que vous êtes trop strict sur la façon dont la question est posée. vous savez, nous essayons d'aider, pas de dénigrer certains débutants.
Sedat Kapanoglu
3
Je suis entièrement d'accord avec Sedat. Vous pouvez partager vos connaissances sans être une bite pour le demandeur
Alexandre Bourlier
10

Je sais que cette question est ancienne mais elle est liée partout et je pense que toutes les réponses ici sont incorrectes (peut-être parce qu'elles sont anciennes).

Il n'y a PAS de langage interprété ou de langage compilé. Tout langage de programmation peut être interprété et / ou compilé.

Tout d'abord, un langage n'est qu'un ensemble de règles, donc quand nous parlons de compilation, nous nous référons à des implémentations spécifiques de ce langage.

HHVM , par exemple, est une implémentation de PHP. Il utilise la compilation JIT pour transformer le code en bytecode HipHop intermédiaire, puis traduit en code machine. Suffit-il de dire qu'il est compilé? Certaines implémentations Java (pas toutes) utilisent également JIT. Le V8 de Google utilise également JIT.

Utiliser les anciennes définitions de compilé ou interprété n'a pas de sens de nos jours.

"PHP est-il compilé?" est une question insensée étant donné qu'il n'y a plus de délimiteurs clairs et convenus entre ce qui est un langage compilé et un langage interprété.

Une façon possible de les délimiter est (je ne trouve aucun sens à cette dichotomie):

les langages compilés utilisent la compilation Ahead of Time (C, C ++);

les langages interprétés utilisent la compilation Just in Time ou pas de compilation du tout (Python, Ruby, PHP, Java).

Claudiu Creanga
la source
Cependant, Java n'utilise-t-il pas la compilation à l'avance dans la plupart des cas? Je suis un développeur Java assez récent et nous compilons généralement notre code avant l'exécution.
aCarella
@aCarella in most cases, oui. dans tous les cas, non. vous ne pouvez donc pas tracer une ligne sémantiquement significative et acceptée.
Claudiu Creanga
2

Au moins, il ne compile pas (ou devrais-je dire optimiser) le code autant que l'on pourrait le vouloir.

Ce code ...

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

... retarde le programme de la même manière à chaque exécution.

Il aurait pu détecter que c'est un calcul qui ne doit être fait que la première fois.

Magnus Andersson
la source
Maintenant, nous avons une option appelée générateurs.
Ankit Vishwakarma
1

La réponse acceptée est manifestement fausse. PHP est compilé. Fin de l'histoire. Peut-être pas à des instructions natives mais à un bytecode interprété.

RichieHH
la source