Sinds het begin is C++ de eerste keuze geweest voor het bouwen van prestatie-intensieve toepassingen. Maar de taal heeft nog steeds een aantal verouderde praktijken die worden veroorzaakt door het "ontwerp door commissie".

Op 19 juli 2022, tijdens de CPP North C++-conferentie in Toronto, introduceerde Google-ingenieur Chandler Carruth Carbon.

Ontdek wat Carbon is en hoe het C++ wil opvolgen.

Wat is koolstof?

Google-ingenieurs ontwikkelden de Koolstof programmeertaal om de tekortkomingen van C++ aan te pakken.

veel bestaande talen zoals Golang en Rust bestaan ​​al die de prestaties van C++ weerspiegelen zonder zijn tekortkomingen. Helaas vormen deze talen aanzienlijke belemmeringen voor de migratie van bestaande C++-codebases.

Carbon wil zijn wat TypeScript is voor JavaScript, en Kotlin is naar Java. Het is geen vervanging, maar een opvolgertaal die is ontworpen rond interoperabiliteit met C++. Het streeft naar grootschalige acceptatie en migratie voor bestaande codebases en ontwikkelaars.

Belangrijkste kenmerken van koolstof

instagram viewer

Enkele van de belangrijkste kenmerken van Carbon zijn C++-interoperabiliteit, moderne generieke geneesmiddelen en geheugenveiligheid.

Interoperabiliteit met C++

Carbon heeft als doel een zachte leercurve te bieden voor C++-ontwikkelaars, met een standaard, consistente set taalconstructies.

Neem bijvoorbeeld deze C++-code:

// C++:
#erbij betrekken
#erbij betrekken
#erbij betrekken
#erbij betrekken

structurerenCirkel {
vlot r;
};

leegteAfdrukkenTotaalGebied(soa::span cirkels){
vlot gebied = 0;

voor (const Cirkel & c: cirkels) {
gebied += M_PI * c.r * c.r;
}

soa::cout << "Totale oppervlakte: " << oppervlakte << eindel;
}

autohoofd(int argc, char**argv) ->; int {
soa::vector cirkels = {{1.0}, {2.0}};

// construeert impliciet `span` van `vector`.
PrintTotalArea (cirkels);
opbrengst0;
}

Vertaald naar koolstof wordt het:

// Koolstof:
pakket Geometrie-API;
importerenWiskunde;

klasCirkel{
var r: f32;
}

fn AfdrukkenTotaalGebied(cirkels: Slice (Cirkel)) {
var gebied: f32 = 0;

voor (c: cirkel in cirkels) {
gebied += Wiskunde.Pi * c.r * c.r;
}

Afdrukken("Totale oppervlakte: {0}", Oppervlakte);
}

fn Hoofd() ->; i32 {
// Een array van dynamische grootte, zoals `std:: vector`.
var cirkels: Array(Cirkel) = ({.r = 1.0}, {.r = 2.0});

// construeert impliciet `Slice` van `Array`.
PrintTotalArea (cirkels);
opbrengst0;
}

U kunt ook een enkele C++-bibliotheek migreren naar Carbon binnen een toepassing of nieuwe Carbon-code toevoegen bovenop bestaande C++-code. Bijvoorbeeld:

// C++ code gebruikt in zowel Carbon als C++:
structurerenCirkel {
vlot r;
};

// Carbon die een functie blootlegt voor C ++:
pakket Geometrie api;
importeren Cpp-bibliotheek "cirkel.h";
importeren Wiskunde;

fn AfdrukkenTotaalGebied(cirkels: Slice (Cpp. Cirkel)){
var gebied: f32 = 0;

voor (c: Cpp. Cirkel in cirkels) {
gebied += Wiskunde. Pi * c.r * c.r;
}

Print("Totale oppervlakte: {0}", Oppervlakte);
}

// C++ die Carbon aanroept:
#erbij betrekken
#erbij betrekken "cirkel.h"
#erbij betrekken "geometrie.carbon.h"

autohoofd(int argc, char**argv) ->; int {
soa::vector cirkels = {{1.0}, {2.0}};

// Carbon's `Slice` ondersteunt impliciete constructie van `std:: vector`,
// vergelijkbaar met `std:: span`.
Geometrie:: PrintTotalArea (cirkels);
opbrengst0;
}

Een modern generiek systeem

Carbon biedt een modern generiek systeem met gecontroleerde definities. Maar het ondersteunt nog steeds opt-in-sjablonen voor naadloze C++-interoperabiliteit.

Dit generieke systeem biedt veel voordelen aan C++-sjablonen:

  • Typecontroles voor generieke definities. Dit vermijdt de kosten voor het compileren van het opnieuw controleren van definities voor elke instantie.
  • Sterke, gecontroleerde interfaces. Deze verminderen onbedoelde afhankelijkheden van implementatiedetails en creëren een meer expliciet contract.

Geheugenbeveiliging

Carbon probeert de veiligheid van het geheugen aan te pakken, een belangrijk probleem dat C++ teistert, door:

  • Niet-geïnitialiseerde statussen beter volgen, de handhaving van initialisatie verhogen en beter bestand zijn tegen initialisatiebugs.
  • Ontwerpen van fundamentele API's en idiomen ter ondersteuning van dynamische grenscontroles in debug- en geharde builds.
  • Een standaard debug-bouwmodus hebben die uitgebreider is dan de bestaande bouwmodi van C++.

Aan de slag met koolstof

Je kunt Carbon nu verkennen door de codebase te bekijken en Carbon Explorer te gebruiken:

# Installeer bazelisk met Homebrew.
$ brew install bazelisk

# Installeer Clang/LLVM met Homebrew.
# Veel Clang/LLVM-releases zijn niet gebouwd met opties waarop we vertrouwen.
$ brew install llvm
$ exporteren PATH="$(brew --prefix llvm)/bin:${PAD}"

# Download de code van Carbon.
$ git klonen https://github.com/carbon-language/carbon-lang
$ CD koolstof-lang

# Bouw en voer de verkenner uit.
$ bazel run //explorer -- ./explorer/testdata/afdrukken/format_only.carbon

De routekaart van Carbon onthult langetermijndenken

Volgens de Carbon roadmap zal Google het experiment eind 2022 openbaar maken met de release van een werkende kernversie (0.1). Ze zijn van plan dit te volgen met een 0.2-versie in 2023 en een volledige 1.0-release in 2024-2025.

Of Google het succes van hun andere talen, Golang en Kotlin, zal kunnen reproduceren, valt nog te bezien.