Google hat Grumpy veröffentlicht, um Python-Code in Go zu konvertieren.
Google Open Source Blog: Grumpy: Go running Python! google/grumpy: Grumpy is a Python to Go source code transcompiler and runtime.
Python verfügt standardmäßig über ein Ast-Modul, das den direkten Kontakt mit den Ergebnissen der Syntaxanalyse ermöglicht.
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()))])
Es scheint, dass Grumpy beim Besuch des Syntaxbaums mit NodeVisitor auch Code generiert. Wenn Sie es grob lesen, scheint das Ergebnis eines Besuchs bei Visitor als Zeichenfolge zurückgegeben zu werden.
py2cpp
https://github.com/mugwort-rc/py2cpp
Ich erinnerte mich, dass ich vor einiger Zeit an einem Tool namens py2cpp arbeitete, weil ich dasselbe mit C ++ machen wollte.
Persönlich habe ich beim Schreiben von Portcode oft die versprochene Syntax der portierten Sprache gelesen, aber ich war besorgt darüber, wie ich diesen Prozess ausdrücken kann, und als ich NodeVisitor, Transformer (Vorprozess) und Hook (Nachprozess) besuchte. ), Und geben Sie den umwickelten Knoten aus, damit er später auf verschiedene Arten geknetet werden kann. (Geben Sie "tuple" mit "std :: make_tuple" aus und ersetzen Sie den Operator "**" durch "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;
}
Das Problem ist, dass der erste Typ "x = 0" fehlt, aber ansonsten denke ich, dass der C ++ - Code, der sich nicht seltsam anfühlt, ausgespuckt wird. Ich werde später Informationen zu den Typinformationen geben, oder ich denke, dass Auto für diesen Teil ausreicht, daher möchte ich ihn verbessern.
py2cpp :: range
ist ein Alias, der boost :: irange
mithilfe von Variadic Templates aufruft.
$ 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;
}
Hinweise zum Typ PEP483 wurden seit Python 3.5 eingeführt.
Auf diese Weise können Sie Funktionsargumenten Typwerte hinzufügen und Werte zurückgeben.
Benimmt es sich nicht ziemlich gut?
Wenn es sich um ein Programm mit einfacher Logik handelt, kann es in naher Zukunft sein, es in Python zu schreiben, in C ++ zu konvertieren und es mit boost.python oder [pybind11] 4 in Python aufzurufen.
py2cpp selbst wird in GPLv3 veröffentlicht.
Die Produktausgabe mit py2cpp ist ** nicht wie das Produkt von GCC mit GPL ** infiziert **.
Py2cpp.hpp unter include wird unter Boost Software License veröffentlicht.
Ich habe mich nur daran erinnert, dass ich viele Dinge zu tun hatte, z. B. den Typ zu bestimmen und die integrierte Funktion zu implementieren. Wenn Sie also Python-Code C ++ wie mich erstellen möchten, bearbeiten Sie ihn für eine Weile und senden Sie eine Pull-Anfrage. I würde es schätzen wenn du könntest. Es wäre hilfreich, wenn Pururiku auf Japanisch ist. Wie Sie aus Gits Kommentaren sehen können, ist Englisch unpraktisch ...
[Bücherwurm: Google kündigt Grumpy an, eine Python-Implementierung von Go] 3
Recommended Posts