Dies ist ein Plugin für GCC, das gegen libpython verknüpft ist und (ich hoffe), dass Sie willkürliche Python -Skripte aus dem Compiler aufrufen können. Ziel ist es, GCC -Plugins in Python zu schreiben.
Das Plugin ist eine kostenlose Software, die (oder später) unter dem GPLV3 lizenziert ist.
Es ist immer noch in der "experimentellen Proof-of-Concept-Stufe"; Erwarten Sie Unfälle und Tracebacks (ich bin neu in Innenseiten von GCC, und ich habe vielleicht die Dinge missverstanden).
Es ist bereits möglich, dies zu verwenden, um zusätzliche Compiler-Fehler/Warnungen, domänenspezifische Schecks oder statische Analysen hinzuzufügen. Eines meiner Ziele dafür ist es, GCC über die allgemeinen Fehler zu "unterrichten", die Menschen beim Schreiben von Erweiterungen für CPython machen, aber es könnte verwendet werden, um GCC über GTKs Referenzzählungssemantik oder über das Schleusen im Linux-Kernel oder über die Signalsicherheit in APIs zu unterrichten.
Weitere Ideen sind Visualisierungen der Codestruktur. Bei einer gcc.CFG -Instanz werden gccutils.render_to_dot(cfg) und gccutils.invoke_dot(cfg) Graphviz und EOG verwendet, um eine praktische Visualisierung eines Steuerflussdiagramms zu zeichnen, wobei der Quellcode mit GCC GIMPLE -interner Darstellung angezeigt wird.
Die Dokumentation ist zu sehen unter:
http://gcc-python-plugin.readthedocs.io/en/latest/index.html
gcc-N-plugin-dev oder gcc-plugin-devel erhältlich.Ich benutze:
machen
So bauen Sie das Plugin und führen Sie die Tests aus
Sie können auch verwenden:
Demo machen
um die neuen Compiler -Fehler zu demonstrieren.
Die Entwicklung war auf x86_64 und ich weiß nicht, inwieweit es mit anderen Architekturen kompatibel sein wird.
Es gibt noch keinen Installateur. Theoretisch sollten Sie in der Lage sein, diese Argumente zum GCC -Aufruf hinzuzufügen:
gcc -fplugin = python.so -fplugin-arg-python-script = path_to_script.py Other_args
Und lassen Sie es Ihr Skript ausführen, wenn das Plugin beginnt.
Das Plugin fügt automatisch den absoluten Pfad zu seinem eigenen Verzeichnis zum Ende seines Sys.paths hinzu, sodass es Unterstützungsmodule wie GCCUTILS.PY und libcpyChecker finden kann.
Die genaue API befindet sich noch im Fluss; Sie können derzeit eine Verbindung zu Ereignissen herstellen, indem Sie Callbacks -EG für jede Funktion in der Quelle an verschiedenen Pässen registrieren.
Es enthüllt die verschiedenen Typen von GCC als Python -Objekte innerhalb eines "GCC" -Moduls. Sie können die API sehen, indem Sie ausgeführt werden:
GCC importieren Hilfe (GCC)
Aus einem Skript.
Dies sind derzeit drei Projekte in einem:
gcc-python-* : Das Plugin für GCC. Der Einstiegspunkt ( init_plugin ) befindet sich in gcc-python.c .
libcpychecker und cpychecker.py : Eine Python -Bibliothek (und ein Fahrerskript), das für das Plugin geschrieben wurde, in dem ich neue Compiler -Warnungen erstelle, um den Leuten zu helfen, Fehler im CPython -Erweiterungscode zu finden.
cpybuilder : Ein praktisches Modul zum programmatisch generierenden C -Quellcode für CPython -Erweiterungen. Ich benutze dies sowohl, um Teile des GCC -Plugins als auch in den Selbsttests für das CPyChecker -Skript zu generieren. (Ich habe zunächst versucht, Cython für den ersteren zu verwenden, aber die Hierarchie "Baum" -Typ erforderte eine programmatischere Kontrolle.)
Codierungsstil: Python und GCC haben jeweils einen eigenen Codierungsstil-Leitfaden für C. Ich habe mich entschieden, Pythons (PEP-7) zu folgen, wie ich ihn bevorzuge (obwohl mein Code an einigen Stellen zugegebenermaßen ein Chaos ist).
Sie finden eine API -Dokumentation im Verzeichnis "DOCS", die im restrukturierten Format (wie diese Datei tatsächlich) geschrieben wurden. Wenn Sie Sphinx installiert haben, können Sie diese Dokumente mit:
HTML machen
Innerhalb des docs -Verzeichnisses. Sphinx ist das python-sphinx Paket auf einer Fedora/Rhel-Box.
Eine detailliertere Dokumentation finden Sie in docs/getting-involved.rst .
Genießen! David Malcolm <[email protected]>