Hinweis: Obwohl JavaScript für diese Website nicht unbedingt erforderlich ist, werden Ihre Interaktionsmöglichkeiten mit den Inhalten eingeschränkt sein. Bitte aktivieren Sie JavaScript für das volle Erlebnis.

Alles mit Python zusammenfügen

Alles mit Python zusammenfügen

Guido van Rossum
CNRI
1895 Preston White Drive
Reston, VA 20191
E-Mail: guido@cnri.reston.va.us, guido@python.org

Positionspapier für das OMG-DARPA-MCC Workshop zur Kompositionssoftwarearchitektur in Monterey, Kalifornien, 6.-8. Januar 1998.

Einleitung

Python ist eine fortgeschrittene Skriptsprache, die erfolgreich zur Verknüpfung großer Softwarekomponenten eingesetzt wird. Sie ist plattformübergreifend, middleware-unabhängig und für verschiedenste Anwendungsbereiche geeignet. Python ist eine objektorientierte Sprache mit High-Level-Datenstrukturen, dynamischer Typisierung und dynamischer Bindung. Python gibt es seit 1991 und es verfügt über eine sehr aktive Benutzergemeinschaft. Weitere Informationen finden Sie auf der Python-Website https://pythonlang.de.

Ähnlich wie Tcl ist Python leicht mit C/C++/Java-Code erweiterbar und einfach in Anwendungen einbettbar. Python nutzt sogar Tk, das GUI-Toolkit von Tcl, als De-facto-Standard für ein portables GUI-Toolkit. Im Gegensatz zu Tcl unterstützt Python jedoch objektorientierte Programmierung. Python-Programmierer können Klassen erstellen, Mehrfachvererbung nutzen, Methoden definieren, Operatoren überladen und so weiter.

Stärken von Python

Syntaktisch sieht Python-Code wie ausführbarer Pseudocode aus. Die Programmentwicklung mit Python ist 5-10 Mal schneller als mit C/C++ und 3-5 Mal schneller als mit Java. In vielen Fällen kann ein Prototyp einer Anwendung in Python geschrieben werden, ohne jeglichen C/C++/Java-Code zu benötigen. Oft ist der Prototyp ausreichend funktional und performant genug, um als Endprodukt ausgeliefert zu werden, was erhebliche Entwicklungszeit spart. In anderen Fällen kann der Prototyp teilweise oder vollständig in C++ oder Java übersetzt werden – die objektorientierte Natur von Python macht die Übersetzung zu einem unkomplizierten Prozess.

Der beste Ansatz ist oft, nur die leistungskritischen Teile der Anwendung in C++ oder Java zu schreiben und Python für die gesamte übergeordnete Steuerung und Anpassung zu verwenden. Es gibt mehrere Anekdoten über Anwendungen, die ursprünglich reiner C++-Code waren und bei denen Python als Erweiterungssprache hinzugefügt wurde, wobei in jeder neuen Version der Anteil der in Python geschriebenen Anwendung stieg, während gleichzeitig die Gesamtleistung, Funktionalität und Zuverlässigkeit der Anwendung zunahm. (Z.B. Fallstudie: Python in einer kommerziellen Umgebung, von Greg Stein, Microsoft, in Proceedings of the 6th International Python Conference und das Alice VR-Projekt an der UvA und CMU.)

Python hat eine starke Präsenz im Web. Es eignet sich für die CGI-Programmierung (auf allen Plattformen: Unix, Windows und Mac); es gibt Schnittstellen zu allen wichtigen kommerziellen Datenbanken. Python verfügt über eine Bibliothek, die mit den wichtigsten Internet- und Webprotokollen interagiert, sowie über Toolkits für HTML-Parsing und -Generierung. Python war eine wichtige Implementierungssprache für Infoseek, als diese noch kleiner waren. Mindestens ein Unternehmen (Digital Creations) verkauft eine Suite von serverseitigen Tools, die Python nutzen. Und schließlich wurde Python zur Implementierung eines Webbrowsers (Grail) verwendet.

Python ist auch in der Welt der verteilten Systeme gut vertreten. Es ist eine der Hauptsprachen, die von Xerox PARC's ILU (Inter-Language Unification; ein CORBA-kompatibles verteiltes Objektsystem) unterstützt werden, und viele verteilte Anwendungen wurden in Python unter Verwendung von ILU erstellt. Python wird auch vom Hector-Projekt an der University of Queensland, Australien, verwendet.

Schließlich ist Python gut in die Windows-Plattformen integriert. Python-Programme können mit COM- und DCOM-Diensten interagieren und sogar neue COM- und DCOM-Dienste implementieren (was mit Visual Basic nicht möglich ist!). Python kann auch als Skript-Engine in Microsofts Active Scripting-Architektur verwendet werden.

Python als Integrationssprache verwenden

