Представляем Carbon, экспериментальный преемник C++ от Google

1
технологии 33.webp

Последнее обновление 08.01.2023 — Василий Иванов

С момента своего появления C++ был лучшим выбором для создания приложений, требовательных к производительности. Но в языке все еще есть некоторые устаревшие методы, вызванные его «разработкой комитетом».

19 июля 2022 года на конференции CPP North C++ в Торонто инженер Google Чендлер Каррут представил Carbon.

Узнайте, что такое Carbon и как он собирается превзойти C++.

Что такое углерод?

Инженеры Google разработали язык программирования Carbon, чтобы устранить недостатки C++.

Уже существуют многие существующие языки, такие как Golang и Rust, которые отражают производительность C++ без его недостатков. К сожалению, эти языки создают значительные препятствия для миграции существующих кодовых баз C++.

Carbon стремится стать тем, чем TypeScript является для JavaScript, а Kotlin — для Java. Это не замена, а язык-преемник, разработанный для взаимодействия с C++. Он нацелен на широкомасштабное внедрение и миграцию существующих кодовых баз и разработчиков.

По теме:  Google Play Pass великолепен, за исключением одного

Ключевые особенности углерода

Некоторые из ключевых особенностей Carbon включают совместимость с C++, современные дженерики и безопасность памяти.

Взаимодействие с С++

Carbon стремится обеспечить мягкую кривую обучения для разработчиков C++ со стандартным, согласованным набором языковых конструкций.

Например, возьмите этот код C++:

// 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) -&gt; int {
std::vector<Circle> circles = {{1.0}, {2.0}};

// Implicitly constructs `span` from `vector`.
PrintTotalArea(circles);
return 0;
}

В переводе на углерод это становится:

// Carbon:
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() -&gt; i32 {
// A dynamically sized array, like `std::vector`.
var circles: Array(Circle) = ({.r = 1.0}, {.r = 2.0});

// Implicitly constructs `Slice` from `Array`.
PrintTotalArea(circles);
return 0;
}

Вы также можете перенести одну библиотеку C++ в Carbon внутри приложения или добавить новый код Carbon поверх существующего кода C++. Например:

// C++ code used in both Carbon and C++:
struct Circle {
float r;
};

// Carbon exposing a function for C++:
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);
}

// C++ calling Carbon:
#include <vector>
#include "circle.h"
#include "geometry.carbon.h"

auto main(int argc, char** argv) -&gt; int {
std::vector<Circle> circles = {{1.0}, {2.0}};

// Carbon's `Slice` supports implicit construction from `std::vector`,
// similar to `std::span`.
Geometry::PrintTotalArea(circles);
return 0;
}

Современная система дженериков

Carbon предоставляет современную систему дженериков с проверенными определениями. Но он по-прежнему поддерживает шаблоны подписки для бесшовного взаимодействия с C++.

Эта система дженериков предоставляет шаблонам C++ множество преимуществ:

  • Проверка типов для общих определений. Это позволяет избежать затрат времени компиляции на повторную проверку определений для каждого экземпляра.
  • Сильные, проверенные интерфейсы. Это уменьшает случайную зависимость от деталей реализации и создает более явный контракт.

Безопасность памяти

Компания Carbon стремится решить проблему безопасности памяти, которая является ключевой проблемой C++, путем:

  • Лучшее отслеживание неинициализированных состояний, усиление принудительной инициализации и защита от ошибок инициализации.
  • Разработка фундаментальных API и идиом для поддержки динамических проверок границ в отладочных и усиленных сборках.
  • Наличие режима сборки отладки по умолчанию, который является более полным, чем существующие режимы сборки C++.

Начало работы с углеродом

Вы можете изучить Carbon прямо сейчас, ознакомившись с кодовой базой и используя Carbon Explorer:

# Install bazelisk using Homebrew.
$ brew install bazelisk

# Install Clang/LLVM using Homebrew.
# Many Clang/LLVM releases aren't built with options we rely on.
$ brew install llvm
$ export PATH="$(brew --prefix llvm)/bin:${PATH}"

# Download Carbon's code.
$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbon-lang

# Build and run the explorer.
$ bazel run //explorer -- ./explorer/testdata/print/format_only.carbon

Дорожная карта Carbon раскрывает долгосрочное мышление

Согласно дорожной карте Carbon, Google обнародует эксперимент с выпуском основной рабочей версии (0.1) к концу 2022 года. Они планируют выпустить версию 0.2 в 2023 году и полную версию 1.0 в 2024–2025 годах.

Сможет ли Google повторить успех своих других языков, Golang и Kotlin, еще неизвестно.