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.
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
#omfattestrukturCirkel {
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::vektorcirkler = {{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::vektorcirkler = {{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.