Desde sus inicios, C++ ha sido la elección principal para crear aplicaciones de alto rendimiento. Pero el lenguaje todavía presenta algunas prácticas obsoletas causadas por su "diseño por comité".

El 19 de julio de 2022, durante la conferencia CPP North C++ en Toronto, el ingeniero de Google, Chandler Carruth, presentó Carbon.

Descubra qué es Carbon y cómo pretende suceder a C++.

¿Qué es el carbono?

Los ingenieros de Google desarrollaron el Carbón lenguaje de programación para abordar las deficiencias de C++.

Muchos existentes idiomas como golang y Rust ya existen que reflejan el rendimiento de C++ sin sus defectos. Desafortunadamente, estos lenguajes presentan barreras significativas para la migración de las bases de código C++ existentes.

El carbono pretende ser qué es TypeScript para JavaScripty Kotlin es para Java. No es un reemplazo, sino un lenguaje sucesor diseñado en torno a la interoperabilidad con C++. Su objetivo es la adopción y migración a gran escala para las bases de código y los desarrolladores existentes.

instagram viewer

Características clave del carbono

Algunas de las características clave de Carbon incluyen la interoperabilidad de C++, los genéricos modernos y la seguridad de la memoria.

Interoperabilidad con C++

Carbon tiene como objetivo proporcionar una curva de aprendizaje suave para los desarrolladores de C ++, con un conjunto estándar y consistente de construcciones de lenguaje.

Por ejemplo, tome este código C++:

//C++:
#incluir
#incluir
#incluir
#incluir

estructuraCirculo {
flotar r;
};

vacíoImprimirÁreaTotal(estándar::lapso círculos){
flotar área = 0;

por (constante Círculo& c: círculos) {
área += M_PI * c.r * c.r;
}

estándar::cout << "Área total: " << área << final;
}

autoprincipal(En t argc, carbonizarse**argv) ->; En t {
estándar::vector círculos = {{1.0}, {2.0}};

// Construye implícitamente `span` a partir de `vector`.
PrintTotalArea (círculos);
devolver0;
}

Traducido a Carbono, se convierte en:

// Carbono:
paquete API de geometría;
importarMatemáticas;

claseCirculo{
variable derecha: f32;
}

fn ImprimirÁreaTotal(círculos: rebanada (círculo)) {
variable área: f32 = 0;

for (c: Círculo en círculos) {
área += Matemáticas.Pi * c.r * c.r;
}

Impresión("Superficie total: {0}", área);
}

fn Principal() ->; i32 {
// Una matriz de tamaño dinámico, como `std:: vector`.
variable círculos: Formación(Círculo) = ({.r = 1.0}, {.r = 2.0});

// Construye implícitamente `Slice` a partir de `Array`.
PrintTotalArea (círculos);
devolver0;
}

También puede migrar una única biblioteca de C++ a Carbon dentro de una aplicación o agregar un nuevo código de Carbon sobre el código de C++ existente. Por ejemplo:

// Código C++ utilizado tanto en Carbon como en C++:
estructuraCirculo {
flotar r;
};

// Carbono exponiendo una función para C++:
paquete API de geometría;
importar biblioteca cpp "circulo.h";
importar Matemáticas;

fn ImprimirÁreaTotal(círculos: Rebanada (Cpp. Circulo)){
var área: f32 = 0;

por (c: Cpp. Círculo en círculos) {
área += matemáticas. Pi * c.r * c.r;
}

Imprimir("Área total: {0}", área);
}

// C++ llamando a Carbon:
#incluir
#incluir "círculo.h"
#incluir "geometría.carbono.h"

autoprincipal(En t argc, carbonizarse**argv) ->; En t {
estándar::vector círculos = {{1.0}, {2.0}};

// El `Slice` de Carbon admite la construcción implícita de `std:: vector`,
// similar a `std:: span`.
Geometría:: PrintTotalArea (círculos);
devolver0;
}

Un sistema moderno de genéricos

Carbon proporciona un sistema genérico moderno con definiciones comprobadas. Pero aún admite plantillas opcionales para una interoperabilidad perfecta con C++.

Este sistema genérico proporciona muchas ventajas a las plantillas de C++:

  • Comprobaciones de tipos para definiciones genéricas. Esto evita el costo del tiempo de compilación de volver a verificar las definiciones para cada instanciación.
  • Interfaces fuertes y comprobadas. Estos reducen las dependencias accidentales en los detalles de implementación y crean un contrato más explícito.

Seguridad de la memoria

Carbon busca abordar la seguridad de la memoria, un problema clave que afecta a C++, al:

  • Realizar un mejor seguimiento de los estados no inicializados, aumentar la aplicación de la inicialización y reforzar los errores de inicialización.
  • Diseño de API y modismos fundamentales para admitir comprobaciones de límites dinámicos en compilaciones reforzadas y de depuración.
  • Tener un modo de compilación de depuración predeterminado que sea más completo que los modos de compilación existentes de C++.

Primeros pasos con el carbono

Puede explorar Carbon ahora mismo revisando la base de código y usando Carbon Explorer:

# Instale bazelisk usando Homebrew.
$ brew instalar bazelisk

# Instale Clang/LLVM usando Homebrew.
# Muchos lanzamientos de Clang/LLVM no están construidos con las opciones en las que confiamos.
$ preparar instalar llvm
$ exportar PATH="$(preparar --prefijo llvm)/bin:${RUTA}"

# Descarga el código de Carbon.
$ git clon https://github.com/carbon-language/carbon-lang
$ discos compactos carbono-lang

# Cree y ejecute el explorador.
$ bazel ejecutar //explorador -- ./explorador/datos de prueba/impresión/format_only.carbon

La hoja de ruta de Carbon revela un pensamiento a largo plazo

De acuerdo con la hoja de ruta de Carbon, Google hará público el experimento con el lanzamiento de una versión básica de trabajo (0.1) para fines de 2022. Planean seguir esto con una versión 0.2 en 2023 y una versión 1.0 completa en 2024-2025.

Queda por ver si Google será capaz de reproducir el éxito de sus otros lenguajes, Golang y Kotlin.