C++ vs. Python


Normalerweise geht der Vergleich so aus, dass C++ für große wichtige Projekte empfohlen wird und Python für Prototypen und kleinere Programmierprojekte. In der Annahme, dass sowohl Python als auch C++ eine Programmiersprache wären, mit eigenen Vor- und Nachteilen. Genauer gesagt ist C++ eine klassische Programmiersprache und Python eine Mischung aus Programmiersprache und Virtual Machine. Und hier wird auch deutlich wie ein Vergleich ausgeht, der Python ernstnimmt. Und zwar werden großen wichtige Projekte angegangen, dass man zunächst in effizientem C Code einen Python-Interpreter schreibt und diesen optimal an das Betriebssystem anpasst. Also schön mit Pointer Speicher allokiert und alles an die Hardware anpasst um dann auf dieser Virtual Maschine Hochsprachencode in Python ausführen zu können. Genaugenommen ist Python ohne C witzlos, weil um Python auszuführen man vorher eine VM benötigt und die ist natürlich hardwarenah.

Was üblicherweise verglichen wird ist einmal die Softwareentwicklung mit einer kompilierten Sprache wie C++. Wo man Code schreibt und diesen in Maschinencode übersetzt und auf der anderen Seite das Python Konzept, wo man nicht für die Hardware programmiert sondern für eine abstrakte Virtuelle Maschine, genauer gesagt für eine Stackmachine die gar nicht physikalisch existiert sondern die sich jemand ausgedacht hat. Der Vorteil besteht darin, dass das Konzept mit Python nicht einfach nur ein Gegenentwurf ist, sondern die Weiterentwicklung von C und C++ darstellt. Ein bisschen vergleichbar mit Java, was ebenfalls auf einer VM aufsetzt.

Der Vorteil liegt auf der Hand, wo man mit Layern arbeitet kann man Komplexität senken. Man braucht dann keine Compiler mehr welche C++ direkt auf Maschinenniveau transformieren, sondern es reicht aus, wenn C verwendet und eine VM bereitstellt auf die dann die nächste Stufe drauf zugreift. Und hier zeigt sich auch, warum C++ tod ist. C++ lässt sich nicht gut unterteilen in eine VM und eine Hochsprache. C++ ist beides, einerseits objektorientierte Hochsprache aber auch der dazugehörige Compiler. Es macht keinen Sinn für C++ eine VM zu konstruieren. Sie wäre genauso umfangreich wie heutige C++ Compiler auch. Schaut man sich hingegen an, wie es Python macht so ist das weitaus intelligenter. Einmal hat man die VM, welche eine Art von Plattform ist, und ontop dieser Plattform wird dann Python Code ausgeführt. Der Vorteil ist, dass man Python VM auf jedes Betriebssystem portieren kann, ohne die Sprache Python zu ändern. Und theoretisch lässt sich eine vorhandene Python VM auch mit anderen Scriptsprachen ansprechen.

Aber wenn Python wirklich so gut ist wie oben behauptet, warum werden dann die großen wichtigen Sachen nach wie vor in C++ geschrieben? Die Bereitschaft des Mainstreams eine Sprache anzunehmen muss nicht unbedingt ein Qualitätsurteil sein. Bekanntlich ist auch auf 90% aller PCs Windows vorinstalliert, obwohl alle Wissen dass es Schwächen besitzt. Die fehlende Akzeptanz von Python könnte also etwas mit dem Umfeld zu tun haben, in dem es sich befindet. Auffallig an Python ist vor allem, dass es wirklich große Projekte fast keine gibt. Man muss schon lange suchen um Projekte zu finden mit mehr als 100000 Codezeilen. Daraus wird dann geschlossen, dass sich Python als Scripting-Sprache nicht für diese Dinge eignen würde. Aber nicht Python ist das Problem, also das Einrücken, oder die Syntax sondern worum es in Wahrheit geht ist pro-VM vs. Contra-VM. Will man eine Sprache haben, die direkt auf Assembler-Ebene übersetzt wird, oder will man für eine Virtuelle Maschine programmieren die es nicht in Hardware gibt und für die es keine Compiler gibt? Jedenfalls keine richtigen Compiler sondern nur Interpreter oder JIT Compiler.-

