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

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

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

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

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

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

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

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

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

instagram viewer

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

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

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

// С++:
#включают
#включают
#включают
#включают

структураКруг {
плавать р;
};

пустотаПечатьОбщаяПлощадь(станд.::охватывать круги){
плавать площадь = 0;

за (константа Circle& c: круги) {
площадь += M_PI * c.r * c.r;
}

станд.::cout << "Общая площадь: " << площадь << конец;
}

автоглавный(инт аргк, уголь** аргумент) ->; инт {
станд.::вектор круги = {{1.0}, {2.0}};

// Неявно создает `span` из `vector`.
PrintTotalArea (круги);
возвращаться0;
}

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

// Углерод:
упаковка API геометрии;
импортМатематика;

учебный классКруг{
вар р: f32;
}

фн ПечатьОбщаяПлощадь(круги: Срез (Круг)) {
вар площадь: f32 = 0;

for (c: Обведите кругами) {
площадь += Математика.Pi * к.р * к.р;
}

Распечатать("Общая площадь: {0}", область);
}

фн Главный() ->; i32 {
// Массив с динамическим размером, например `std:: vector`.
вар круги: Множество(Круг) = ({.r = 1.0}, {.г = 2.0});

// Неявно создает `Slice` из `Array`.
PrintTotalArea (круги);
возвращаться0;
}

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

// Код C++, используемый как в Carbon, так и в C++:
структураКруг {
плавать р;
};

// Carbon предоставляет функцию для C++:
пакет Geometry API;
импорт Библиотека СРР"круг.час";
импорт Математика;

фн ПечатьОбщаяПлощадь(круги: срез (Cpp. Круг)){
переменная площадь: f32 = 0;

за (с: Cпп. Обведи по кругу) {
площадь += мат. Пи * к.р * к.р;
}

Print("Общая площадь: {0}", область);
}

// C++ вызывает Carbon:
#включают
#включают "круг.ч"
#включают "геометрия.углерод.h"

автоглавный(инт аргк, уголь** аргумент) ->; инт {
станд.::вектор круги = {{1.0}, {2.0}};

// `Slice` Carbon поддерживает неявное построение из `std:: vector`,
// аналогично `std:: span`.
Геометрия:: PrintTotalArea (круги);
возвращаться0;
}

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

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

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

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

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

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

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

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

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

# Установите базелиск с помощью Homebrew.
$ варить установить базелиск

# Установите Clang/LLVM с помощью Homebrew.
# Многие выпуски Clang/LLVM не содержат опций, на которые мы полагаемся.
$ сварить установить llvm
$ экспорт PATH="$(варить --prefix llvm)/bin:${ПУТЬ}"

# Загрузите код Carbon.
$ гит клон https://github.com/carbon-language/carbon-lang
$ CD карбон-ланг

# Соберите и запустите проводник.
$ bazel запустить //проводник -- ./explorer/testdata/Распечатать/format_only.carbon

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

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

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