Cet article vous expliquera en une minute si PHP est interprété ou compilé ? Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.
Langage compilé
Langages interprétés
OK, grâce à une simple compréhension des concepts ci-dessus, vous pouvez avoir une compréhension générale des langages interprétés et compilés. Puisque les deux partagent le monde à parts égales, examinons les avantages de chacun.
Langages compilés
Avantages
Inconvénients
Langage interprété
Avantages
Inconvénients
OK, à travers l'étude ci-dessus, je pense que tout le monde a une compréhension générale des langages interprétés et des langages compilés, et le langage PHP est un langage interprété, et l'interprète qui interprète le langage PHP est le Zend moteur .
De plus, sur la base de la comparaison des avantages et des inconvénients des deux, on peut constater que les langages compilés sont plus adaptés aux opérations de bas niveau, tandis que les langages interprétés sont principalement utilisés dans le développement Web. .
Discutons en profondeur du processus d'exécution de PHP :
La compilation et l'exécution de PHP sont séparées, c'est-à-dire : la compilation est d'abord terminée, puis exécutée. Beaucoup de gens diront : c’est effectivement la même chose pour le C++. Cependant, cette séparation de PHP peut nous apporter de nombreux avantages, mais elle présente bien sûr également de nombreux inconvénients.
Parlons d'abord de l'ensemble du processus :
①php appellera la fonction de compilation zend_compile_file() pour compiler. L'implémentation spécifique de cette fonction comprend en fait deux processus principaux : l'analyse lexicale (implémentation Lex) et l'analyse syntaxique (implémentation Yacc). Lorsque cette fonction est exécutée : la compilation du script php est terminée. L'entrée de cette fonction est : un fichier de script php, et la sortie est op_array : pour faire simple : le processus de compilation consiste à analyser le script en instructions que la machine virtuelle php peut traiter, et op_array est simplement un tableau composé de ces instructions. (Ceci est très similaire au code assembleur généré par la compilation de certains langages compilés, qui sont également des commandes une par une).
② : Ensuite, la machine virtuelle php appellera la fonction zend_execute() pour l'exécuter. L'entrée de cette fonction est l'op_array généré lors de l'étape de compilation ci-dessus, où elle analysera chaque commande et la traitera. Puisqu'il y a environ 150 commandes opérationnelles au total, il doit traiter ces 150 commandes. Une question très intéressante se pose ici : comment gère-t-il ces 150 commandes ? Tout d'abord, chaque commande dispose d'un processeur correspondant pour le traitement. Par conséquent : la machine virtuelle sera distribuée au processeur correspondant pour un traitement en fonction du type de chaque commande dans op_array.
Il y a deux petites questions ici : 1 : Quel est le processeur ici ? 2 : Comment est-il distribué ?
Pour répondre à ces deux questions, nous devons l'expliquer à partir du mécanisme de distribution : Il existe trois mécanismes permettant à la machine virtuelle PHP de distribuer des commandes : CALL, SWITCH et GOTO. PHP utilise la méthode CALL par défaut, et. Autrement dit, tous les processeurs d'opcodes sont définis comme des fonctions puis appelés par la machine virtuelle. Cette méthode est la méthode traditionnelle et est généralement considérée comme la méthode la plus stable. La méthode SWITCH et la méthode GOTO distribuent les opcodes via switch et goto. traitement de la logique (segment) pour l'exécution.
Répondons maintenant aux deux questions ci-dessus :
1 : Le processeur traite réellement la logique de la commande op. Il peut exister sous la forme d'une fonction ou d'un segment logique, selon la manière dont la commande est distribuée.
2 : Il existe trois méthodes de distribution : call, switch et goto. Lequel est le plus efficace ? En fait, vous pouvez déjà avoir une première compréhension à partir de l’explication ci-dessus. switch et goto ont tous deux des segments logiques correspondants dans la fonction zend_execute(), qui peuvent être exécutés directement. L'appel consiste à exécuter l'appel de fonction dans la fonction zend_execute(). C'est évident : l'efficacité des appels de fonction est la plus faible, et vous devez la mettre sur la pile après l'avoir appelée une fois ! Donc en termes d'efficacité : l'appel est le plus faible. Pour switch et goto : Par exemple, si vous souhaitez exécuter le traitement de la troisième commande : switch doit d'abord juger s'il s'agit des deux premières, mais goto n'a pas du tout besoin de juger et passe directement au segment de code logique de la troisième commande d'exécution est meilleure que Switch réduit la perte de jugement séquentiel de haut en bas, donc : l'efficacité goto est supérieure à switch. Donc ces trois méthodes de distribution en général : goto > switch > call
Parlons de la faiblesse de la séparation de la compilation et de l'exécution de PHP :
En fait, Je ne peux pas C'est considéré comme une faiblesse. Bien que le moteur zend (la machine virtuelle de php) sépare strictement la compilation et l'exécution, pour l'utilisateur : c'est comme s'il n'y avait pas de séparation, car à chaque fois que j'exécute une requête de script PHP, je dois le faire. exécuter : compiler->exécuter ces deux étapes. Aucune scène ne manque. On peut donc comparer cela avec un langage compilé comme le C++ : Exécutez la même requête 100 fois
① Pour le C++, puisqu'il ne doit être compilé qu'une seule fois au début, il ne sera pas compilé à nouveau après l'avoir été. compilé. , il suffit de l'exécuter, donc la perte est de :
1 compilation + 100 exécutions
② Pour php, il faut le compiler + l'exécuter à chaque fois, donc la perte est de :
100 compilations + 100 exécutions
Évidemment : d'un point de vue quantitatif, les langages interprétés consomment bien plus que les langages compilés. Pour le dire franchement : la séparation entre compilation et exécution de PHP n’est pas une véritable séparation. Le type C++ est la véritable séparation.
PHP est conscient de ce problème depuis longtemps, il a donc pensé à un moyen de résoudre ce problème : cette solution est eAccelerator. L'idée principale est la suivante :
Après la première exécution du script, le script compilé est enregistré d'une certaine manière (op_array y est stocké pendant la durée de validité du cache que nous avons spécifiée, lorsque le). Le script est exécuté pour la deuxième fois. À ce stade, il n'est pas nécessaire d'effectuer un travail de compilation répétitif, mais d'appeler et d'exécuter directement le fichier compilé enregistré précédemment, ce qui améliore considérablement les performances du programme.
Enfin, parlons des avantages de séparer la compilation et l'exécution PHP
Cet avantage est en fait pour les programmeurs, pas pour les utilisateurs ; En raison de la séparation de ces deux étapes, nous pouvons faire certaines choses que nous souhaitons faire ici.
Par exemple, si vous souhaitez crypter et décrypter des fichiers, vous souhaitez crypter certains fichiers de code source du script php afin que les utilisateurs ne puissent pas voir le code source. Dans le même temps, ce fichier de code source crypté peut être analysé et traité par la machine virtuelle PHP. Bien sûr : pour y parvenir, il faut d’abord réfléchir à l’algorithme de chiffrement et de déchiffrement et s’assurer qu’il s’agit d’un processus réversible.
Maintenant que vous avez chiffré le fichier de code source php, vous devez définir le suffixe de ce fichier chiffré, en supposant qu'il soit : *.buaa. La question est : Comment pouvons-nous permettre à la machine virtuelle PHP de traiter les fichiers avec ce suffixe ? Cela nécessite la séparation de la compilation et de l’exécution mentionnée ci-dessus.
Rappel : l'entrée de la phase de compilation est le fichier source php, et la sortie est op_array. OK, faisons des histoires à ce stade. L'idée principale est la suivante : d'abord dans la fonction de compilation zend_compile_file() : regardez le suffixe du fichier d'entrée : s'il s'agit d'un .php normal, alors suivez la logique normale si c'est *.buaa, puis décryptez-le d'abord puis suivez ; la logique normale. . .
Conclusion :
PHP est un langage interprété. Le code PHP est interprété en opcode puis remis au moteur Zend pour exécution.
Utilise APC pour mettre en cache l'opcode, réduisant ainsi le temps nécessaire à PHP pour l'interpréter comme opcode.
Apprentissage recommandé : Tutoriel vidéo php
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!