Vergleich von Python mit anderen Sprachen
Vergleich von Python mit anderen Sprachen
Haftungsausschluss: Dieser Aufsatz wurde etwa 1997 geschrieben. Er zeigt sein Alter. Er wird hier lediglich als historisches Artefakt aufbewahrt. -- Guido van Rossum
Python wird oft mit anderen interpretierten Sprachen wie Java, JavaScript, Perl, Tcl oder Smalltalk verglichen. Vergleiche mit C++, Common Lisp und Scheme können ebenfalls aufschlussreich sein. In diesem Abschnitt werde ich Python kurz mit jeder dieser Sprachen vergleichen. Diese Vergleiche konzentrieren sich nur auf Sprachaspekte. In der Praxis wird die Wahl einer Programmiersprache oft von anderen realen Einschränkungen wie Kosten, Verfügbarkeit, Schulung und bisherigen Investitionen oder sogar emotionaler Bindung diktiert. Da diese Aspekte stark variieren, scheint es Zeitverschwendung zu sein, sie für diesen Vergleich stark zu berücksichtigen.
Java
Python-Programme laufen im Allgemeinen langsamer als Java-Programme, aber ihre Entwicklung dauert auch viel weniger Zeit. Python-Programme sind typischerweise 3-5 Mal kürzer als äquivalente Java-Programme. Dieser Unterschied ist auf Pythons eingebaute High-Level-Datentypen und seine dynamische Typisierung zurückzuführen. So verschwendet ein Python-Programmierer keine Zeit mit der Deklaration von Argument- oder Variablentypen, und Pythons leistungsstarke polymorphe Listen- und Dictionary-Typen, für die eine reichhaltige syntaktische Unterstützung direkt in die Sprache integriert ist, finden in fast jedem Python-Programm Verwendung. Aufgrund der Laufzeittypisierung muss die Laufzeit von Python mehr arbeiten als die von Java. So muss beim Auswerten des Ausdrucks a+b zuerst die Objekte a und b inspiziert werden, um ihren Typ zu ermitteln, der zur Kompilierzeit nicht bekannt ist. Dann wird die entsprechende Additionsoperation aufgerufen, die eine überladene, benutzerdefinierte Methode sein kann. Java hingegen kann eine effiziente Integer- oder Fließkommaddition durchführen, erfordert aber Variablendeklarationen für a und b und erlaubt keine Überladung des + Operators für Instanzen benutzerdefinierter Klassen.
Aus diesen Gründen eignet sich Python viel besser als "Klebesprache", während Java besser als Low-Level-Implementierungssprache charakterisiert werden kann. Tatsächlich bilden die beiden zusammen eine ausgezeichnete Kombination. Komponenten können in Java entwickelt und zu Anwendungen in Python zusammengesetzt werden; Python kann auch zur Prototypenentwicklung von Komponenten verwendet werden, bis deren Design in einer Java-Implementierung "verfestigt" werden kann. Zur Unterstützung dieser Art der Entwicklung wird an einer Python-Implementierung in Java gearbeitet, die das Aufrufen von Python-Code aus Java und umgekehrt ermöglicht. In dieser Implementierung wird Python-Quellcode in Java-Bytecode übersetzt (mit Hilfe einer Laufzeitbibliothek zur Unterstützung von Pythons dynamischer Semantik).
JavaScript
Pythons "objektbasierter" Teil ist ungefähr gleichwertig mit JavaScript. Wie JavaScript (und im Gegensatz zu Java) unterstützt Python einen Programmierstil, der einfache Funktionen und Variablen verwendet, ohne Klassendefinitionen einzubeziehen. Für JavaScript ist das jedoch alles. Python hingegen unterstützt das Schreiben viel größerer Programme und eine bessere Code-Wiederverwendung durch einen echten objektorientierten Programmierstil, bei dem Klassen und Vererbung eine wichtige Rolle spielen.
Perl
Python und Perl stammen aus einem ähnlichen Hintergrund (Unix-Scripting, das beide längst hinter sich gelassen haben) und weisen viele ähnliche Funktionen auf, haben aber eine andere Philosophie. Perl legt Wert auf die Unterstützung gängiger anwendungsbezogener Aufgaben, z. B. durch integrierte reguläre Ausdrücke, Dateiscanning und Berichterstattungsfunktionen. Python legt Wert auf die Unterstützung gängiger Programmiermethoden wie Datenstrukturdesign und objektorientierte Programmierung und ermutigt Programmierer, lesbaren (und damit wartbaren) Code zu schreiben, indem es eine elegante, aber nicht übermäßig kryptische Notation bietet. Infolgedessen kommt Python Perl nahe, übertrifft es aber selten in seinem ursprünglichen Anwendungsbereich; Python hat jedoch eine Anwendbarkeit, die weit über die Nische von Perl hinausgeht.
Tcl
Wie Python kann Tcl als Anwendungs-Erweiterungssprache sowie als eigenständige Programmiersprache verwendet werden. Tcl, das traditionell alle Daten als Strings speichert, ist jedoch schwach bei Datenstrukturen und führt typischen Code viel langsamer aus als Python. Tcl fehlen auch Funktionen, die für das Schreiben großer Programme benötigt werden, wie z. B. modulare Namensräume. Während eine "typische" große Anwendung, die Tcl verwendet, normalerweise Tcl-Erweiterungen in C oder C++ enthält, die für diese Anwendung spezifisch sind, kann eine äquivalente Python-Anwendung oft in "reinem Python" geschrieben werden. Natürlich ist die reine Python-Entwicklung viel schneller, als eine C- oder C++-Komponente schreiben und debuggen zu müssen. Es wurde gesagt, dass Tcls einzige entschuldigende Eigenschaft das Tk-Toolkit ist. Python hat eine Schnittstelle zu Tk als seine Standard-GUI-Komponentenbibliothek übernommen.
Tcl 8.0 behebt die Geschwindigkeitsprobleme durch die Bereitstellung eines Bytecode-Compilers mit eingeschränkter Datentypunterstützung und fügt Namensräume hinzu. Es ist jedoch immer noch eine wesentlich umständlichere Programmiersprache.
Smalltalk
Der vielleicht größte Unterschied zwischen Python und Smalltalk ist Pythons "mainstreamigere" Syntax, die ihm einen Vorteil beim Training von Programmierern verschafft. Wie Smalltalk hat Python dynamische Typisierung und Bindung, und alles in Python ist ein Objekt. Python unterscheidet jedoch zwischen integrierten Objekttypen und benutzerdefinierten Klassen und erlaubt derzeit keine Vererbung von integrierten Typen. Smalltalks Standardbibliothek für Sammlungstypen ist raffinierter, während Pythons Bibliothek mehr Einrichtungen für den Umgang mit Internet- und WWW-Realitäten wie E-Mail, HTML und FTP bietet.
Python hat eine andere Philosophie hinsichtlich der Entwicklungsumgebung und der Verteilung von Code. Während Smalltalk traditionell ein monolithisches "System-Image" hat, das sowohl die Umgebung als auch das Programm des Benutzers umfasst, speichert Python sowohl Standard- als auch Benutzer-Module in einzelnen Dateien, die leicht neu angeordnet oder außerhalb des Systems verteilt werden können. Eine Konsequenz ist, dass es mehr als eine Option für die Anbindung einer grafischen Benutzeroberfläche (GUI) an ein Python-Programm gibt, da die GUI nicht in das System integriert ist.
C++
Fast alles, was für Java gesagt wurde, gilt auch für C++, nur noch mehr: Während Python-Code typischerweise 3-5 Mal kürzer ist als äquivalenter Java-Code, ist er oft 5-10 Mal kürzer als äquivalenter C++-Code! Anekdotische Beweise deuten darauf hin, dass ein Python-Programmierer in zwei Monaten fertigstellen kann, was zwei C++-Programmierer nicht in einem Jahr schaffen. Python glänzt als Klebesprache, die zum Kombinieren von in C++ geschriebenen Komponenten verwendet wird.
Common Lisp und Scheme
Diese Sprachen sind Python in ihrer dynamischen Semantik nahe, aber in ihrer Herangehensweise an die Syntax so unterschiedlich, dass ein Vergleich fast zu einer religiösen Debatte wird: Ist Lisps Mangel an Syntax ein Vorteil oder ein Nachteil? Es sei darauf hingewiesen, dass Python introspektive Fähigkeiten ähnlich denen von Lisp hat und Python-Programme zur Laufzeit Programmfragmente konstruieren und ausführen können. Meist sind die realweltlichen Eigenschaften entscheidend: Common Lisp ist groß (in jeder Hinsicht) und die Scheme-Welt ist zwischen vielen inkompatiblen Versionen fragmentiert, während Python eine einzige, kostenlose, kompakte Implementierung hat.
