J'ai des problèmes pour comprendre le concept d'un runtime library
, en particulier le Python one. J'ai donc écrit un bonjour python programme et j'ai l'intention de l'exécuter, donc j'écris python ./hello_world.py
.
Quelles étapes se produisent entre moi appuyant sur le bouton Entrée et le code machine généré à partir de mon python en cours d'exécution sur mon processeur? Et comment cela se rapporte-t-il au Python système d'exécution et/ou bibliothèque?
Aussi divers soient-ils, il existe une poignée de concepts communs que tous les langages de programmation modernes et sérieux partagent. Deux d'entre eux sont au cœur de la réponse à vos questions ci-dessus.
Quelles étapes se produisent entre le fait que je clique sur le bouton Entrée et que le code machine généré à partir de mon code [python _ soit exécuté sur mon processeur?
Le code est analysé, analysé et introduit dans un interprète. Il s'agit d'un domaine très important de l'informatique connu sous le nom de théorie du compilateur. Un compilateur est un programme qui traduit du code d'une langue (votre code source) vers une autre langue (généralement du code machine, bien qu'il existe des "transpilers" qui traduisent d'une langue de haut niveau dans une autre). C'est un sujet vraiment énorme que vous pourriez passer des années à rechercher, mais voici la version de base:
Le compilateur commence par un analyseur, une routine qui lit votre code source et lui applique les règles de syntaxe du langage pour déterminer s'il est logique comme valide Python (dans votre cas) code. Si ce n'est pas le cas, l'analyseur générera une erreur et le compilateur sortira, mais si c'est le cas, l'analyseur sort ce qui est connu sous le nom d'arbre de syntaxe abstraite, ou AST pour faire court. Le AST est une structure de données arborescente dont les nœuds contiennent chacun un élément de la syntaxe. Par exemple, si vous dites x = 5
, Vous pourriez vous retrouver avec un nœud BinaryExpression
avec une valeur operator
de =
, Un Left
valeur de ReferenceExpression(x)
et une valeur de Right
de IntegerLiteralExpression(5)
. Tout votre programme peut être représenté par un grand arbre comme celui-ci.
Une fois que l'analyseur produit un AST, la deuxième phase est analyse sémantique. En anglais simple, cela signifie "comprendre ce que cela signifie AST". Il vérifie le AST pour déterminer si vous avez fait quelque chose d'illégal même si c'est une analyse valide, (par exemple, essayer d'appeler une fonction à 1 argument avec 3 arguments) et déclenche des erreurs si vous le faites. Sinon, il analyse le AST et y apporte des modifications pour le rendre plus simple à comprendre pour une machine.
La troisième phase est la génération de code. Une fois que vous avez un AST entièrement analysé, simplifié et valide, vous l'alimentez dans le générateur, qui parcourt le AST et produit du code dans la langue de sortie. Ceci est votre produit fini.
Avec Python, il utilise un interpréteur plutôt qu'un compilateur. Un interpréteur fonctionne exactement de la même manière qu'un compilateur, à une différence près: au lieu de générer du code, il charge la sortie en mémoire et l'exécute directement sur votre système. (Les détails exacts de la façon dont cela se produit peuvent varier considérablement entre différentes langues et différents interprètes.)
Et comment cela se rapporte-t-il au système d'exécution et à la bibliothèque Python?
Tous les langages, à l'exception des plus simples, sont livrés avec un ensemble de fonctions prédéfinies qui sont importantes pour un grand pourcentage d'utilisateurs et seraient difficiles à mettre en œuvre par les utilisateurs eux-mêmes pour une raison ou une autre. Leur code peut appeler ces fonctions sans avoir besoin de bibliothèques tierces. (Par exemple, dans Python vous avez print
, qui envoie la sortie à stdout
. Bonne chance pour l'implémentation par vous-même!) Cet ensemble de fonctions est généralement collecté dans un bibliothèque partagée que le code peut appeler au moment de l'exécution, c'est pourquoi elle est connue sous le nom de bibliothèque d'exécution de langage, ou simplement "runtime" pour faire court.
L'implémentation standard Python est une machine virtuelle à code octet. Cela signifie que le code machine (opcodes de l'opcode de votre processeur) set) est pas généré à partir de votre programme. Les opcodes sont uniquement sélectionnés parmi les opcodes déjà compilés dans la machine virtuelle tandis que le VM interprète le code d'octet.
Comment votre programme est transformé en code octet en premier lieu est une question légèrement différente, mais la réponse courte est "grâce à la compilation, comme toute autre traduction de langue vers le bas".