Kris van Rens (Trainer)
Trotz einer Vielzahl aufstrebender Alternativen ist C++ immer noch eine Macht, mit der man rechnen muss, vor allem in der von Altlasten geplagten High-Tech-Branche. In einer Reihe von Artikeln stellt der Trainer des High Tech Institute, Kris van Rens, die Sprache in eine moderne Perspektive. In unserem neuen 4-tägigen Trainingskurs führt Kris van Rens die Teilnehmer in die Grundlagen der Sprache und die wichtigsten Best Practices ein.
„Es gibt nur zwei Arten von Programmiersprachen: die, über die man sich beschwert, und die, die niemand benutzt. Dies ist ein berühmtes Zitat, das Bjarne Stroustrup, dem Erfinder von C++, zugeschrieben wird. Darin sind ein paar Wahrheiten versteckt.
Erstens und am offensichtlichsten: Keine einzige Programmiersprache ist perfekt, um jedes Problem in jedem Bereich zu lösen. Vor allem, wenn eine Sprache als „Allzwecksprache“ angepriesen wird, wie C++, kann sie fast überall eingesetzt werden, aber wahrscheinlich gibt es eine Diskrepanz zwischen dem verwendeten Werkzeug und dem benötigten Werkzeug. Es ist zum Beispiel durchaus möglich, eine komplette Webanwendung in C++ zu schreiben, aber ist es auch das richtige Werkzeug für diese Aufgabe? Persönlich würde ich das nicht sagen.
Wenn sich eine Sprache weiterentwickelt und altert, ist es sehr wichtig, dass es einen klaren Prozess für den Umgang mit (fehlerhaften?) Änderungen gibt. Ein konservativer und sicherer Ansatz besteht darin, die Abwärtskompatibilität ab der ersten stabilen Version aufrechtzuerhalten. Dies ist der Ansatz, den C++ seit Jahrzehnten verfolgt und an den es sich gehalten hat – was leider auch die Übernahme einiger Sprachverbesserungen verhindert.
Eine weitere versteckte Wahrheit aus dem Eingangszitat: Die Benutzerbasis ist extrem wichtig. Sie könnten die schönste, sicherste und angenehmste Programmiersprache aller Zeiten entwickeln. Aber was nützt Ihnen das, wenn sie nur von wenigen Menschen benutzt wird?
Gute Anwärter
Ein gutes Modell für die Bedeutung von Programmiersprachen ist ein mechanisches Schwungrad. Je größer die Benutzerbasis, desto größer das Schwungrad und die Rotationsgeschwindigkeit. Die Größe der Benutzerbasis wird durch die Anzahl der aktiven Entwickler, die vorhandenen Codebasen, die Abhängigkeiten zwischen den einzelnen Codebasen und andere Faktoren wie die Unterstützung der Integration durch Dritte bestimmt. Zumindest für C++ hat dieses Schwungrad noch eine enorme Dynamik. Dennoch gibt es Kräfte, die diese Dynamik langsam aufzehren. Andere Sprachen im Bereich der Systemprogrammierung gewinnen Teile der C++-Benutzerbasis für sich.
Zuvor habe ich über die Ankündigung der Programmiersprache Carbon geschrieben, einem C++-Nachfolger, der von Google ins Leben gerufen wurde, aber es gibt noch viele weitere Alternativen. Einige von ihnen, wie Zig, Odin und Go, sind eher auf C als auf C++ ausgerichtet – diese werde ich hier nicht behandeln. Um pragmatisch zu sein, werde ich Sprachen, die zu klein oder experimentell sind, wie Nim, Val, Vale, Cpp2 und Jakt, auslassen. Damit bleibt nur eine Handvoll „ernsthafter“ Alternativen übrig, darunter Rust, Swift, D und Circle.
''A good model for programming language significance is a mechanical flywheel.''
Was macht eine Sprache zu einem guten Anwärter für eine große C++-Benutzerbasis? Wir können damit beginnen, die Eigenschaften zu betrachten, bei denen C++ im Allgemeinen versagt. Verfügt die Alternative beispielsweise über eine durchgängig ‚moderne Syntax‘? Verfügt sie über eine eingebaute garantierte Sicherheit, z.B. für Speicher oder mathematische Operationen? Verfügt sie über ein Tooling/Packaging-Ökosystem? Die Interoperabilität von C++ ist ein weiterer sehr wichtiger Aspekt. Eine Schnittstelle für Fremdfunktionen (FFI) im Stil von C ist zwar schön, aber es ist eine Verschlechterung, wenn wir unsere C++-Schnittstellen an diese Schnittstelle anpassen müssen.
Eine dieser Eigenschaften zu haben, reicht jedoch nicht aus. Eine moderne und saubere Syntax ist sehr schön, aber sie allein reicht nicht aus. Ein großartiges Tooling-Ökosystem ist fantastisch, aber auch hier reicht es allein nicht aus. Wenn Sie eine Chance haben wollen, mit C++ erfolgreich zu sein, brauchen Sie meiner Meinung nach mindestens die folgenden drei Zutaten: eine 10-fache Verbesserung irgendeines Aspekts der Sprache, garantierte Speichersicherheit und gute Interoperabilität mit bestehendem C++-Code.
Ankreuzen der Kästchen
Wenn man sich unsere ernsthaften Alternativen ansieht, fehlt einer Sprache wie D die 10-fache Verbesserung. Deshalb denke ich, dass sie sich nie wirklich durchgesetzt hat, obwohl sie schon 20 Jahre alt ist. Das Ein-Mann-Projekt Circle ist sehr beeindruckend, vor allem wegen seiner Möglichkeiten, mit der Sprache zu experimentieren. Und vor allem ist es, abgesehen von der Entnahme von Feature-Flags, um Sprachverbesserungen zu ermöglichen, vollständig kompatibel mit C++. Leider ist Circle nicht offen geregelt und es fehlt ihm an garantierter Speichersicherheit. Swift verfügt über hervorragende Werkzeuge, ist aber zu sehr auf die Apple-Plattform ausgerichtet und bietet nur eine teilweise bzw. in Arbeit befindliche Interoperabilität mit C++.
Rust erfüllt die meisten Kriterien. Es hat sogar schon eine recht anständige Benutzerbasis. Obwohl es auch an echter, ausgereifter C++-Interoperabilität mangelt, ist es heute der vielversprechendste Anwärter. Mehr zu Rust in meinem nächsten Beitrag.