Найти в Дзене
Hello, World!

Введение в язык программирования Carbon

Язык Carbon - это язык программирования с открытым исходным кодом, который является преемником C++. Google представил язык Carbon как язык программирования следующего поколения с целью заменить C++ в качестве преемника. Это проект с открытым исходным кодом, который все еще находится в экспериментальной фазе. Первоначально продемонстрированный Чендлером Каррутом на конференции CppNorth, язык Carbon выглядит как отличная альтернатива C++. Вы узнаете о различных аспектах языка Carbon и перейдем к основному синтаксису языка Carbon вместе с примерами кода, которые вы можете использовать, чтобы поэкспериментировать после прочтения до конца данного введения. Давайте погрузимся внутрь. Почему Carbon? Язык Carbon может заменить C++ по мере развития. C++ уже является отличным языком для работы. Он может обеспечить высокую производительность и широко используется во многих системах. Он может работать с различными платформами, аппаратной архитектурой и многими операционными системами. Однако некот
Оглавление

Язык Carbon - это язык программирования с открытым исходным кодом, который является преемником C++.

Google представил язык Carbon как язык программирования следующего поколения с целью заменить C++ в качестве преемника. Это проект с открытым исходным кодом, который все еще находится в экспериментальной фазе. Первоначально продемонстрированный Чендлером Каррутом на конференции CppNorth, язык Carbon выглядит как отличная альтернатива C++.

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

Давайте погрузимся внутрь.

Почему Carbon?

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

  • Накопленный технический долг (например, правила продвижения целых чисел) в различных функциональных возможностях. Обратная совместимость с C делает еще более трудным исправление технического долга и затрудняет внедрение изменений в код.
  • Процесс эволюции для добавления новых функциональных возможностей в C++ очень сложен, так как он должен придерживаться накладных процессов ISO, препятствующих экспериментам и т.д.

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

Поскольку решить эти проблемы с помощью C++ очень сложно, после глубокого исследования и оценки множества языков инженерами Google был представлен язык программирования Carbon. Таким образом, он является как бы преемником C++, подобным

  • C -> C++
  • JavaScript -> TypeScript
  • Objective-C -> Swift
  • Java -> Kotlin
  • C++ -> Carbon Language

где левая часть стрелки - исходный язык, а правая - язык-преемник.

Некоторые из ключевых аспектов языков-преемников включают - построение поверх существующей экосистемы, двунаправленная совместимость, оптимизация кривой обучения, современные инструментальные системы, такие как менеджер пакетов и т.д.

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

Ключевые особенности языка Carbon

  1. Быстрая производительность, соответствующая C++ с использованием LLVM (низкоуровневая виртуальная машина), имеющая низкоуровневый доступ к битам и адресам.
  2. Двунаправленная совместимость означает, что вы можете вызывать код на языке C++ из языка Carbon и код на языке Carbon из C++.
  3. Миграция обеспечивает поддержку миграции кода из C++.
  4. Современные и развивающиеся возможности, такие как быстрые и масштабируемые сборки, которые могут работать с существующими сборками C++, более легкие в изучении.
  5. Построен на основе Open Source с четкими целями и приоритетами с включенным подходом, таким как компиляторы, библиотеки, документация, менеджер пакетов и т.д.

Сравнение языка Carbon VS Rust

В процессе эволюции языка Carbon учитывается множество факторов. Некоторые из них включают рассмотрение языков, собирающих мусор (например, Java), более современных языков, таких как Rust, swift, Kotlin и так далее.

Rust тщательно оценивается как замена C++. Фактически язык Carbon настаивает на использовании Rust и игнорировании Carbon, если это возможно, так как Rust технически и экономически более жизнеспособный язык.

Однако организациям, которые уже используют C++, очень сложно перейти на Rust. Программы, написанные на Rust, имеют свойства и модули, которых нет ни у одного из таких языков, как C++ или Carbon. Адаптация к Rust для больших кодовых баз C++ практически нецелесообразна, учитывая отсутствие функциональной совместимости. Мы подробно поговорим об этом в отдельной статье в ближайшее время. Если вам все еще интересно, вы можете узнать больше об этом здесь: "Почему Rust не является заменой C++".

Теперь, когда мы знаем, что такое язык Carbon и зачем он нам нужен, давайте погрузимся в собственно настройку/установку, синтаксис, примеры.

Как настроить и установить язык Carbon:

Начало работы с языком Carbon включает в себя установку

  • Homebrew: это инструмент для установки пакетов. Если у вас не установлен homebrew, вы можете следовать этим инструкциям. В MacOs вы можете установить homebrew, используя /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)".
  • Bazel: Bazel - это инструмент сборки и тестирования с открытым исходным кодом, который может поддерживать множество языков и платформ.
  • LLVM: LLVM - это низкоуровневая виртуальная машина, которую использует язык Carbon для работы. Вам не обязательно иметь полное представление о LLVM, чтобы следовать этому руководству.
  • Carbon Explorer: Carbon explorer - это инструмент для реализации языка Carbon. Для запуска всех программ языка Carbon мы будем использовать Carbon explorer.

Для целей этого руководства мы будем использовать MacOS для установки. Однако инструкции для других операционных систем, таких как linux или windows, могут быть аналогичными.

Чтобы установить carbon, выполните эти команды в терминале.

Шаг 1: Установите Bazel

Для установки Bazel вы можете выполнить

$ brew install bazelisk

Это автоматически установит и настроит Bazel, который будет готов к использованию. Если у вас есть какие-либо ошибки, связанные с разрешениями, в сообщении об ошибке от Bazel будет полезная команда для запуска. Попробуйте запустить эту команду, используя sudo

Шаг 2: Установите LLVM

LLVM - это основная виртуальная машина, на которой выполняется язык Carbon. Чтобы установить ее

$ brew install llvm
$ export PATH="$(brew --prefix llvm)/bin:${PATH}"

Следует отметить, что в MacOS по умолчанию установлен llvm. Поэтому при использовании brew install llvm может появиться сообщение типа llvm is keg-only, which means it was not symlinked .... Для решения этой проблемы перейдите к разделу устранения ошибок при установке языка Carbon в конце статьи.

Шаг 3: Установка кода языка Carbon

На этом шаге необходимо загрузить код языка carbon, который также содержит несколько примеров.

$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbon-lang

Шаг 4: Hello world с помощью языка Carbon

Теперь, когда мы настроили язык Carbon, давайте выполним быстрый запуск Hello world. Для этого мы воспользуемся проводником Carbon. Чтобы запустить свой первый код на языке Carbon, убедитесь, что вы находитесь в каталоге carbon-lang, который вы клонировали из git, а затем выполните следующую команду.

$ bazel run //explorer -- ./explorer/testdata/print/format_only.carbon

Эта строка вызывает инструмент сборки Bazel для запуска кода explorer, который в свою очередь запускает фактический код, присутствующий в файле ./explorer/testdata/print/format_only.carbon.

После запуска вы должны увидеть Hello world in Carbon в следующем виде

tipseason$ bazel run //explorer -- ./explorer/testdata/print/format_only.carbon
INFO: Invocation ID: aa36a266-cb55-4433-9bed-907e393c0605
WARNING: .....
.
.
INFO: Build completed successfully, 390 total actions
.
.
Hello world!
result: 0

Как видите, выводится "Hello World!", а тип возврата main - int32, в результате 0. Код, который стоит за этой программой hello world, следующий

Путь к файлу: ./explorer/testdata/print/format_only.carbon

package ExplorerTest api;
fn Main() -> i32 {
var s: auto = "Hello world!";
Print(s);
return 0;
}

Расширение файла для кода языка Carbon - .carbon. Поэтому если вы пишете новый файл на языке Carbon, вам нужно иметь файл, который заканчивается расширением .carbon. Пример: demo.carbon.

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

Основной синтаксис языка Carbon с примерами:

Язык Carbon все еще находится на экспериментальной стадии. Хотя большинство решений уже принято, синтаксис и использование могут измениться по мере развития. Поэтому имейте это в виду при работе с Carbon. Одним из преимуществ Carbon является то, что синтаксис должен быть дружественным к разработчикам C/C++ и простым для понимания.

Для наилучшего использования этого руководства, чтобы следить за каждым из этих примеров, вы можете запустить приведенные ниже примеры, используя Carbon language explorer, который вы установили в предыдущем шаге. Если вы работаете на своей машине, вы можете создавать новые файлы каждый раз при запуске программы или изменять файл ./explorer/testdata/print/format_only.carbon для проверки примеров.

Каждый раз, когда вы изменяете код, запускайте bazel run //explorer -- ./explorer/testdata/print/format_only.carbon, чтобы увидеть вывод.

Примечание: format_only.carbon - это просто пример файла. Измените его на то имя файла, которое вы создали.

В качестве альтернативы вы также можете использовать Carbon online explorer IDE для выполнения приведенных ниже примеров.

Просто скопируйте и вставьте приведенные ниже примеры в онлайн IDE, и вы сможете увидеть результаты в реальном времени.

