Quest-ce que CPython?

Meilleure réponse

CPython est limplémentation de référence de Python écrite en langage de programmation C. Il existe un certain nombre dautres implémentations, y compris même dautres en C. Mais CPython est la plus largement utilisée et celle contre toutes les autres est comparée.

Python est une spécification de langage. Si lon se réfère aux détails de limplémentation en spécifiant une implémentation particulière, alors lhypothèse raisonnable sera quelle fait référence à la version CPython.

Vous pouvez rechercher des implémentations, mais les résultats sont susceptibles dêtre quelque peu déroutants. Toutes les implémentations ne sont pas terminées, et elles ne sexécutent pas toutes sur des systèmes «normaux» ou dans des environnements dexécution de programme conventionnels (comme une fenêtre de terminal ou une console texte).

Par exemple MicroPython est un dérivé réduit de CPython qui est destiné aux micro-contrôleurs. Jython est écrit en Java et sexécute dans la JVM (Java Virtual Machine) et inclut des fonctionnalités pour importer Java natif et interagir avec lui (y compris lintrospection). IronPython est écrit en C # de Microsoft et est conçu pour sexécuter dans le CLR (Common Language Runtime) du framework .NET. PyPy est une version de Python qui est principalement écrite en Python, mais enroulée autour dun noyau qui implémente un sous-ensemble restreint du langage et fournit JIT (Just-In- Compilation dymanique / runtime). (Ce sous-ensemble sappelle RPython et est destiné à prendre en charge plus que juste Python).

Voyez ce que je veux dire par confusion?

Il existe au moins deux implémentations différentes de Python qui sont écrites en JavaScript et conçues pour fonctionner à partir dun navigateur normal (dans le DOM… ou Documenr Modèle dobjet… environnement). Ce sont Brython et Skulpt . De plus, il existe plusieurs compilateurs « transpilers » ou Python vers Javascript, dont Transcrypt, et pyjs – (formellement Pyjamas) et peut-être même RapydScript (bien que cela ressemble plus à un hybride de Python avec JS).

Comme vous pouvez le voir , si vous approfondissez suffisamment le sujet, il devient de plus en plus difficile de classer différents projets et outils comme des «implémentations».

Par exemple, il y a Cython qui est un outil pour prendre du code de type Python spécialement annoté et le compiler dans des modules chargeables (binaires / natifs) qui peuvent être importés dans Python et utilisés comme toute autre extension compilée nativement de linterpréteur. Il nest pas vraiment considéré comme une «implémentation» de Python mais plutôt comme un outil pour optimiser des extraits de code Python sélectionnés en extensions binaires de linterpètre CPython. (Si vous travailliez en Jython, vous pourriez réécrire des parties de votre code en Java et utiliser les fonctionnalités dinteropérabilité et dintrospection de Jython pour utiliser ce code. Juste à titre danalogie).

Il y a aussi Numba , qui est un outil pour compiler de manière transparente un sous-ensemble de Python et du code NumPy en LLVM et intégrant le support dexécution LLVM dans le moteur dexécution de linterpréteur Python. Ceci est plus décrit comme un JIT que comme le paradigme module / extension distinctif de Cython. Pourtant, cest plus un outil quune «implémentation» de tout le langage.

Mais alors, si vous regardez Nuitka , vous voyez un projet ambitieux de compilation de programmes Python entiers. Cela pourrait être plus une implémentation.

Encore un autre projet (qui semble être celui sur lequel Guido van Rossum, le créateur de Python, a travaillé) est mypy – Python avec typage statique facultatif et une inférence de type local. Ce ne serait pas une nouvelle mise en œuvre. Cela semble être une sorte de frontend qui traite Python (avec des annotations de type optionnelles) et renvoie le Python (non annoté) dans le moteur dexécution CPython (interpréteur).

Si vous voulez vous plonger dans encore plus dimplémentations et les liens regardent: PythonImplementations – Python Wiki .

Remarque jai couvert beaucoup de ceux-ci ici, et jai essayé dexpliquer comment ils sont liés à tel degré. Cette page wiki est plus un sac à main, avec moins dexposition et quelques liens vers des projets morts ou non maintenus.

Réponse

Même moi, jai eu le même problème à comprendre comment sont CPython, JPython , IronPython, PyPy sont différents les uns des autres.

