Od svog početka, C++ je bio glavni izbor za izradu aplikacija koje zahtijevaju velike performanse. Ali jezik još uvijek sadrži neke zastarjele prakse uzrokovane njegovim "dizajnom odbora".

19. srpnja 2022., tijekom CPP North C++ konferencije u Torontu, Googleov inženjer Chandler Carruth predstavio je Carbon.

Saznajte što je Carbon i kako namjerava naslijediti C++.

Što je ugljik?

Googleovi inženjeri razvili su Ugljik programski jezik za rješavanje nedostataka C++.

Mnogi postojeći jezika poput Golanga i Rust već postoje koji odražavaju performanse C++-a bez njegovih nedostataka. Nažalost, ovi jezici predstavljaju značajne prepreke za migraciju postojećih C++ kodnih baza.

Carbon ima za cilj biti što je TypeScript za JavaScript, a Kotlin je Javi. To nije zamjena, već nasljednik jezika dizajniranog oko interoperabilnosti s C++. Cilj mu je usvajanje velikih razmjera i migracija za postojeće baze kodova i programere.

Ključne značajke ugljika

Neke od ključnih značajki Carbona uključuju C++ interoperabilnost, moderne generike i sigurnost memorije.

Interoperabilnost s C++

Carbon ima za cilj pružiti blagu krivulju učenja za C++ programere, sa standardnim, dosljednim skupom jezičnih konstrukcija.

Na primjer, uzmite ovaj C++ kod:

// C++:
#uključiti
#uključiti
#uključiti
#uključiti

strukturiratiKrug {
plutati r;
};

poništitiIspiši ukupnu površinu(std:: raspon krugovi){
plutati površina = 0;

za (konst Krug& c: krugovi) {
površina += M_PI * c.r * c.r;
}

std::cout << "Ukupna površina: " << površina << endl;
}

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

// Implicitno konstruira `span` iz `vektora`.
PrintTotalArea (krugovi);
povratak0;
}

Prevedeno na ugljik, to postaje:

// Ugljik:
paket Geometry api;
uvozmatematika;

razredaKrug{
var r: f32;
}

fn Ispiši ukupnu površinu(krugovi: Kriška (Krug)) {
var područje: f32 = 0;

za (c: Krug u krugovima) {
površina += matematika.Pi * c.r * c.r;
}

Ispis("Ukupna površina: {0}", površina);
}

fn Glavni() ->; i32 {
// Niz dinamičke veličine, poput `std:: vector`.
var krugovi: Niz(Krug) = ({.r = 1.0}, {.r = 2.0});

// Implicitno konstruira `Slice` iz `Array`.
PrintTotalArea (krugovi);
povratak0;
}

Također možete migrirati jednu C++ biblioteku na Carbon unutar aplikacije ili dodati novi Carbon kod povrh postojećeg C++ koda. Na primjer:

// C++ kod koji se koristi u Carbonu i C++:
strukturiratiKrug {
plutati r;
};

// Carbon izlaže funkciju za C++:
paket Geometry api;
uvoz Cpp biblioteka "krug.h";
uvoz matematika;

fn Ispiši ukupnu površinu(zaokružuje: Slice (Cpp. Krug)){
promjenljivo područje: f32 = 0;

za (c: Cpp. Krug u krugovima) {
područje += mat. Pi * c.r * c.r;
}

Print("Ukupna površina: {0}", površina);
}

// C++ poziva Carbon:
#uključiti
#uključiti "krug.h"
#uključiti "geometry.carbon.h"

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

// Carbon's `Slice` podržava implicitnu konstrukciju iz `std:: vector`,
// slično kao `std:: span`.
Geometry:: PrintTotalArea (krugovi);
povratak0;
}

Suvremeni generički sustav

Carbon pruža moderan generički sustav s provjerenim definicijama. Ali još uvijek podržava predloške za uključivanje za besprijekornu C++ interoperabilnost.

Ovaj generički sustav pruža puno prednosti C++ predlošcima:

  • Provjere tipa za generičke definicije. Time se izbjegava trošak vremena kompajliranja ponovne provjere definicija za svaku instanciju.
  • Jaka, provjerena sučelja. To smanjuje slučajne ovisnosti o detaljima implementacije i stvara eksplicitniji ugovor.

Sigurnost memorije

Carbon nastoji riješiti sigurnost memorije, ključni problem koji muči C++, tako što:

  • Bolje praćenje neinicijaliziranih stanja, povećanje provedbe inicijalizacije i zaštita od inicijalizacijskih grešaka.
  • Dizajn temeljnih API-ja i idioma za podršku dinamičkih provjera granica u ispravljanju pogrešaka i pojačanim verzijama.
  • Imati zadani način izrade za otklanjanje pogrešaka koji je sveobuhvatniji od postojećih načina izrade C++-a.

Početak rada s ugljikom

Možete istražiti Carbon upravo sada tako da provjerite bazu kodova i koristite Carbon explorer:

# Instalirajte bazelisk koristeći Homebrew.
$ kuhati instalirati bazelisk

# Instalirajte Clang/LLVM koristeći Homebrew.
# Mnoga Clang/LLVM izdanja nisu izgrađena s opcijama na koje se oslanjamo.
$ kuhati instalirati llvm
$ izvoz PATH="$(brew --prefix llvm)/bin:${PATH}"

# Preuzmite Carbonov kod.
$ git klon https://github.com/carbon-language/carbon-lang
$ CD ugljik-lang

# Izradite i pokrenite istraživač.
$ bazel run //explorer -- ./explorer/testdata/ispisati/format_only.carbon

Carbon's Roadmap otkriva dugoročno razmišljanje

Prema karti puta za Carbon, Google će eksperiment objaviti izdavanjem osnovne radne verzije (0.1) do kraja 2022. Planiraju to pratiti s verzijom 0.2 2023. i punim izdanjem 1.0 2024.–2025.

Hoće li Google uspjeti reproducirati uspjeh svojih drugih jezika, Golang i Kotlin, ostaje za vidjeti.