Maison >développement back-end >Problème PHP >PHP est-il un langage interprété ou un langage compilé ?
Cet article vous présentera les types de langage PHP. 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é
Utiliser un compilateur spécialisé (similaire à Visual Studio sous Windows), cibler des plateformes spécifiques (Système d'exploitation)" traduit « un certain code source de langage de haut niveau en code machine (y compris les instructions machine et les opérandes) exécuté par le matériel de la plate-forme en une seule fois, et le conditionne dans un format de programme exécutable (.exe) qui peut être reconnu par la plate-forme. , ce processus de conversion est appelé compilation. Le programme exécutable compilé peut être séparé de l'environnement de développement et exécuté indépendamment sur une plateforme spécifique. Une fois certains programmes compilés, ils peuvent également avoir besoin de lier d'autres codes objet compilés, c'est-à-dire d'assembler deux ou plusieurs modules de code objet pour générer le programme exécutable final. De cette manière, une réutilisation du code de bas niveau est obtenue.
Le code du langage compilé est compilé une fois et utilisé à plusieurs reprises. Autrement dit, les prédécesseurs plantaient des arbres et les descendants profitaient de l’ombre.
C, C++, Objective-C, etc. sont tous des langages compilés
Langages interprétés
Précompilez le programme source dans un langage intermédiaire avant l'exécution du programme, puis le langage intermédiaire est exécuté par l'interprète
Chaque fois qu'un programme dans un langage interprété est exécuté, il doit être compilé une fois, donc les programmes dans les langages interprétés s'exécutent généralement moins efficacement et ne peuvent pas s'exécuter indépendamment de l'interpréteur.
C#, PHP, Python, Java, etc. sont tous des 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
L'un des plus grands avantages des langages compilés est leur vitesse d'exécution. Les programmes écrits en C/C++ s'exécutent de 30 à 70 % plus rapidement que les mêmes programmes écrits en Java.
Inconvénients
Inconvénients - les compilateurs sont beaucoup plus difficiles à écrire que les interprètes
Compilation Le débogueur ne le fait pas fournir beaucoup d'aide lors du débogage d'un programme - combien de fois avez-vous rencontré une "exception de pointeur nul" dans votre code C et passé des heures à essayer de déterminer où se trouvait l'erreur dans le code.
Le code compilé exécutable est beaucoup plus volumineux que le même code interprété. Par exemple, un fichier .exe C/C++ est beaucoup plus volumineux qu'un fichier Java .class ayant les mêmes fonctionnalités.
Les programmes compilés sont spécifiques à la plateforme et donc dépendants de la plateforme.
Les programmes compilés ne prennent pas en charge la sécurité implémentée dans le code - par exemple, un programme compilé peut accéder à n'importe quelle zone de mémoire et faire ce qu'il veut sur votre PC (la plupart des virus sont écrit à l'aide de langages compilés)
En raison de la faible sécurité et des dépendances de la plate-forme, les langages compilés ne conviennent pas au développement d'applications Internet ou basées sur le Web.
Langage interprété
Avantages
Excellent support de débogage. Cela ne prend que quelques minutes à un programmeur PHP pour localiser et corriger une "exception de pointeur nul" car l'environnement d'exécution PHP indique non seulement la nature de l'exception, mais donne également le numéro de ligne spécifique et la séquence d'appel de fonction où l'exception se produit ( les fameuses informations de trace de pile). Une telle commodité n'est pas fournie par les langages compilés.
L'interpréteur est plus facile à mettre en œuvre que le compilateur
Excellente indépendance de la plateforme
Haute sécurité - ceci est nécessaire de toute urgence pour les applications Internet
La taille du code de langue intermédiaire est beaucoup plus petite que le code exécutable compilé
Inconvénients
prend plus de mémoire et de ressources CPU. En effet, pour exécuter un programme écrit dans un langage interprété, il faut d'abord exécuter l'interpréteur associé. Les interprètes sont des programmes complexes, intelligents, gourmands en ressources et ils consomment beaucoup de cycles CPU et de mémoire.
L'efficacité d'exécution est beaucoup plus lente que celle des programmes compilés. L'interpréteur effectue de nombreuses optimisations de code et contrôles de sécurité d'exécution ; ces étapes supplémentaires consomment plus de ressources et ralentissent davantage l'application.
OK, grâce à 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 C'est Zend Engine.
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). Après avoir exécuté cette fonction : 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.
Deux petites questions ici : 1 : C'est quoi 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. logique de traitement (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, tandis que goto n'a pas du tout besoin de juger et passe directement au segment de code logique de la troisième commande pour l'exécution. C'est mieux que Switch réduit la perte de jugement séquentiel de haut en bas, donc : l'efficacité de goto est supérieure à switch. Donc, ces trois méthodes de distribution sont généralement : goto > switch > call
Hors sujet : étant donné que PHP appelle par défaut, si vous souhaitez épuiser davantage les performances de PHP, vous pouvez modifier sa méthode de distribution de commandes en goto . Cependant, bien que la méthode goto améliore la vitesse d’exécution, la vitesse de compilation est en réalité la plus lente.
------------------------------------------------------ ------ -------------------------------------------- ------ -------------------------------------------- ------ --
Parlons de la faiblesse de la séparation de compilation et d'exécution de PHP :
En fait, ce n'est pas une faiblesse bien que le moteur zend (la machine virtuelle de php) sépare strictement la compilation et l'exécution, mais du point de vue de 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 exécuter ces deux étapes : compiler->exécuter. 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 également 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.
Cette méthode améliore l'efficacité de PHP dans une certaine mesure, mais ce n'est pas la méthode ultime. La méthode ultime est de passer à un langage compilé, haha~~~
---. -------------------------------------------------- ----------- --------------------------------------- ----------- --------------------------------------- -
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échiffrer 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 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. . .
Ha~ C'est aussi simple que cela. Bien sûr : ce processus n'est pas aussi simple qu'on le dit, et vous ne pouvez pas modifier directement la fonction zend_compile_file(). En fin de compte, vous devez étendre et implémenter un module vous-même pour gérer ce processus.
Conclusion :
PHP est un langage interprété. Le code PHP est interprété en opcode puis transmis au moteur Zend pour exécution.
Utiliser 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!