Je veux créer du code C ++ à partir de code Python!

Google a publié Grumpy pour convertir le code Python en Go.

Google Open Source Blog: Grumpy: Go running Python! google/grumpy: Grumpy is a Python to Go source code transcompiler and runtime.

Python a un module ast en standard, qui permet un contact direct avec les résultats de l'analyse syntaxique.

import ast
node = ast.parse('''
def main() -> int:
    print("Hello World!")
    return 0
''')

print(ast.dump(node))
# Module(body=[FunctionDef(name='main', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='Hello World!')], keywords=[])), Return(value=Num(n=0))], decorator_list=[], returns=Name(id='int', ctx=Load()))])

Il semble que Grumpy génère également du code en visitant l'arborescence de syntaxe avec NodeVisitor. Si vous le lisez approximativement, il semble que le résultat de la visite avec Visitor soit renvoyé sous forme de chaîne de caractères.

py2cpp

https://github.com/mugwort-rc/py2cpp

Je me suis souvenu que je travaillais sur un outil appelé py2cpp il y a quelque temps parce que je voulais faire la même chose avec C ++.

Personnellement, lors de l'écriture du code de port, je le lis souvent comme la syntaxe promise du langage porté, mais je m'inquiétais de savoir comment exprimer ce processus, et lorsque j'ai visité NodeVisitor, Transformer (pré-traitement) et Hook (post-traitement) ), Et affichez le nœud enveloppé afin qu'il puisse être malaxé de différentes manières plus tard. (Sortez tuple avec std :: make_tuple, remplacez l'opérateur**par std :: pow ...)

Hello World

$ cat samples/helloworld.py
def main() -> int:
    print("Hello World!")
    return 0

$ python -m py2cpp samples/helloworld.py
#include "py2cpp/py2cpp.hpp"

int main() {
    std::cout << "Hello World!" << std::endl;
    return 0;
}

range-based for

$ cat samples/range.py
def main() -> int:
    x = 0
    for i in range(100):
        x += i
    print(x)
    return 0

$ python -m py2cpp samples/range.py
#include "py2cpp/py2cpp.hpp"

int main() {
    x = 0;
    for (auto i : py2cpp::range(100)) {
        x += i;
    }
    std::cout << x << std::endl;
    return 0;
}

Le problème est que le premier type «x = 0» est manquant, mais à part cela, je pense que le code C ++ qui ne semble pas étrange est en train d'être craché. Je donnerai des informations sur les informations de type plus tard, ou je pense que l'auto est suffisant pour cette partie, alors je voudrais l'améliorer.

py2cpp :: range est un alias qui appelle boost :: irange en utilisant des modèles Variadic.

Indice de saisie

$ cat samples/add.py
def add(x: float, y: float) -> float:
    return x + y

def main() -> int:
    print("2.0 + 3.0 =", add(2.0, 3.0))
    return 0

$ python -m py2cpp samples/add.py
#include "py2cpp/py2cpp.hpp"

double add(double x, double y) {
    return x + y;
}

int main() {
    std::cout << "2.0 + 3.0 =" << add(2.0, 3.0) << std::endl;
    return 0;
}

Les indices de type PEP483 ont été introduits depuis Python 3.5.

Cela vous permet d'ajouter des informations de type aux arguments de fonction et aux valeurs de retour.

N'est-il pas assez bon?

S'il s'agit d'un programme avec une logique simple, il est peut-être proche de l'écrire en Python, de le convertir en C ++ et de l'appeler en Python en utilisant boost.python ou [pybind11] 4.

Licence

py2cpp lui-même est publié en GPLv3.

La sortie du produit utilisant py2cpp n'est ** pas infectée par la GPL ** comme le produit de GCC.

Py2cpp.hpp sous include est publié sous licence logicielle Boost.

À la recherche de Pururiku

Je viens de me rappeler que j'avais beaucoup de choses à faire, comme déterminer le type et implémenter la fonction intégrée, donc si vous voulez faire du code Python C ++ comme moi, éditez-le pendant un moment et envoyez une pull request. J'apprécierais si vous le pouviez. Il serait utile que Pururiku soit en japonais. Comme vous pouvez le voir dans les commentaires de Git, l'anglais n'est pas pratique ...

référence

[Bookworm: Google annonce Grumpy, une implémentation Python par Go] 3

Recommended Posts

Je veux créer du code C ++ à partir de code Python!
Je veux utiliser jar de python
Je souhaite créer une liste de paramètres à partir du code CloudFormation (yaml)
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je veux faire un jeu avec Python
Je veux faire des crises de ma tête
Je veux utiliser le solveur ceres de python
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux écrire en Python! (1) Vérification du format de code
[Python] Je veux faire d'une liste imbriquée un taple
J'ai senti que j'avais porté le code Python en C ++ 98.
Exécuter du code Python à partir de l'interface graphique C #
Je veux déboguer avec Python
Je veux démarrer beaucoup de processus à partir de python
Je souhaite envoyer un message de Python à LINE Bot
Je veux pouvoir exécuter Python avec VS Code
Je veux ajouter un joli complément à input () en python
Je veux créer un environnement Python
Je veux jouer avec aws avec python
Je veux faire un programme d'automatisation!
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
Je veux faire de matplotlib un thème sombre
Je veux faire le test de Dunnett en Python
Je veux utiliser MATLAB feval avec python
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Je veux mémoriser, y compris les arguments de mots clés de Python
Conseils pour manipuler numpy.ndarray à partir de c ++ -Je veux utiliser un itérateur-
Je veux créer une fenêtre avec Python
Réécrire le code Python2 en Python3 (2to3)
[Mémo Python] Je souhaite obtenir un nombre hexadécimal à 2 chiffres à partir d'un nombre décimal
Je veux fusionner des dictionnaires imbriqués en Python
#Unresolved Je veux compiler gobject-introspection avec Python3
Je veux résoudre APG4b avec Python (chapitre 2)
Ce que j'ai fait lors de la mise à jour de Python 2.6 vers 2.7
Je souhaite vendre les produits que j'ai listés par python scraping Mercari
Je veux écrire dans un fichier avec Python
Je veux formater et vérifier le code Python à mon goût sur VS Code
Je veux afficher la progression en Python!
Je souhaite créer une application Web en utilisant React et Python flask
J'ai essayé d'exécuter du code Python à partir de .Net en utilisant Pythonnet (édition Hallo World)
Je veux voir le nom de fichier de DataLoader
Je souhaite intégrer une variable dans une chaîne Python
Je veux facilement implémenter le délai d'expiration en python
Je veux détecter des images de chats d'Instagram
Je veux répéter plusieurs fois un générateur Python
Je veux générer rapidement UUID (memo memo) ~ Edition Python ~
Je veux gérer l'optimisation avec python et cplex
Je veux écrire en Python! (2) Écrivons un test
Suite ・ J'ai essayé de créer Slackbot après avoir étudié Python3
Je voulais utiliser la bibliothèque Python de MATLAB
Je veux échantillonner au hasard un fichier avec Python
Je veux travailler avec un robot en python.
Comment créer un package Python à l'aide de VS Code
Je veux écrire en Python! (3) Utiliser des simulacres