Ссылка на онлайн IDE Carbon Explorer находится на сайте Carbon Godbolt или Carbon online explorer.

Давайте приступим к изучению того, как использовать язык Carbon.

Декларации в Carbon:

  • Методы/функции объявляются с помощью ключевого слова fn.
  • Переменные объявляются с помощью ключевого слова var.
  • Имена переменных должны заканчиваться символом :, за которым следует пробел, например: var x:
  • Константы могут быть объявлены с помощью ключевого слова let.
  • Пакеты объявляются с помощью ключевого слова package.
  • Комментарии в языке Carbon могут быть объявлены с помощью двух косых черт //
  • auto может использоваться для автоматического определения типа переменной. Его можно использовать в комбинации с let или var или в качестве типов возврата функций.

Пример:

package ExplorerTest api;

// fn - объявление функции
// Тип возврата - i32, т.е. int.
fn Main() -> i32 {
// Я - комментарий.

var s: auto = "Hello world!"; // Автоматическое определение типа
let x: i32 = 20; // Константа
var y: i32 = 3; // Целочисленная переменная
Print(s); // Печать
return 0; // Возвращаемое значение
}

Функции/методы в Carbon

Функции могут быть объявлены с помощью ключевого слова fn. Синтаксис таков: fn MethodName(var param: type ... ) -> return type. Для типов возврата void или пустого можно игнорировать часть после ->.

Пример:

package ExplorerTest api;

// Целочисленный тип возврата
fn Sum(var a: i32, var b: i32) -> i32 {
return a + b;
}

// Пустой или void тип возврата.
fn PrintCount(var count: i32) {
Print("The count is {0}", count);
}

fn Main() -> i32 {
Print("Sum is {0}", Sum(4, 6));
PrintCount(10);
return 0;
}

Числовые переменные в языке Carbon:

Переменные в языке Carbon могут быть

  • bool для булевых значений true или false
  • i8, i16, i32, i64, i128, i256 для целочисленных типов.
  • u8, u16, u32, u128, u256 для беззнаковых целых типов.
  • f16, f32, f64 и f128 для типов float.
  • _ может использоваться для разделителей цифр. Например: 1_000_000 остается целым числом, если объявлено без кавычек.

Пример:

package ExplorerTest api;
fn Main() -> i32 {
var a: i32 = 1;
var b: i32 = 2;
Print("{0}", a + b);
return 0;
}

Строки в языке Carbon:

Строки могут быть объявлены с помощью

  • String для последовательности байтов
  • StringView как ссылка только для чтения для последовательности байтов utf-8.

