Fin dall'inizio, C++ è stata la scelta privilegiata per la creazione di applicazioni ad alta intensità di prestazioni. Ma il linguaggio presenta ancora alcune pratiche obsolete causate dal suo "design by comitato".

Il 19 luglio 2022, durante la conferenza CPP North C++ a Toronto, l'ingegnere di Google Chandler Carruth ha presentato Carbon.

Scopri cos'è Carbon e come intende avere successo in C++.

Cos'è il carbonio?

Gli ingegneri di Google hanno sviluppato il Carbonio linguaggio di programmazione per affrontare le carenze del C++.

Molti esistenti lingue come il Golang e Rust esistono già che rispecchiano le prestazioni di C++ senza i suoi difetti. Sfortunatamente, questi linguaggi presentano ostacoli significativi alla migrazione delle basi di codice C++ esistenti.

Il carbonio vuole essere cos'è TypeScript per JavaScripte Kotlin è per Java. Non è un sostituto, ma un linguaggio successivo progettato intorno all'interoperabilità con C++. Mira all'adozione e alla migrazione su larga scala per le basi di codice e gli sviluppatori esistenti.

instagram viewer

Caratteristiche principali del carbonio

Alcune delle caratteristiche chiave di Carbon includono l'interoperabilità C++, i generici moderni e la sicurezza della memoria.

Interoperabilità con C++

Carbon mira a fornire una curva di apprendimento delicata per gli sviluppatori C++, con un insieme standard e coerente di costrutti linguistici.

Ad esempio, prendi questo codice C++:

// C++:
#includere
#includere
#includere
#includere

strutturaCerchio {
galleggiante r;
};

vuotoPrintTotalArea(std::span cerchi){
galleggiante zona = 0;

per (cost Cerchio&c: cerchi) {
area += M_PI * c.r * c.r;
}

std::cout << "Superficie totale: " << area << fine;
}

autoprincipale(int argc, car** argv) ->; int {
std::vettore cerchi = {{1.0}, {2.0}};

// Costruisce implicitamente `span` da `vector`.
PrintTotalArea (cerchi);
Restituzione0;
}

Tradotto in Carbonio, diventa:

// Carbonio:
pacchetto API di geometria;
importareMatematica;

classeCerchio{
var r: f32;
}

fn PrintTotalArea(cerchi: Slice (Cerchio)) {
var area: f32 = 0;

for (c: Cerchio in cerchi) {
zona += Matematica.Pi * c.r * c.r;
}

Stampa("Area totale: {0}", la zona);
}

fn Principale() ->; i32 {
// Un array di dimensioni dinamiche, come `std:: vector`.
var cerchi: Vettore(Cerchio) = ({.r = 1.0}, {.r = 2.0});

// Costruisce implicitamente `Slice` da `Array`.
PrintTotalArea (cerchi);
Restituzione0;
}

Puoi anche migrare una singola libreria C++ a Carbon all'interno di un'applicazione o aggiungere nuovo codice Carbon sopra al codice C++ esistente. Per esempio:

// Codice C++ utilizzato sia in Carbon che in C++:
strutturaCerchio {
galleggiante r;
};

// Carbon espone una funzione per C++:
pacchetto Geometria API;
importare Libreria Cpp"cerchio.h";
importare Matematica;

fn PrintTotalArea(cerchi: Fetta (Cpp. Cerchio)){
var area: f32 = 0;

per (c: Cpp. Cerchio in cerchio) {
area += matematica. Pi * c.r * c.r;
}

Print("Area totale: {0}", la zona);
}

// C++ chiama Carbon:
#includere
#includere "cerchio.h"
#includere "geometry.carbon.h"

autoprincipale(int argc, car** argv) ->; int {
std::vettore cerchi = {{1.0}, {2.0}};

// La `Slice` di Carbon supporta la costruzione implicita da `std:: vector`,
// simile a `std:: span`.
Geometria:: PrintTotalArea (cerchi);
Restituzione0;
}

Un moderno sistema di generici

Carbon fornisce un moderno sistema di generici con definizioni controllate. Ma supporta ancora i modelli di attivazione per l'interoperabilità C++ senza interruzioni.

Questo sistema generico offre molti vantaggi ai modelli C++:

  • Controlli di tipo per definizioni generiche. Ciò evita il costo in fase di compilazione del ricontrollo delle definizioni per ogni istanza.
  • Interfacce robuste e controllate. Questi riducono le dipendenze accidentali dai dettagli di implementazione e creano un contratto più esplicito.

Sicurezza della memoria

Carbon cerca di affrontare la sicurezza della memoria, una questione chiave che affligge il C++, attraverso:

  • Tracciamento migliore degli stati non inizializzati, aumento dell'applicazione dell'inizializzazione e protezione dai bug di inizializzazione.
  • Progettazione di API e idiomi fondamentali per supportare i controlli dei limiti dinamici nelle build di debug e rinforzate.
  • Avere una modalità di compilazione di debug predefinita più completa rispetto alle modalità di compilazione esistenti di C++.

Iniziare con il carbonio

Puoi esplorare Carbon in questo momento controllando la base di codice e utilizzando Carbon explorer:

# Installa bazelisk usando Homebrew.
$ brew install bazelisk

# Installa Clang/LLVM usando Homebrew.
# Molte versioni di Clang/LLVM non sono costruite con opzioni su cui ci affidiamo.
$ brew install lvm
$ esportare PATH="$(brew --prefix llvm)/bin:${PERCORSO}"

# Scarica il codice di Carbon.
$ git clone https://github.com/carbon-language/carbon-lang
$ CD carbon-lang

# Costruisci ed esegui l'esploratore.
$ bazel run //explorer -- ./explorer/testdata/Stampa/format_only.carbon

La tabella di marcia di Carbon rivela il pensiero a lungo termine

Secondo la roadmap di Carbon, Google renderà pubblico l'esperimento con il rilascio di una versione core funzionante (0.1) entro la fine del 2022. Hanno in programma di seguirlo con una versione 0.2 nel 2023 e una versione 1.0 completa nel 2024-2025.

Resta da vedere se Google sarà in grado di riprodurre il successo delle loro altre lingue, Golang e Kotlin.