Ich möchte C ++ - Code aus Python-Code erstellen!

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.

Tipp Hinweis

$ 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.

Lizenz

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.

Auf der Suche nach Pururiku

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 ...

Referenz

[Bücherwurm: Google kündigt Grumpy an, eine Python-Implementierung von Go] 3

Recommended Posts

Ich möchte C ++ - Code aus Python-Code erstellen!
Ich möchte ein Glas aus Python verwenden
Ich möchte eine Parameterliste aus CloudFormation-Code (yaml) erstellen.
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte ein Spiel mit Python machen
Ich möchte Passungen aus meinem Kopf machen
Ich möchte Ceres Solver aus Python verwenden
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Führen Sie Python-Code über die C # -GUI aus
Ich möchte mit Python debuggen
Ich möchte viele Prozesse von Python aus starten
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte Python mit VS-Code ausführen können
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Ich möchte eine Python-Umgebung erstellen
Ich möchte mit aws mit Python spielen
Ich möchte ein Automatisierungsprogramm erstellen!
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert
Ich möchte Matplotlib zu einem dunklen Thema machen
Ich möchte Dunnetts Test in Python machen
Ich möchte MATLAB feval mit Python verwenden
Änderungen von Python 3.0 zu Python 3.5
Änderungen von Python 2 zu Python 3.0
Ich möchte mich mit Schlüsselwortargumenten von Python merken
Tipps zum Bearbeiten von numpy.ndarray aus c ++ - Ich möchte einen Iterator verwenden -
Ich möchte mit Python ein Fenster erstellen
Schreiben Sie Python2-Code in Python3 um (2to3)
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Ich möchte verschachtelte Dicts in Python zusammenführen
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte APG4b mit Python lösen (Kapitel 2)
Was ich beim Update von Python 2.6 auf 2.7 gemacht habe
Ich möchte die Produkte verkaufen, die ich durch Python Scraping Mercari aufgelistet habe
Ich möchte mit Python in eine Datei schreiben
Ich möchte Python-Code auf VS-Code nach meinen Wünschen formatieren und überprüfen
Ich möchte den Fortschritt in Python anzeigen!
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Ich habe versucht, Python-Code aus .Net mit Pythonnet auszuführen (Hallo World Edition)
Ich möchte den Dateinamen von DataLoader sehen
Ich möchte eine Variable in einen Python-String einbetten
Ich möchte Timeout einfach in Python implementieren
Ich möchte Bilder von Katzen von Instagram erkennen
Ich möchte einen Python-Generator viele Male iterieren
Ich möchte schnell UUID generieren (Gedenknotiz) ~ Python Edition ~
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
Fortsetzung ・ Ich habe versucht, Slackbot zu erstellen, nachdem ich Python3 studiert habe
Ich wollte die Python-Bibliothek von MATLAB verwenden
Ich möchte eine Datei mit Python zufällig testen
Ich möchte mit einem Roboter in Python arbeiten.
So erstellen Sie ein Python-Paket mit VS Code
Ich möchte in Python schreiben! (3) Verwenden Sie Mock