Une minute pour comprendre si PHP est interprété ou compilé ?

慕斯
Libérer: 2023-04-10 08:44:02
avant
3110 Les gens l'ont consulté

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.

Une minute pour comprendre si PHP est interprété ou compilé ?

Langage compilé

  • Utiliser un compilateur spécialisé (similaire à Visual Studio sous Windows) pour « traduire » 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 plateforme pour une plateforme spécifique (système d'exploitation) à la fois ) et le conditionner dans un format de programme exécutable (.exe) reconnu par la plateforme. 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 de langue 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

  • avant l'exécution du programme Le programme source est précompilé dans un langage intermédiaire, 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 l'efficacité d'exécution de l'interprété les programmes linguistiques sont généralement faibles et ne peuvent pas fonctionner indépendamment de l'interprète.
  • 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.
  • Les programmes compilés consomment moins de mémoire que les programmes interprétés.

Inconvénients

  • Inconvénients : les compilateurs sont beaucoup plus difficiles à écrire que les interprètes
  • Les compilateurs ne le font pas Cela ne fournit pas beaucoup d'aide lors du débogage des programmes – combien de fois avez-vous rencontré une « exception de pointeur nul » dans votre code C et il a fallu des heures pour 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

  • Occupe 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, à 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!

Étiquettes associées:
php
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!