Wenn man die Sprachen ernst nimmt, muss man Java, C# und Python gemeinsam betrachten. Alles sind objektorientierte Hochsprachen die auf einer virtuellen Maschine ausgeführt werden. C++ hingegen ist keine Hochsprache, weil es nur C++ Compiler gibt. Letztlich geht es also nicht so sehr um die Sprache, sondern um die VM. Also ein zusätzlicher Layer der zwischen Betriebssystem und Hochsprache eingezogen wurde um Portierbarkeit und leichte Wartbarkeit zu ermöglichen. Böse formuliert, ist C++ demzufolge nicht portabel auch nicht leicht veränderbar. Das ganze läuft erstaunlicherweise nicht entlang der typischen Kennlinie Linux vs. Windows sondern ist eine übergreifende Entwicklung. Python ist keinem Hersteller verpflichtet, Sun Java ist halb kommerziell und C# trägt die Handschrift von Microsoft.

Obwohl C++ objektorientierte ist, und als sehr mächtig gilt, wirkt das Konzept irgendwie überholt. Ursache dürfte wohl sein, dass es keine Laufzeitumgebung gibt. Also eine gemeinsame Bibliothek, ein portabler Kern der auf unterschiedlichen Operating Systems läuft, sowie ein Code-Optimierer. Genau genommen fehlt bei C++ ein Zwischencode. Also Code in den erstmal übersetzt wird und der von einer Runtime Engine zur Ausführung gebracht wird. Stattdessen gibt es etwas vergleichbares in der LLVM Compilersuite, wo ein Maschinenunabhängiger Bytecode benutzt wird. Aber, dieser ist nicht an bestimmte Bibliotheken gebunden und hat für den normalen Programmierer keine Bedeutung. Sondern er ist nur für den Compiler selber relevant.

Die spannende Frage welche sich C++ Programmierer stellen sollten, ist ob Microsofts .net Strategie ein Fehler war. Also ob Sinn macht C# einzusetzen oder ob das ein reiner Marketing-Gag ist. Falls ja, kann man C++ ruhig weiterverwenden, weil compilierte Sprachen die Zukunft sind. Ich jedoch sagen, dass Microsoft, Java und Python auf das richtige Pferd gesetzt haben, was sie sich Ende der 1990’er Jahre ausgedacht haben, war die logische weiterentwicklung oder objektorientierten Programmierung. Eine moderne Programmiersprache muss auf einer Runtime-Umgebung aufsetzen. Man kann immernoch darüber streiten ob das nun Mono, JVM oder Pypy sein muss, das Konzept an sich jedoch ist here-to-stay.

Aus Sicht der .net Plattform gehört C++ zu Legacy Programmiersprachen ähnlich wie Ada oder Pascal. Man kann diese Sprachen auf .net laufen lassen aber es wird empfohlen auf C# umzusteigen.

Obwohl ich kein Freund von C# bin, ist das Konzept jedoch merkwürdig vertraut wenn man Python gewohnt ist. Die Tutorials sind gut verständlich, das meiste ist standardisiert und es gibt eine reichhaltige Standard-Bibliothek vergleich mit dem “Batteries included” von Python. Aber das C# als leicht wie mächtig gleichermaßen gilt hat weniger etwas mit besseren Tutorials oder leichter lesbarerer Syntax zu tun, als vielmehr damit dass C# einmal aus dem Frontend besteht, also der Sprache worin man programmiert und dem Backend, genannt .net wo der fiese systemnahe Code enthalten ist. Auf diese Weise wird C# für zwei Interessengruppen interessant. Einmal für die Hardcore-Code welche die .net Runtime Umgebung tunen können aber gleichzeitig auch für die Programmeinsteiger die mit C# ein Hello World Programm schreiben und in 20 Lines of Code ein schönes GUI Fenster auf den Bildschirm zaubern.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.