谷歌引入了 Carbon 语言作为下一代编程语言,目标是取代 C++ 作为继任者。这是一个仍处于实验阶段的开源项目。最初由 Chandler Carruth 在CppNorth会议上演示,Carbon 语言看起来是 C++ 的绝佳替代品。

在本教程中,我们将了解 Carbon 语言的各个方面,并跳转到 carbon 语言的基本语法以及示例代码,您可以在阅读完本文档的末尾后使用这些示例代码来尝试该语言。

让我们潜入水中。

什么以及为什么是碳语言?

随着事物的发展,Carbon 语言可以取代 C++。 C++ 已经是一门很棒的语言。它可以提供高性能并广泛用于许多生产系统。它可以在多种平台、硬件架构和多种操作系统上运行。然而,C++ 的一些问题是

  • 各种功能的累积技术债务(例如:整数提升规则)。与 C 的向后兼容性使得修复技术债务变得更加困难,并使代码更改难以实施。

  • 向 C++ 添加新功能的演进过程非常困难,因为它需要遵守 ISO 过程开销,防止实验等。

所以 C++ 没有达到它的一些目标,比如性能关键软件;软件和语言演变;易于理解和编写的代码;快速和可扩展的开发等等。

由于用 C++ 解决这些问题确实很难,经过谷歌工程师对多种语言的深入研究和评估,Carbon 编程语言推出。所以它就像 C++ 的继任者一样

  • C -> C++

  • JavaScript -> 打字稿

  • 目标-C -> 斯威夫特

  • Java -> Kotlin

  • C++ -> 碳语言

其中箭头的左边部分是原始语言,右边部分是替换语言。

后继语言的一些关键方面包括 - 建立在现有生态系统之上,双向互操作性,优化学习曲线,现代工具系统,如包管理器等。

Carbon 语言不是继承自传统的 C 或 C++。它是使用现代语言基础(如泛型、模块化代码、一致、简单语法)从头开始构建的。

Carbon 语言的关键特性

  1. 快速性能 使用 LLVM(低级虚拟机)匹配 C++,对位和地址具有低级访问权限。

2、Bi-directional Interoperability表示可以从Carbon语言调用C++语言代码,从C++调用Carbon语言代码。

  1. 迁移 提供从 C++ 迁移代码的支持。

  2. 现代且不断发展的功能,例如可以与现有 C++ 构建一起使用的快速且可扩展的构建,更易于学习。

  3. 使用开源构建,具有明确的目标和优先级,包括编译器、库、文档、包管理器等方法。

Carbon 语言 VS Rust 比较

作为 Carbon 语言演变的一部分,考虑了很多因素。其中一些包括查看垃圾收集语言(如 Java),更现代的语言如 Rust、swift、Kotlin 等。

Rust被彻底评估为 C++ 的替代品。 Infact Carbon 语言坚持使用 Rust 并尽可能忽略 Carbon,因为 Rust 在技术和经济上是更可行的语言。

然而对于已经在使用 C++ 的组织来说,迁移到 Rust 是非常困难的。用 Rust 编写的软件具有 C++ 或 Carbon 等语言所没有的属性和模块。鉴于没有互操作性,为大型 C++ 代码库适应 Rust 几乎是不切实际的。我们将很快在另一篇文章中深入讨论这一点。如果你仍然好奇,你可以在这里了解更多关于它的信息为什么 Rust 不能替代 C++。

现在我们知道什么是 Carbon 语言以及为什么需要使用它,让我们深入了解实际的设置/安装、语法和示例。

如何设置和安装 Carbon 语言:

开始使用 Carbon 语言涉及安装

  • Homebrew:是一个包安装工具。如果您没有安装自制软件,您可以按照这些说明

  • Bazel : Bazel 是一个开源的构建和测试工具,可以支持多种语言、平台。

  • LLVM:LLVM是Carbon语言用来运行的低级虚拟机

  • Carbon Explorer:Carbon Explorer 就像是 Carbon 语言的一个实现工具。要运行 Carbon lang 的所有程序,我们将使用 carbon explorer。

出于本教程的目的,我们将使用 MacOS 进行安装。然而,其他操作的说明可以类似。如果您对安装有任何疑问,可以在此帖子上发表评论。

要安装 carbon lang,请在终端中运行这些命令。

第 1 步:安装 Bazel

要安装 Bazel,您可以运行

$ brew install bazelisk

这应该会自动安装和设置可以使用的 Bazel。如果您有任何与权限相关的错误,来自 Bazel 的错误消息将有有用的命令运行。尝试使用sudo运行该命令

第 2 步:安装 LLVM

LLVM 是运行碳语言的核心虚拟机。安装它

$ 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 语言安装错误故障排除部分来解决此问题。

第三步:设置 Carbon 语言代码

这一步是下载碳语言代码,其中也有一些示例。

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

第 4 步:使用 Carbon 语言的 Hello world

现在我们已经设置好了 Carbon 语言,让我们快速运行一下 Hello world。为此,我们将使用 Carbon explorer 运行。要在 Carbon 中运行您的第一个代码,请确保您位于从 git 克隆的carbon-lang目录中,然后运行以下命令。

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

该行所做的是调用 Bazel 构建工具来触发资源管理器代码,该代码依次运行./explorer/testdata/print/format_only.carbon文件中存在的实际代码。

运行此命令后,您应该会在 Carbon 输出中看到一个 Hello world,如下所示

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 程序背后的代码是

文件名:format_only.carbon

package ExplorerTest api;

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

Carbon 语言代码的文件扩展名是.carbon。因此,如果您编写新的碳语言文件,您需要有一个以扩展名.carbon结尾的文件。示例:demo.carbon

现在我们已经设置了 Carbon 语言,让我们看一下可以在日常使用的 Carbon 语言的一些基本语法。

Carbon 语言基本语法及示例:

Carbon 语言仍处于实验阶段。虽然已经做出了大多数设计选择,但随着事情的发展,一些语法和用法可能会发生变化。所以在使用 Carbon-lang 时请记住这一点。 Carbon 的一大优点是语法应该对 C/C++ 开发人员友好且易于理解。让我们开始学习如何使用碳语言。

所有源代码都是UTF-8编码文本。注释、标识符和字符串允许包含非 ASCII 字符。

您可以使用在上一步中安装的 Carbon 语言浏览器或使用在线carbon explorer运行以下示例。只需将下面的示例复制粘贴到在线 IDE 中,您就可以看到实时结果。

碳语言声明:

  • 方法/函数使用fn关键字声明。

  • 变量使用var关键字声明。

  • 变量名称应以:结尾,后跟空格,例如:var x:

  • 可以使用let关键字声明常量。

  • 使用package关键字声明包。

  • 可以使用两个斜杠声明 Carbon 语言中的注释//

  • auto可用于自动推断变量类型。它可以与letvar组合使用,也可以用作函数返回类型。

示例/演示代码:

package ExplorerTest api;

//fn is function declaration
//return type is i32 i.e. int.
fn Main() -> i32 {
  //I am a comment. 

  var s: auto = "Hello world!"; // Auto Variable 
  let x: i64 = 20; // Constant
  var y: i32 = 3; // Integer variable 
  Print(s); // Print 
  return 0; //Return value 
}

碳中的功能/方法

可以使用fn关键字声明函数。语法是fn MethodName(var param: type ... ) -> return type。对于 void 或 empty 返回类型,您可以忽略->之后的部分

例子:

package ExplorerTest api;

//Integer return type 
fn Sum(var a: i32, var b: i32) -> i32 {
    return a + b;
}

//Empty or void return type. 
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;
}

碳语言中的数字变量:

碳语言中的变量可以是

  • bool用于布尔值truefalse

  • i8,i16,i32,i64,i128,i256用于整数类型。

  • u8,u16,u32,u128,u256用于无符号整数类型。

  • f16f32f64f128用于浮点类型。

  • _可用于数字分隔符。例如:如果声明不带引号,1_000_000 仍然是整数。

