Od svojega začetka je bil C++ glavna izbira za gradnjo visokozmogljivih aplikacij. Toda jezik še vedno vsebuje nekaj zastarelih praks, ki jih je povzročilo njegovo "oblikovanje odbora".

19. julija 2022 je med konferenco CPP North C++ v Torontu Googlov inženir Chandler Carruth predstavil Carbon.

Ugotovite, kaj je Carbon in kako namerava naslediti C++.

Kaj je Carbon?

Googlovi inženirji so razvili Ogljik programskega jezika za odpravo pomanjkljivosti C++.

Veliko obstoječih jezikov, kot je golang in Rust že obstajata, ki odražata delovanje C++ brez njegovih pomanjkljivosti. Na žalost ti jeziki predstavljajo pomembne ovire za selitev obstoječih kodnih baz C++.

Carbon želi biti kaj je TypeScript za JavaScript, Kotlin pa za Javo. Ne gre za nadomestek, ampak za naslednika jezika, zasnovanega na podlagi interoperabilnosti s C++. Prizadeva si za obsežno sprejetje in selitev za obstoječe kodne baze in razvijalce.

Ključne značilnosti ogljika

Nekatere ključne lastnosti Carbona vključujejo interoperabilnost C++, sodobne generike in varnost pomnilnika.

instagram viewer

Interoperabilnost s C++

Cilj Carbon je zagotoviti nežno učno krivuljo za razvijalce C++ s standardnim, doslednim nizom jezikovnih konstruktov.

Na primer, vzemite to kodo C++:

// C++:
#vključujejo
#vključujejo
#vključujejo
#vključujejo

structKrog {
lebdi r;
};

prazninaPrintTotalArea(std::razpon krogi){
lebdi območje = 0;

za (konst Krog& c: krogi) {
območje += M_PI * c.r * c.r;
}

std::cout << "Skupna površina: " << površina << konec;
}

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

// Implicitno sestavi `span` iz `vektorja`.
PrintTotalArea (krogi);
vrnitev0;
}

Prevedeno v ogljik postane:

// Ogljik:
paket Geometry api;
uvozmatematika;

razredKrog{
var r: f32;
}

fn PrintTotalArea(obkroži: rezina (krog)) {
var območje: f32 = 0;

za (c: krog v krogih) {
območje += matematika.Pi * c.r * c.r;
}

Natisni ("Skupna površina: {0}", območje);
}

fn Glavni() ->; i32 {
// Dinamična matrika, kot je `std:: vector`.
var krogi: Array(Krog) = ({.r = 1.0}, {.r = 2.0});

// Implicitno sestavi `Slice` iz `Array`.
PrintTotalArea (krogi);
vrnitev0;
}

Posamezno knjižnico C++ lahko tudi preselite v Carbon znotraj aplikacije ali dodate novo kodo Carbon poleg obstoječe kode C++. Na primer:

// Koda C++, uporabljena v Carbonu in C++:
structKrog {
lebdi r;
};

// Carbon izpostavi funkcijo za C++:
paket Geometry api;
uvoz Cpp knjižnica "krog.h";
uvoz matematika;

fn PrintTotalArea(obkroži: Rezina (Cpp. Krog)){
var območje: f32 = 0;

za (c: Cpp. Krog v krogih) {
območje += Math. Pi * c.r * c.r;
}

Print("Skupna površina: {0}", območje);
}

// C++ kliče Carbon:
#vključujejo
#vključujejo "krog.h"
#vključujejo "geometry.carbon.h"

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

// Carbonov `Slice` podpira implicitno konstrukcijo iz `std:: vector`,
// podobno kot `std:: span`.
Geometrija:: PrintTotalArea (krogi);
vrnitev0;
}

Sodoben generični sistem

Carbon ponuja sodoben generični sistem s preverjenimi definicijami. Vendar še vedno podpira opt-in predloge za brezhibno interoperabilnost C++.

Ta generični sistem ponuja veliko prednosti predlogam C++:

  • Preverjanje tipov za generične definicije. S tem se izognete stroškom v času prevajanja ponovnega preverjanja definicij za vsako instanciacijo.
  • Močni, preverjeni vmesniki. Ti zmanjšajo nenamerne odvisnosti od podrobnosti izvedbe in ustvarijo bolj jasno pogodbo.

Varnost pomnilnika

Carbon poskuša rešiti varnost pomnilnika, ključno težavo, ki pesti C++, tako da:

  • Boljše sledenje neinicializiranim stanjem, povečanje uveljavljanja inicializacije in odpornost proti napakam pri inicializaciji.
  • Oblikovanje temeljnih API-jev in idiomov za podporo preverjanj dinamičnih meja pri odpravljanju napak in utrjenih zgradbah.
  • Imeti privzeti način gradnje za odpravljanje napak, ki je bolj celovit od obstoječih načinov gradnje C++.

Začetek uporabe ogljika

Carbon lahko raziščete zdaj, tako da preverite kodno zbirko in uporabite Carbon explorer:

# Namestite bazelisk z uporabo Homebrew.
$ brew namestite bazelisk

# Namestite Clang/LLVM z uporabo Homebrew.
# Številne izdaje Clang/LLVM niso zgrajene z možnostmi, na katere se zanašamo.
$ brew namestite llvm
$ izvoz PATH="$(brew --prefix llvm)/bin:${PATH}"

# Prenesite kodo Carbon.
$ git klon https://github.com/carbon-language/carbon-lang
$ cd ogljikov-lang

# Zgradite in zaženite raziskovalca.
$ bazel run //raziskovalec -- ./explorer/testdata/tiskanje/format_only.carbon

Carbon's Roadmap razkriva dolgoročno razmišljanje

V skladu z načrtom Carbon bo Google eksperiment javno objavil z izdajo osnovne delovne različice (0.1) do konca leta 2022. Temu nameravajo slediti z različico 0.2 leta 2023 in popolno izdajo 1.0 v letih 2024–2025.

Ali bo Googlu uspelo ponoviti uspeh njihovih drugih jezikov, Golang in Kotlin, bomo še videli.