Литералы строк могут быть объявлены двумя способами.

  1. Одиночная строка: Используйте двойные кавычки(") для одной строки.
  2. Многострочная строка: Для объявления многострочной строки используйте (""").

Пример:

package ExplorerTest api;
fn Main() -> i32 {
var singleLine: String = "Hello world!";
var s: String = """
hello line 1
TipSeason demo line 2
TipSeason demo line 3
"""; // Конец многострочной строки
return 0;
}

Кортежи в языке Carbon:

Кортежи представляют значения с несколькими координатами. Они могут быть объявлены с помощью круглых скобок ( )

Пример:

package ExplorerTest api;

fn Main() -> i32 {
var x: auto = (0, 1);
Print("{0}", x[1]);
return x[0];
}

Здесь (x,y,z) - это кортеж с несколькими координатами. Доступ к ним можно получить с помощью индекса.

Указатели в языке Carbon:

В Carbon нет нулевых указателей. Чтобы представить указатель, который может не ссылаться на действительный объект, используйте тип Optional(T*), где T - тип.

* представляет значение. & представляет адрес.

Пример:

package ExplorerTest api;

fn Main() -> i32 {
var x: i32 = 5;
// изменяем x на 10
x = 10;
Print("---");
Print("x = {0}", x);
var y: i32* = &x;
// изменяем x на 7
*y = 7;
Print("---");
Print("x = {0}", x);
Print("y = {0}", *y);
var z: i32* = &*y;
// изменяем x на 0
*z = 0;
Print("---");
Print("x = {0}", x);
Print("y = {0}", *y);
Print("z = {0}", *z);
var w: i32 = *y;

return w;
}

Массивы в Carbon:

Массивы объявляются с использованием типа массива и его размера. Синтаксис имеет вид [type; size] Например: var xarray: [i32; 4] = (1,2,3,4);

Пример:

package ExplorerTest api;

fn Main() -> i32 {
var xarray: [i32; 4] = (0, 1, 5, 6); // Целочисленный массив
var index: i32 = 1;
xarray[index] = 0;
Print("{0}", xarray[0]);
Print("{0}", xarray[1]);
return xarray[0] + xarray[1];
}

Условный поток управления с помощью Carbon

Комбинация if, else может быть использована для управления условным потоком в Carbon.

if-else:

if(condition) {
// doSomething
} else {
// doSomething
}

if-else-if:

if(condition) {
// doSomething
} else if (condition) {
// doSomething
} else {
// doSomething
}

Пример:

package ExplorerTest api;

fn Main() -> i32 {
var x: i32 = 5;
if(x == 5) {
Print("{0} to word is FIVE", x);
} else {
Print("{0} is not known ", x);
}
return 0;
}

Циклы в языке Carbon

Поддерживаются стандартные операторы циклов.

Цикл While

Цикл While может быть объявлен с помощью оператора while (condition) { }

Пример:

package ExplorerTest api;

fn Main() -> i32 {
var x: auto = 5;
while (not (x == 0)) {
x = x - 1;
Print("{0} ", x);
}
return x;
}

Цикл For

Цикл For может быть объявлен с помощью for (loop conditions) { }.

На момент написания этой статьи не было полного рабочего примера. Но вот предлагаемый синтаксис:

package ExplorerTest api;

fn Main() -> i32 {

var names: [String; 4] = ("a", "b");
for (var name: String in names) {
Console.Print(name);
}

return x;
}

Сопоставление нескольких условий аналогично Switch

В Carbon есть ключевое слово match, которое аналогично switch в C/C++.

Синтаксис для слова match следующий

match(condition) {
case (condition) => {
// doSomething;
}
default => {
// doSomething;
}
}

Пример:

package ExplorerTest api;

fn Matcher(var num: i32) -> i32 {
var number: auto = 10;
match (number) {
case 5 => {
Print("Got 5");
return number;
}
case 10 => {
Print("Got 10");
return number;
}
default => {
Print("Default");
return number;
}
}
}

fn Main() -> i32 {
Matcher(5);
Matcher(10);
Matcher(2);
return 0;
}

Классы в языке Carbon:

Класс в языке Carbon может быть объявлен с помощью ключевого слова class. Класс может иметь члены и методы.

Пример:

package ExplorerTest api;

class Sum {
var a: i32;

fn Add[me: Self](var num: i32) -> i32 {
var total: i32 = me.a + num;
return total;
}
}

fn Main() -> i32 {
var p1: Sum = {.a = 5};
var total: i32 = p1.Add(5);
Print("Total sum {0}" , total);
return 0;
}

Структуры в языке Carbon:

Структурные типы помогают идентифицировать члены, используя имя вместо их индекса/положения. Они объявляются в фигурных скобках var name: auto = {.name1 = value1, .name2 = value2, ... } и доступ к ним можно получить с помощью name.name1 и т.д.

Пример:

package ExplorerTest api;

fn Main() -> i32 {
var point: auto = {.x_axis = 0, .y_axis = 1};
point = {.x_axis = 5, .y_axis = -5};
var result: i32 = point.x_axis * point.x_axis + point.y_axis * point.y_axis;
Print("Result : {0}", result);
return 0;
}

Дженерики в языке программирования Carbon:

Дженерики можно увидеть во многих современных языках. Они определяют способ вызвать проверку типов во время компиляции и помогают определить переменные более чистого типа. Они могут быть объявлены с помощью типов параметров T, как показано ниже.

Пример:

package ExplorerTest api;

fn GenericExample[T:! Type](x: T) -> T {
return x;
}

fn Main() -> i32 {
Print("Integer generic type {0}", GenericExample(0));
Print(GenericExample("This is a string generic"));
return 0;
}

Ошибки установки, поиск и устранение неисправностей

Исправление ошибки Carbon llvm-ar:

llvm is keg-only, which means it was not symlinked into /usr/local,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have llvm first in your PATH, run:
echo 'export PATH="/usr/local/opt/llvm/bin:$PATH"' >> /Users/pramodnanduri/.bash_profile

For compilers to find llvm you may need to set:
export LDFLAGS="-L/usr/local/opt/llvm/lib"
export CPPFLAGS="-I/usr/local/opt/llvm/include"

Чтобы решить эту проблему, настройте в файле ~/.bash_profile следующие переменные

export PATH="/usr/local/opt/llvm/bin:$PATH"
export LDFLAGS="-L/usr/local/opt/llvm/lib"
export CPPFLAGS="-I/usr/local/opt/llvm/include"
export CC=$(which clang)

После сохранения обязательно запустите исходник ~/.bash_profile

Дата выхода языка Carbon:

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