Je suis donc prêt à clarifier trois choses avant de commencer à expliquer:

  1. Python : Cest un langage, il indique / décrit uniquement comment vous transmettre / vous exprimer à linterpréteur (le programme qui accepte votre code python).
  2. Implémentation : tout dépend de la façon dont linterpréteur a été écrit, en particulier dans quelle langue et ce quil finit par faire .
  3. Bytecode : Cest le code qui est traité par un programme, généralement appelé une machine virtuelle, plutôt que par la « vraie » machine informatique, le processeur matériel.

CPython est limplémentation, qui a été écrite en langage C. Il finit par produire du bytecode (jeu dinstructions basé sur une machine à pile) qui est spécifique à Python, puis lexécute. La raison de la conversion du code Python en bytecode est quil est plus facile dimplémenter un interpréteur sil ressemble à des instructions machine. Mais, il nest pas nécessaire de produire un bytecode avant lexécution (mais CPython produit).

Si vous voulez consulter le bytecode de CPython, vous pouvez le faire. Voici comment vous pouvez:

>>> def f(x, y): # line 1

... print("Hello") # line 2

... if x: # line 3

... y += x # line 4

... print(x, y) # line 5

... return x+y # line 6

... # line 7

>>> import dis # line 8

>>> dis.dis(f) # line 9

2 0 LOAD\_GLOBAL 0 (print)

2 LOAD\_CONST 1 ("Hello")

4 CALL\_FUNCTION 1

6 POP\_TOP

3 8 LOAD\_FAST 0 (x)

10 POP\_JUMP\_IF\_FALSE 20

4 12 LOAD\_FAST 1 (y)

14 LOAD\_FAST 0 (x)

16 INPLACE\_ADD

18 STORE\_FAST 1 (y)

22 LOAD\_FAST 0 (x)

24 LOAD\_FAST 1 (y)

26 CALL\_FUNCTION 2

28 POP\_TOP

6 30 LOAD\_FAST 0 (x)

32 LOAD\_FAST 1 (y)

34 BINARY\_ADD

36 RETURN\_VALUE

Maintenant, jetons un œil au code ci-dessus. Les lignes 1 à 6 sont une définition de fonction. À la ligne 8, nous importons le module « dis » qui peut être utilisé pour afficher le bytecode Python intermédiaire (ou vous pouvez dire, désassembleur pour le bytecode Python) qui est généré par CPython (interpréteur).

REMARQUE : Jai obtenu le lien vers ce code du canal IRC #python: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Et puis, il y a Jython, qui est écrit en Java et finit par produire du code doctet Java. Le code doctet Java sexécute sur Java Runtime Environment, qui est une implémentation de Java Virtual Machine (JVM). Si cela prête à confusion, je soupçonne que vous navez aucune idée du fonctionnement de Java. En termes simples, le code Java (le langage, pas le compilateur) est pris par le compilateur Java et génère un fichier (qui est du code doctet Java) qui ne peut être exécuté quen utilisant un JRE. Ceci est fait pour quune fois le code Java compilé, il puisse être porté sur dautres machines au format de code doctet Java, qui ne peut être exécuté que par JRE. Si cela prête encore à confusion, vous pouvez jeter un œil à cette page Web .

Ici, vous pouvez demander si le CPython  » Le bytecode est portable comme Jython, je suppose que non. Le bytecode produit dans limplémentation CPython était spécifique à cet interpréteur pour faciliter lexécution ultérieure du code (jai aussi soupçonne que, une telle production de bytecode intermédiaire, juste pour la facilité du traitement est effectué dans de nombreux autres interpréteurs). Si vous vous demandez maintenant comment est-il facile dexécuter le bytecode comme indiqué ci-dessus dans le code (après la ligne 9 jusquà la fin ), alors pensez à ceci. Nous avons une pile (structure de données) et chaque ligne du bytecode effectue une opération de pile modifiant la pile en conséquence. Cette pile modifiée est utilisée par CPython (linterpréteur) pour produire la sortie finale du code .

Donc, en Jython, lorsque vous compilez votre code Python, vous vous retrouvez avec du code doctet Java, qui peut être exécuté sur une JVM.

De même, IronPyt hon (écrit en langage C #) compile votre code Python en Common Language Runtime (CLR), qui est une technologie similaire à celle de JVM, développée par Microsoft.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *