Desde a sua criação, o C++ tem sido a principal escolha para a criaçã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 a linguagem de programação Carbon para resolver as deficiências do C++.
Muitas linguagens existentes como Golang e Rust já existem que espelham o desempenho do C++ sem suas deficiências. Infelizmente, essas linguagens apresentam barreiras significativas para a migração de bases de código C++ existentes.
Carbon 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++:
#include <math.h>
#include <iostream>
#include <span>
#include <vector>struct Circle {
float r;
};
void PrintTotalArea(std::span<Circle> circles) {
float area = 0;
for (const Circle& c : circles) {
area += M_PI * c.r * c.r;
}
std::cout << "Total area: " << area << endl;
}
auto main(int argc, char** argv) -> int {
std::vector<Circle> circles = {{1.0}, {2.0}};
PrintTotalArea(circles);
return 0;
}
Traduzido para Carbono, torna-se:
package Geometry api;
import Math;class Circle {
var r: f32;
}
fn PrintTotalArea(circles: Slice(Circle)) {
var area: f32 = 0;
for (c: Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Print("Total area: {0}", area);
}
fn Main() -> i32 {
var circles: Array(Circle) = ({.r = 1.0}, {.r = 2.0});
PrintTotalArea(circles);
return 0;
}
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:
struct Circle {
float r;
};
package Geometry api;
import Cpp library "circle.h";
import Math;
fn PrintTotalArea(circles: Slice(Cpp.Circle)) {
var area: f32 = 0;
for (c: Cpp.Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Print("Total area: {0}", area);
}
#include <vector>
#include "circle.h"
#include "geometry.carbon.h"
auto main(int argc, char** argv) -> int {
std::vector<Circle> circles = {{1.0}, {2.0}};
Geometry::PrintTotalArea(circles);
return 0;
}
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:
$ brew install bazelisk
$ brew install llvm
$ export PATH="$(brew --prefix llvm)/bin:${PATH}"
$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbon-lang
$ bazel run //explorer -- ./explorer/testdata/print/format_only.carbon
O roteiro da Carbon revela o 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 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.