Desde a sua criação, C++ tem sido a principal escolha para a construção de aplicativos de alto desempenho. Mas a linguagem ainda apresenta algumas práticas desatualizadas causadas pelo seu “design por comitê”.
Em 19 de julho de 2022, durante a conferência CPP North C++ em Toronto, o engenheiro do Google Chandler Carruth apresentou o Carbon.
Descubra o que é Carbon e como pretende ter sucesso com o C++.
O que é Carbono?
Os engenheiros do Google desenvolveram o Carbono linguagem de programação para resolver as deficiências do C++.
Muitos existentes línguas como Golang e Rust já existem que espelham o desempenho de C++ sem suas deficiências. Infelizmente, essas linguagens apresentam barreiras significativas para a migração de bases de código C++ existentes.
O carbono pretende ser o que TypeScript é para JavaScript, e Kotlin é para Java. Não é uma substituição, mas uma linguagem sucessora projetada em torno da interoperabilidade com C++. Ele visa a adoção e migração em larga escala para bases de código e desenvolvedores existentes.
Principais Características do Carbono
Alguns dos principais recursos do Carbon incluem interoperabilidade C++, genéricos modernos e segurança de memória.
Interoperabilidade com C++
O Carbon visa fornecer uma curva de aprendizado suave para desenvolvedores C++, com um conjunto padrão e consistente de construções de linguagem.
Por exemplo, pegue este código C++:
//C++:
#incluir
#incluir
#incluir
#incluirestruturaCírculo {
flutuador r;
};vazioImprimirÁreaTotal(padrão::período
círculos) {
flutuador área = 0;por (const Círculo& c: círculos) {
área += M_PI * c.r * c.r;
}padrão::cout << "Área total: " << área << fim;
}autoa Principal(int argc, Caracteres** argv) ->; int {
padrão::vetorcírculos = {{1.0}, {2.0}};
// Construa implicitamente `span` a partir de `vector`.
PrintTotalArea (círculos);
Retorna0;
}
Traduzido para Carbono, torna-se:
// Carbono:
pacote API de geometria;
importarMatemática;classeCírculo{
var r: f32;
}fn ImprimirÁreaTotal(círculos: Fatia (Círculo)) {
var área: f32 = 0;for (c: Circule em círculos) {
área += Matemática.Pi * c.r * c.r;
}Imprimir("Área total: {0}", área);
}fn Principal() ->; i32 {
// Um array de tamanho dinâmico, como `std:: vector`.
var círculos: Variedade(Círculo) = ({.r = 1.0}, {.r = 2.0});
// Construir implicitamente `Slice` a partir de `Array`.
PrintTotalArea (círculos);
Retorna0;
}
Você também pode migrar uma única biblioteca C++ para Carbon dentro de um aplicativo ou adicionar um novo código Carbon sobre o código C++ existente. Por exemplo:
// Código C++ usado em Carbon e C++:
estruturaCírculo {
flutuador r;
};// Carbono expondo uma função para C++:
pacote Geometria api;
importar biblioteca Cpp"círculo.h";
importar Matemática;fn ImprimirÁreaTotal(círculos: Fatia (Cpp. Círculo)){
var área: f32 = 0;por (c: Cp. Circule em círculos) {
área += Math. Pi * c.r * c.r;
}Print("Área total: {0}", área);
}// C++ chamando Carbon:
#incluir
#incluir "círculo.h"
#incluir "geometria.carbon.h"autoa Principal(int argc, Caracteres** argv) ->; int {
padrão::vetorcírculos = {{1.0}, {2.0}};
// O `Slice` do Carbon suporta construção implícita de `std:: vector`,
// semelhante a `std:: span`.
Geometria:: PrintTotalArea (círculos);
Retorna0;
}
Um Sistema Genérico Moderno
Carbono fornece um sistema genérico moderno com definições verificadas. Mas ele ainda oferece suporte a modelos opt-in para interoperabilidade C++ perfeita.
Esse sistema genérico oferece muitas vantagens aos modelos C++:
- Verificações de tipo para definições genéricas. Isso evita o custo de tempo de compilação de verificar novamente as definições para cada instanciação.
- Interfaces fortes e verificadas. Isso reduz dependências acidentais em detalhes de implementação e cria um contrato mais explícito.
Segurança da memória
O Carbon procura abordar a segurança da memória, uma questão fundamental que assola o C++, por:
- Rastreando melhor os estados não inicializados, aumentando a aplicação da inicialização e protegendo contra bugs de inicialização.
- Projetando APIs e idiomas fundamentais para dar suporte a verificações de limites dinâmicos em compilações de depuração e reforçadas.
- Ter um modo de compilação de depuração padrão que é mais abrangente do que os modos de compilação existentes do C++.
Introdução ao Carbono
Você pode explorar o Carbon agora mesmo verificando a base de código e usando o Carbon explorer:
# Instale o bazelisk usando o Homebrew.
$ brew instalar bazelisk# Instale o Clang/LLVM usando o Homebrew.
# Muitas versões do Clang/LLVM não são construídas com opções nas quais confiamos.
$ brew install llvm
$ exportar PATH="$(brew --prefix llvm)/bin:${PATH}"# Baixe o código do Carbon.
$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbono-lang
# Construa e execute o explorador.
$ bazel run //explorer -- ./explorer/testdata/imprimir/format_only.carbon
O roteiro da Carbon revela um pensamento de longo prazo
De acordo com o roteiro da Carbon, o Google tornará o experimento público com o lançamento de uma versão de trabalho principal (0.1) até o final de 2022. Eles planejam seguir isso com uma versão 0.2 em 2023 e uma versão 1.0 completa em 2024-2025.
Se o Google será capaz de reproduzir o sucesso de seus outros idiomas, Golang e Kotlin, ainda não se sabe.