Seit seiner Einführung war C++ die erste Wahl zum Erstellen leistungsintensiver Anwendungen. Aber die Sprache weist immer noch einige veraltete Praktiken auf, die durch ihr „Design by Committee“ verursacht werden.

Am 19. Juli 2022 stellte der Google-Ingenieur Chandler Carruth während der CPP North C++-Konferenz in Toronto Carbon vor.

Finden Sie heraus, was Carbon ist und wie es die Nachfolge von C++ antreten soll.

Was ist Kohlenstoff?

Google-Ingenieure entwickelten die Kohlenstoff Programmiersprache, um die Mängel von C++ zu beheben.

Viele vorhanden Sprachen wie Golang und Rust existieren bereits, die die Leistung von C++ ohne seine Mängel widerspiegeln. Leider stellen diese Sprachen erhebliche Hindernisse für die Migration vorhandener C++-Codebasen dar.

Carbon soll sein was TypeScript für JavaScript ist, und Kotlin ist für Java. Es ist kein Ersatz, sondern eine Nachfolgesprache, die auf die Interoperabilität mit C++ ausgelegt ist. Es zielt auf eine groß angelegte Einführung und Migration für bestehende Codebasen und Entwickler ab.

instagram viewer

Hauptmerkmale von Kohlenstoff

Zu den wichtigsten Funktionen von Carbon gehören C++-Interoperabilität, moderne Generika und Speichersicherheit.

Interoperabilität mit C++

Carbon zielt darauf ab, eine sanfte Lernkurve für C++-Entwickler mit einem standardisierten, konsistenten Satz von Sprachkonstrukten bereitzustellen.

Nehmen Sie zum Beispiel diesen C++-Code:

// C++:
#enthalten
#enthalten
#enthalten
#enthalten

StrukturKreis {
schweben r;
};

LeereGesamtfläche drucken(Standard::Spanne Kreise){
schweben Bereich = 0;

zum (konst Kreis& c: Kreise) {
Bereich += M_PI * c.r * c.r;
}

Standard::cout << "Gesamtfläche: " << Fläche << Ende;
}

Autohauptsächlich(int Argc, verkohlen** arg) ->; int {
Standard::Vektor Kreise = {{1.0}, {2.0}};

// Konstruiert implizit `span` aus `vector`.
PrintTotalArea (Kreise);
Rückkehr0;
}

Übersetzt in Kohlenstoff wird es zu:

// Kohlenstoff:
Paket Geometrie-API;
importierenMathematik;

KlasseKreis{
Var r: f32;
}

fn Gesamtfläche drucken(Kreise: Scheibe (Kreis)) {
Var Bereich: f32 = 0;

for (c: Kreis im Kreis) {
Bereich += Mathematik.Pi * c.r * c.r;
}

Drucken("Gesamtfläche: {0}", Bereich);
}

fn Hauptsächlich() ->; i32 {
// Ein Array mit dynamischer Größe, wie `std:: vector`.
Var Kreise: Array(Kreis) = ({.r = 1.0}, {.r = 2.0});

// Konstruiert implizit `Slice` aus `Array`.
PrintTotalArea (Kreise);
Rückkehr0;
}

Sie können auch eine einzelne C++-Bibliothek innerhalb einer Anwendung zu Carbon migrieren oder neuen Carbon-Code zusätzlich zu vorhandenem C++-Code hinzufügen. Zum Beispiel:

// C++-Code, der sowohl in Carbon als auch in C++ verwendet wird:
StrukturKreis {
schweben r;
};

// Carbon stellt eine Funktion für C++ zur Verfügung:
Paket Geometry api;
importieren Cpp-Bibliothek "Kreis.h";
importieren Mathematik;

fn Gesamtfläche drucken(Kreise: Slice (Cpp. Kreis)){
Var-Bereich: f32 = 0;

zum (c: Vgl. Kreis im Kreis) {
Fläche += Math. Pi * c.r * c.r;
}

Print("Gesamtfläche: {0}", Bereich);
}

// C++ ruft Kohlenstoff auf:
#enthalten
#enthalten "Kreis.h"
#enthalten "Geometrie.Kohlenstoff.h"

Autohauptsächlich(int Argc, verkohlen** arg) ->; int {
Standard::Vektor Kreise = {{1.0}, {2.0}};

// Carbons `Slice` unterstützt implizite Konstruktion aus `std:: vector`,
// ähnlich wie `std:: span`.
Geometrie:: PrintTotalArea (Kreise);
Rückkehr0;
}

Ein modernes Generika-System

Carbon stellt ein modernes Generika-System mit geprüften Definitionen zur Verfügung. Es werden jedoch weiterhin Opt-in-Vorlagen für nahtlose C++-Interoperabilität unterstützt.

Dieses generische System bietet viele Vorteile gegenüber C++-Vorlagen:

  • Typprüfungen für generische Definitionen. Dies vermeidet die Kompilierzeitkosten für die erneute Überprüfung von Definitionen für jede Instanziierung.
  • Starke, geprüfte Schnittstellen. Diese reduzieren zufällige Abhängigkeiten von Implementierungsdetails und schaffen einen expliziteren Vertrag.

Speichersicherheit

Carbon versucht, die Speichersicherheit, ein Schlüsselproblem von C++, anzugehen, indem es:

  • Besseres Verfolgen von nicht initialisierten Zuständen, verstärkte Durchsetzung der Initialisierung und Härtung gegen Initialisierungsfehler.
  • Entwerfen grundlegender APIs und Idiome zur Unterstützung dynamischer Begrenzungsprüfungen in Debug- und gehärteten Builds.
  • Einen standardmäßigen Debug-Build-Modus zu haben, der umfassender ist als die bestehenden Build-Modi von C++.

Erste Schritte mit Kohlenstoff

Sie können Carbon jetzt erkunden, indem Sie sich die Codebasis ansehen und den Carbon Explorer verwenden:

# Bazelisk mit Homebrew installieren.
$ brew installiere bazelisk

# Installieren Sie Clang/LLVM mit Homebrew.
# Viele Clang/LLVM-Releases sind nicht mit Optionen gebaut, auf die wir uns verlassen.
$ brew installiere llvm
$ Export PATH="$(brew --prefix llvm)/bin:${PFAD}"

# Laden Sie den Code von Carbon herunter.
$ git Klon https://github.com/carbon-language/carbon-lang
$ CD Kohlenstoff-lang

# Den Explorer erstellen und ausführen.
$ bazel run //explorer -- ./explorer/testdata/drucken/format_only.carbon

Die Roadmap von Carbon zeigt langfristiges Denken

Laut der Carbon-Roadmap wird Google das Experiment mit der Veröffentlichung einer funktionsfähigen Kernversion (0.1) bis Ende 2022 veröffentlichen. Sie planen, dies mit einer 0.2-Version im Jahr 2023 und einer vollständigen 1.0-Version in den Jahren 2024–2025 zu verfolgen.

Ob Google in der Lage sein wird, den Erfolg ihrer anderen Sprachen Golang und Kotlin zu reproduzieren, bleibt abzuwarten.