J'ai ajouté une fonction à CPython (construction et compréhension de la structure)

1.Tout d'abord

Cette section décrit la construction CPython et la structure de fichier CPython requises pour ajouter des fonctionnalités à CPython. Cet article utilise Python 3.10.

J'ai ajouté une fonction à CPython (opérateur ternaire) Ajoutez deux types d'instructions switch à python Incrément de préfixe

2. Qu'est-ce que CPython?

CPython est un Python écrit en langage C, et lorsqu'il est généralement appelé Python, il fait souvent référence à ce Python. Le code est géré sur GitHub et vous pouvez également publier un PR.

3. Construisez CPython

L 'Article officiel est très utile pour construire CPython. Tout d'abord, clonez le code du référentiel CPython 3.10.


$ git clone https://github.com/python/cpython

Modifiez ensuite le répertoire et exécutez le script de configuration. Ici, -g inclut des «symboles de débogage» dans le fichier exécutable, et -O0 est le niveau d'optimisation le plus bas. De plus, le dossier à installer est spécifié en ajoutant --prefix.


$ cd cpython
$ CFLAGS="-O0 -g" ./configure  --with-pydebug   --prefix=(Répertoire d'installation)

Ensuite, compilez et installez.

$ make -s -j2
$ make install

Vous pouvez maintenant installer CPython en toute sécurité. Pour exécuter le Python installé:

$cd (répertoire installé)/bin
$ ./python3

4. Ajout de fonctions à CPython

La Liste de contrôle pour ajouter des fonctions à CPython est officiellement résumée. Dans ce qui suit, nous expliquerons en référence à cela.

4.1 Structure du fichier CPython

Ce sont les quatre fichiers les plus importants que vous apportez lors de l'ajout de fonctionnalités à CPython. Je vais les examiner dans l'ordre. スクリーンショット 2020-10-20 18.40.25.png

4.1.1 python.gram Tout d'abord, parlons de python.gram. スクリーンショット 2020-10-25 12.00.23.png C'est un fichier dans Grammer / python.gram de CPython. python.gram définit la grammaire de Python. Écrivez la syntaxe à ajouter dans ce fichier.


$ make regen-pegen

Il générera automatiquement un analyseur.

4.1.2 python.asdl Ensuite, je vais expliquer python.asdl. スクリーンショット 2020-10-25 12.00.27.png Un fichier pour créer un arbre de syntaxe abstraite (AST). Si vous avez défini une nouvelle fonction dans python.gram, vous devez également écrire la définition de la fonction dans ce fichier.


$ make regen-ast

AST est généré automatiquement.

4.1.3 compile.c Ensuite, je vais expliquer à propos de compile.c. スクリーンショット 2020-10-25 12.00.29.png Un fichier qui convertit AST en bytecode. Décrivez le traitement de chaque syntaxe en code octet. Lors de l'ajout d'une grammaire, décrivez ici le traitement de cette grammaire en code octet.

4.1.4 ceval.c Ensuite, je vais expliquer ceval.c. スクリーンショット 2020-10-25 12.00.32.png Exécutez le code d'octet. Si le code d'octet existant ne peut pas être implémenté, ajoutez un nouveau code d'octet ici.

5. Résumé

Jusqu'à présent, nous avons expliqué comment construire et comprendre la structure de CPython. La quantité de code en CPython est énorme, mais j'ai senti que la quantité de code qui nécessitait une attention était petite car la procédure de modification de la syntaxe était organisée dans la liste de contrôle officielle.

Matériel de référence

Recommended Posts

J'ai ajouté une fonction à CPython (construction et compréhension de la structure)
J'ai ajouté une fonction à CPython (opérateur ternaire)
Je veux créer un environnement Python
J'ai essayé de créer une méthode de super résolution / ESPCN
J'ai essayé de créer une méthode de super résolution / SRCNN ①
J'ai essayé de créer une méthode de super résolution / SRCNN ③
J'ai essayé de créer une méthode de super résolution / SRCNN ②
Je souhaite créer facilement un environnement de développement basé sur un modèle
[Go + Gin] J'ai essayé de créer un environnement Docker
Comment appeler une fonction
J'ai fait une fonction pour vérifier le modèle de DCGAN
Ajout de la fonction de réussite à Sublime Text
Je viens d'écrire un script pour construire Android sur une autre machine
Comment créer une fonction récursive
J'ai écrit une fonction pour charger le script d'extension Git en Python
Ajout d'une fonction pour enregistrer les décalages souhaités dans la table des décalages Django
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
Comment créer un environnement de traduction sphinx
Je veux imprimer dans la notation d'inclusion
J'ai essayé de créer un linebot (préparation)
J'ai demandé à la tortue de dessiner une fonction triangulaire
Un simple script IDAPython pour nommer une fonction
J'ai essayé d'ajouter un post-incrément à l'implémentation CPython
J'ai fait un script pour afficher des pictogrammes
J'ai créé une API Web
J'ai essayé de créer une fonction de dictionnaire insensible à la casse
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
Je veux faire de matplotlib un thème sombre
Je souhaite créer facilement un modèle de bruit
Je veux INSÉRER un DataFrame dans MSSQL
Comment créer un objet fonction à partir d'une chaîne
Je veux créer une fenêtre avec Python
Comment créer un dictionnaire avec une structure hiérarchique.
Je veux faire un jeu avec Python
Je ne veux pas passer un test de codage
J'ai créé un outil pour compiler nativement Hy
Je souhaite créer un type d'implémentation pouvant être branché
J'ai lu "Comment créer un laboratoire de piratage"
J'ai écrit un script pour télécharger un plug-in WordPress
J'ai essayé de générer une chaîne de caractères aléatoire
J'ai créé un outil pour obtenir de nouveaux articles
J'ai essayé d'ajouter un post-incrément à l'édition CPython Extra
Je veux trouver facilement une délicieuse boutique
[Go] Comment écrire ou appeler une fonction
Je veux écrire dans un fichier avec Python
[PyTorch] Exemple ⑧ ~ Comment créer un modèle complexe ~
Comment se moquer d'une fonction publique dans Pytest
Je souhaite utiliser la fonction d'activation Mish
J'ai créé un jeu ○ ✕ avec TensorFlow
Je souhaite télécharger une application Django sur heroku
Je ne peux pas dormir tant que je n'ai pas construit un serveur !! (Introduction au serveur Python faite en un jour)