Relevant für das Thema dieses Workshops: Python wird an vielen Orten als Integrationssprache eingesetzt, um bestehende Komponenten zu verknüpfen ("zu steuern"). Die Strategie besteht hier darin, Python-Erweiterungsmodule (geschrieben in C/C++) zu erstellen, die die Funktionalität großer, in C/C++ geschriebener Komponenten für den Python-Programmierer zugänglich machen. Die Erweiterungs-("Glue"-)Module sind erforderlich, da Python C/C++-Funktionen nicht direkt aufrufen kann; die Glue-Erweiterungen kümmern sich um die Konvertierung zwischen Python-Datentypen und C/C++-Datentypen sowie um die Fehlerprüfung und die Umwandlung von Fehlerrückgabewerten in Python-Ausnahmen.

Die Erstellung von Glue-Erweiterungen wird durch die Existenz von SWIG vereinfacht, das Header-Dateien mit Funktions- und Methodenprototypen liest und automatisch den notwendigen Code für Typkonvertierung und Fehlerprüfung generiert. In Situationen, in denen der zugrunde liegende Code (normalerweise C-Code) kein objektorientiertes Modell verwendet, kann die Glue-Erweiterung wiederum in ein Python-Modul verpackt werden, das eine ordnungsgemäße Klassenhierarchie definiert und die leistungskritischen Operationen an den C-Code delegiert.

Mit Python können bessere Anwendungen entwickelt werden, da unterschiedliche Arten von Programmierern an einem Projekt zusammenarbeiten können. Zum Beispiel können beim Erstellen einer wissenschaftlichen Anwendung C/C++-Programmierer effiziente numerische Algorithmen implementieren, während Wissenschaftler am selben Projekt Python-Programme schreiben können, die diese Algorithmen testen und nutzen. Der Wissenschaftler muss keine Low-Level-Programmiersprache lernen, und der C/C++-Programmierer muss die beteiligte Wissenschaft nicht verstehen.

Ohne Python muss oft eine große Menge C/C++-Code geschrieben werden, nur um einen flexiblen Eingabemechanismus bereitzustellen, damit Wissenschaftler dem Programm seine Daten in allen Variationen zuführen können, die aus Gründen des experimentellen Aufbaus (zum Beispiel) erforderlich sind. Mit Python kann ein wesentlich flexiblerer Eingabemechanismus in viel kürzerer Zeit geschrieben werden, oder Python selbst kann der ultimative flexible Eingabemechanismus sein. Als extremes Beispiel ersetzt Lawrence Livermore National Laboratories mit Python eine Skriptsprache (BASIS), die intern für denselben Zweck entwickelt wurde; BASIS begann als einfacher Eingabemechanismus für Fortran-Programme und erwarb nach und nach viele Funktionen von Skriptsprachen (Variablen, Bedingungen, Schleifen, Prozeduren usw.) mit zunehmender Umständlichkeit.

Da Python über bestehende Schnittstellen zu so vielen verschiedenen Komponenten in sehr unterschiedlichen Anwendungsbereichen verfügt, ist Python ideal für seltsame Integrationsaufgaben. Es kann eine kommerzielle Datenbank mit numerischen Berechnungen verknüpfen; es kann einem Netzwerkverwaltungstool eine grafische Benutzeroberfläche hinzufügen; es kann E-Mails aus einer Virtual-Reality-Anwendung versenden.

Schlussfolgerung

Python kann eine wichtige Integrationsrolle bei der Gestaltung großer Anwendungen mit langer Lebensdauer erfüllen. Es ermöglicht eine schnelle Reaktion auf Änderungen der Benutzeranforderungen, die eine Anpassung der übergeordneten Anwendungslogik erfordern, ohne die grundlegenden zugrunde liegenden Komponenten zu ändern. Es ermöglicht auch eine schnelle Anpassung der Anwendung an Änderungen der zugrunde liegenden Komponenten.


Epilog: Python und Java-Integration

Eine neue Python-Implementierung in 100 % reinem Java, genannt JPython, befindet sich derzeit in der Entwicklung; Alpha-Versionen stehen zur Evaluierung zur Verfügung. JPython bietet nahtloses Scripting für Java. Es ist eine vollständige Implementierung der Python-Sprache und Standardbibliothek und bietet direkten Zugriff auf das Universum der Java-Klassen. Java-Code kann auch Python-Klassen verwenden – dies ist zum Beispiel für Callbacks wichtig.

Der Hauptzweck von JPython ist, dass es für Java das tut, was Python bereits für C und C++ tut: Programmierern mehr Optionen im Kompromiss zwischen Entwicklungszeit und Ausführungszeit zu bieten, indem es eine dynamischere, ausdrucksstärkere Alternative darstellt. JPythons Integration mit Java ist besser als Pythons Integration mit C/C++: Dank der Reflection API von Java kann JPython beliebige Java-Klassen ohne Hilfe eines Wrapper-Generators wie SWIG verwenden. (C/C++-Code muss zuerst über die Java-Native-Code-Schnittstelle für Java verfügbar gemacht werden; sobald er von Java aufrufbar ist, ist er von JPython aufrufbar.)