SIG für die Entwicklung von Python/C++-Integration
SIG für die Entwicklung von Python/C++-Integration
Die Python C++ SIG ist ein Forum für Diskussionen über die Integration von Python und C++, mit Schwerpunkt auf der Entwicklung der Boost.Python-Bibliothek. Zum Zeitpunkt dieser Verfassung (Januar 2002) wird Boost.Python einer umfassenden Überarbeitung unterzogen, um leistungsstarke neue Funktionen hinzuzufügen und die neuen Typsysteme, die in Python 2.2 eingeführt wurden, vollständig auszunutzen. Vorschläge zur Ausrichtung der Entwicklungsarbeit und Beiträge in Form von Quellcode sollten an diese SIG gesendet werden.Über Boost.Python
Boost.Python ist ein beliebtes Open-Source-Tool für die Schnittstelle zwischen Python und C++. Boost.Python basiert auf zugänglichen, gut gepflegten und gut dokumentierten Komponenten (der Boost C++ Library), sodass es seine Benutzer nicht an die Dienste eines einzelnen Programmierers oder einer Organisation bindet. Entwickler weltweit haben bedeutende, unaufgeforderte Verbesserungen am Projekt vorgenommen. Der Hauptentwickler und Koordinator der Bibliothek ist David Abrahams.Entwicklungsziele
Die folgenden Abschnitte beschreiben die aktuellen Entwicklungsziele. Vorschläge zur Ausrichtung der Entwicklungsarbeit und Beiträge in Form von Quellcode sollten an die Python C++ SIG gesendet werden.- Referenz-/Zeiger-Unterstützung
- Boost.Python lehnt derzeit das Wrapping von C++-Funktionen ab, die Zeiger oder nicht-const Referenzen zurückgeben, um hängende Zeiger und Referenzen zu verhindern, die Abstürze auf der Python-Seite verursachen könnten. Dies schränkt die Fähigkeit der Bibliothek ein, beliebige C++-Funktionen zu exportieren.
Ziel: Implementierung eines Mechanismus, mit dem Referenzen und Zeiger auf interne Elemente von Funktions- und Methodenargumenten sicher zurückgegeben werden können. Dies beinhaltet einen Mechanismus, mit dem jedes Argumentobjekt während der Lebensdauer eines anderen Argumentobjekts lebendig gehalten werden kann, so dass umgewickelte C++-Objekte einander ohne direkte Verwendung von Smart Pointern annehmen können.
- Global registrierte Typkoerzionen
- Ziel: Bereitstellung eines Mechanismus zur globalen Registrierung von Typbeziehungen zwischen beliebigen Python- und C++-Typen, so dass beispielsweise ein Python-Tupel automatisch in einen C++-`std::vector` konvertiert werden kann, wenn es an eine umgewickelte Funktion übergeben wird, die ein `std::vector`-Argument erwartet.
- Umfassende Modulübergreifende Unterstützung
- Vererbungshierarchien, die sich über Python-Erweiterungsmodule erstrecken, werden derzeit nicht von Boost.Python unterstützt. Andere Interaktionsprobleme zwischen Modulen, z. B. die Ausnahmebehandlung, werden voraussichtlich auftreten.
Ziel: Vollständige Unterstützung für die Interaktion von umgewickelten Typen und Funktionen, die sich in verschiedenen Erweiterungsmodulen befinden.
- Verbesserte Überladungsunterstützung
- Die Unterstützung von Boost.Python für überladene Funktionen und Operatoren basiert auf dem Auslösen von C++-Ausnahmen, wenn eine Signatur nicht mit der entsprechenden Funktion übereinstimmt. Dies hat mehrere Nachteile: Erstens ist der C++-Ausnahmebehandlungsmechanismus bei vielen Implementierungen für den Fall optimiert, dass keine Ausnahme ausgelöst wird, und das Auslösen einer Ausnahme kann ernsthafte Leistungseinbußen verursachen. Zweitens haben genügend C++-Implementierungen Fehler in ihren Ausnahmebehandlungsmechanismen, so dass es am besten ist, sich für die normale Ablaufsteuerung nicht auf Ausnahmen zu verlassen.
Ziel: Änderung des Typkonvertierungsmechanismus, so dass die Überladung ohne die Verwendung von C++-Ausnahmen implementiert werden kann.
- C++-zu-Python-Ausnahmetranslation
- Für jede ausgereifte C++-Software ist es entscheidend, Fehlerbedingungen über beliebige Ausnahmetypen berichten zu können. Boost.Python unterstützt derzeit nur die Übersetzung einer begrenzten Auswahl von Ausnahmetypen nach Python.
Ziel: Implementierung einer Funktion, die die automatische Übersetzung beliebiger neuer Ausnahmetypen ermöglicht.
- Unterstützung für Standardargumente
- C++-Funktionen mit Standardargumentwerten können derzeit Python zur Verfügung gestellt werden, aber die Standardwerte gehen verloren.
Ziel: Implementierung von zur Kompilierungszeit konstanten Standardargumentausdrücken. Möglicherweise Implementierung von Lambda-Ausdrücken zur Beschreibung von Standardargumenten.
- Unterstützung für Schlüsselwortargumente
- Python unterstützt die Angabe bestimmter Funktionsargumente nach Namen anstelle von Positionen.
Ziel: Implementierung einer Funktion, die die Verwendung von Schlüsselwortargumenten aus Python für umgewickelte C++-Funktionen ermöglicht.
- Generische C++-zu-Python-Objektschnittstelle
- Es ist oft notwendig, dass C++-Funktionen Objekte manipulieren, die ihnen direkt aus Python übergeben werden, ohne sie in eine andere Darstellung zu konvertieren. Derzeit hat Boost.Python undokumentierte Unterstützung für diese Verwendung, wenn der erwartete Python-Typ bekannt ist.
Ziel: Hinzufügen eines C++-Typs, der jedes Python-Objekt umschließt und eine ähnliche Schnittstelle wie Python bietet, wobei die Gültigkeit jeder Operation zur Laufzeit überprüft wird.
- Schnittstelle zur Anwendung von Standard-C++-Algorithmen auf Python-Objekte
- Ziel: Implementierung von Schnittstellen zur Anwendung von C++ Standard Template Library-Algorithmen und Boost-Algorithmen auf Python-Objekte, wie Python-Listen, Tupel, Zeichenketten und Python-Objekte, die die Buffer-Schnittstelle unterstützen.
- Python LONG-Unterstützung
- Python bietet einen LONG-Ganzzahltyp mit beliebiger Präzision, der derzeit nicht von Boost.Python unterstützt wird.
Ziel: Hinzufügen einer Schnittstelle zu Python LONGs, die deren direkte Manipulation in C++ mit einer natürlichen Schnittstelle ermöglicht.
- Verbesserte automatische Konvertierung von numerischen Basistypen
- Ziel: Python liefert mindestens 4 numerische Typen, von denen jeder dort übergeben werden kann, wo ein Argument eines beliebigen C++-numerischen Typs erwartet wird, vorausgesetzt, die Konvertierung verliert keine wesentlichen Informationen.
- Python-Iterator-Unterstützung
- Ziel: Python 2.2 bietet eine Iterationsschnittstelle, die es ermöglicht, C++-Sequenzen auf natürliche Weise einfach Python zur Verfügung zu stellen.
- Automatische C++-Objektinitialisierung
- Während Python die Erstellung von Klassen ohne Initialisierung erlaubt, tut es C++ nicht. Boost.Python erlaubt derzeit, dass C++-Basisklassen von Python-Erweiterungsklassen uninitialisiert bleiben. Dieses Verhalten ist nicht immer angemessen.
Ziel: Optionale Unterstützung für die automatische Standardkonstruktion von C++-Basisklassen und Fehlerberichterstattung, wenn Basisklassen nicht initialisiert werden.
- Docstring-Unterstützung
- Module, Typen und Funktionen in Python können mit "Docstrings" dokumentiert werden, die die automatische Extraktion von Dokumentation (und sogar Testcode) zur Laufzeit ermöglichen. Ziel: Vollständige Unterstützung für Docstrings auf den Elementen von C++-Erweiterungsmodulen und -Klassen.
- C++ long long-Unterstützung
- Der Typ `long long` ist eine beliebte Erweiterung von C++, die die Darstellung von ganzzahligen numerischen Werten von mindestens 64 Bits ermöglicht.
Ziel: Automatische Konvertierungen von C++ `long long`-Werten zu/von Python.
- Reduzierung des Code-Footprints
- Derzeit ist Boost.Python nicht darauf optimiert, die Code-Größe von C++-Erweiterungsmodulen zu reduzieren.
Ziel: Neukonstruktion von Boost.Python, so dass der Code-Footprint für jedes Erweiterungsmodul so klein wie möglich ist.
- Reduzierung des Daten-Speicher-Footprints
- Umwickelte C++-Klassen, die in Python nicht unterklassifiziert sind, verwenden mehr dynamische Speicherzuweisung als nötig, was den gesamten Daten-Footprint einer Anwendung, die Boost.Python-Erweiterungsklassen verwendet, erhöht.
Ziel: Einbettung von C++-Klassen direkt in Python-Objekte. Dies eliminiert den Overhead durch dynamische Speicherzuweisung.