例子:

package ExplorerTest api;

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

个碳语言字符串:

可以使用声明字符串

  • String为字节序列

  • StringView作为 utf-8 字节序列的只读参考。

字符串字面量可以通过两种方式声明。

  1. 单行:单行使用双引号(")。

2.多行字符串:用于多行字符串声明使用(""")

例子:

fn Main() -> i32 {
  var singleLine: String = "Hello world!";
  var multiLine: String = """hello line 1
            TipSeason demo line 2
            TipSeason demo line 3    
        """; //End of multi block
  return 0;
}

元组碳语言:

元组表示具有多个坐标的值。可以使用括号( )声明它们

示例/示例代码

package ExplorerTest api;

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

这里(x,y,z)是一个具有多个坐标的元组。可以使用索引访问它们。

Carbon lang 中的### 指针:

Carbon 中没有空指针。要表示可能不引用有效对象的指针,请使用类型 Optional(T*),其中T是类型。

*代表值。&代表地址。

例子:

package ExplorerTest api;

fn Main() -> i32 {
  var x: i32 = 5;
  // changes x to 10
  x = 10;
  Print("---");
  Print("x = {0}", x);
  var y: i32* = &x;
  // changes x to 7
  *y = 7;
  Print("---");
  Print("x = {0}", x);
  Print("y = {0}", *y);
  var z: i32* = &*y;
  // changes x to 0
  *z = 0;
  Print("---");
  Print("x = {0}", x);
  Print("y = {0}", *y);
  Print("z = {0}", *z);
  var w: i32 = *y;

  return w;
}

碳中的### 阵列:

使用数组类型和大小声明数组。语法为[type; size]例如:var xarray: [i32; 4] = (1,2,3,4);

例子

package ExplorerTest api;

fn Main() -> i32 {
  var xarray: [i32; 4] = (0, 1, 5, 6); // Integer array 
  var index: i32 = 1;
  xarray[index] = 0;
  Print("{0}", xarray[0]);
  Print("{1}", xarray[0]);
  return xarray[0] + xarray[1];
}

带碳的条件控制流

ifelse的组合可用于控制 Carbon 中的条件流。

如果别的:

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

如果-否则-如果

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(condition){ }声明 while 循环

例子:

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关键字,类似于 C/C++ 中的switch。匹配的语法是

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 Lang 中的### 个课程:

碳语言中的类可以使用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;
}

Google碳语言中的### 个结构:

结构类型可帮助您使用名称而不是索引/位置来识别成员。它们在花括号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 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)

保存后确保运行source ~/.bash_profile

如果您有其他错误,请在下面发表评论。将检查并回复。

Carbon 语言发布日期:

虽然碳语言仍处于试验阶段,但尚不清楚它何时可供公众使用。仍然不支持许多基本用法示例。希望尽快开始。

结论:

希望本教程能帮助你玩转和理解谷歌碳语言的基本概念、语法示例。虽然这不是支持的语法的完整列表,但我们更多地尝试了 Carbon 的特性,我们将在以后的文章中介绍它。对于任何类型的问题或意见,请在下方留言。

下一步是什么?

  • 基于受支持的 Carbon 语言功能构建的真实世界项目。

  • 我们将通过免费时事通讯和详细文章非常密切地介绍 Carbon 语言更新。如果您有兴趣了解有关 Carbon 的更多信息,请将您的电子邮件发送到我们的时事通讯,以了解 Carbon 和最新改进。


推荐文章:

2022 年最受欢迎的 10 种编程语言以及哪些公司使用它们

dbt(数据构建工具)在真实世界场景中,初学者dbt教程

PostgreSQL 与 MySQL 语法 - 使用 postgres 和 mysql 的初学者指南以及比较和示例


参考文献:

Carbon语言官方github

Carbon 语言在 CppNorth 视频发布

Logo

ModelScope旨在打造下一代开源的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!

更多推荐