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.
$ 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.
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.
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 ...
[Bookworm: Google annonce Grumpy, une implémentation Python par Go] 3
Recommended Posts