Siden starten har C++ været det primære valg til at bygge præstationsintensive applikationer. Men sproget har stadig nogle forældede praksisser forårsaget af dets "design af udvalg".

Den 19. juli 2022, under CPP North C++-konferencen i Toronto, introducerede Google-ingeniøren Chandler Carruth Carbon.

Find ud af, hvad Carbon er, og hvordan det har til hensigt at lykkes med C++.

Hvad er Carbon?

Googles ingeniører udviklede Kulstof programmeringssprog for at afhjælpe manglerne ved C++.

Mange eksisterende sprog som Golang og Rust eksisterer allerede, der afspejler C++'s ydeevne uden dens mangler. Desværre udgør disse sprog betydelige barrierer for migreringen af ​​eksisterende C++-kodebaser.

Carbon sigter mod at være hvad TypeScript er for JavaScript, og Kotlin er til Java. Det er ikke en erstatning, men et efterfølgersprog designet omkring interoperabilitet med C++. Det sigter mod storstilet adoption og migrering for eksisterende kodebaser og udviklere.

Nøgletræk ved Carbon

Nogle af Carbons nøglefunktioner inkluderer C++ interoperabilitet, moderne generiske stoffer og hukommelsessikkerhed.

instagram viewer

Interoperabilitet med C++

Carbon sigter mod at give en blid indlæringskurve for C++-udviklere med et standard, ensartet sæt sprogkonstruktioner.

Tag for eksempel denne C++ kode:

// C++:
#omfatte
#omfatte
#omfatte
#omfatte

strukturCirkel {
flyde r;
};

ugyldigPrintTotalArea(std:: span cirkler){
flyde område = 0;

til (konst Cirkel& c: cirkler) {
område += M_PI * c.r * c.r;
}

std::cout << "Samlet areal: " << areal << endl;
}

autovigtigste(int argc, char** argv) ->; int {
std::vektor cirkler = {{1.0}, {2.0}};

// Konstruerer implicit `span` fra `vektor`.
PrintTotalArea (cirkler);
Vend tilbage0;
}

Oversat til Carbon bliver det:

// Kulstof:
pakke Geometri api;
importereMatematik;

klasseCirkel{
var r: f32;
}

fn PrintTotalArea(cirkler: Udsnit (cirkel)) {
var areal: f32 = 0;

for (c: Cirkel i cirkler) {
område += Matematik.Pi * c.r * c.r;
}

Print("Samlet areal: {0}", areal);
}

fn Hoved() ->; i32 {
// Et array i dynamisk størrelse, som "std:: vektor".
var cirkler: Array(Cirkel) = ({.r = 1.0}, {.r = 2.0});

// Konstruerer implicit `Slice` fra `Array`.
PrintTotalArea (cirkler);
Vend tilbage0;
}

Du kan også migrere et enkelt C++-bibliotek til Carbon i en applikation eller tilføje ny Carbon-kode oven på eksisterende C++-kode. For eksempel:

// C++ kode brugt i både Carbon og C++:
strukturCirkel {
flyde r;
};

// Kulstof, der afslører en funktion for C++:
pakke Geometri api;
importere Cpp bibliotek"cirkel.h";
importere matematik;

fn PrintTotalArea(cirkler: Skive (Cpp. Cirkel)){
var område: f32 = 0;

til (c: Cpp. Cirkel i cirkler) {
område += Matematik. Pi * c.r * c.r;
}

Udskriv("Samlet areal: {0}", areal);
}

// C++ kalder Carbon:
#omfatte
#omfatte "cirkel.h"
#omfatte "geometry.carbon.h"

autovigtigste(int argc, char** argv) ->; int {
std::vektor cirkler = {{1.0}, {2.0}};

// Carbons `Slice` understøtter implicit konstruktion fra `std:: vector`,
// ligner `std:: span`.
Geometri:: PrintTotalArea (cirkler);
Vend tilbage0;
}

Et moderne generisk system

Carbon giver et moderne generisk system med kontrollerede definitioner. Men det understøtter stadig opt-in-skabeloner for problemfri C++-interoperabilitet.

Dette generiske system giver en masse fordele til C++-skabeloner:

  • Typetjek for generiske definitioner. Dette undgår kompileringsomkostningerne ved at gentjekke definitioner for hver instansiering.
  • Stærke, tjekkede grænseflader. Disse reducerer utilsigtet afhængighed af implementeringsdetaljer og skaber en mere eksplicit kontrakt.

Hukommelsessikkerhed

Carbon søger at løse hukommelsessikkerhed, et nøgleproblem, der plager C++, ved at:

  • Sporing af ikke-initialiserede tilstande bedre, øger håndhævelsen af ​​initialisering og hærder mod initialiseringsfejl.
  • Design af grundlæggende API'er og idiomer til at understøtte dynamiske grænsekontrol i fejlfinding og hærdede builds.
  • At have en standard debug build-tilstand, der er mere omfattende end C++'s eksisterende build-tilstande.

Kom godt i gang med kulstof

Du kan udforske Carbon lige nu ved at tjekke kodebasen ud og bruge Carbon Explorer:

# Installer bazelisk ved hjælp af Homebrew.
$ brew install bazelisk

# Installer Clang/LLVM ved hjælp af Homebrew.
# Mange Clang/LLVM-udgivelser er ikke bygget med muligheder, vi stoler på.
$ brew install llvm
$ eksport PATH="$(brew --præfiks llvm)/bin:${PATH}"

# Download Carbons kode.
$ git klon https://github.com/carbon-language/carbon-lang
$ cd kulstof-lang

# Byg og kør udforskeren.
$ bazel run //explorer -- ./explorer/testdata/Print/format_only.carbon

Carbons køreplan afslører langsigtet tænkning

Ifølge Carbon-køreplanen vil Google offentliggøre eksperimentet med udgivelsen af ​​en kerneversion (0.1) inden udgangen af ​​2022. De planlægger at følge dette med en 0.2-version i 2023 og en fuld 1.0-udgivelse i 2024-2025.

Hvorvidt Google vil være i stand til at genskabe succesen med deres andre sprog, Golang og Kotlin, skal vise sig.