Carbon 语言教程带语法,入门示例
谷歌引入了 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 语言的关键特性
- 快速性能 使用 LLVM(低级虚拟机)匹配 C++,对位和地址具有低级访问权限。
2、Bi-directional Interoperability表示可以从Carbon语言调用C++语言代码,从C++调用Carbon语言代码。
-
迁移 提供从 C++ 迁移代码的支持。
-
现代且不断发展的功能,例如可以与现有 C++ 构建一起使用的快速且可扩展的构建,更易于学习。
-
使用开源构建,具有明确的目标和优先级,包括编译器、库、文档、包管理器等方法。
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可用于自动推断变量类型。它可以与let或var组合使用,也可以用作函数返回类型。
示例/演示代码:
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用于布尔值true或false -
i8,i16,i32,i64,i128,i256用于整数类型。 -
u8,u16,u32,u128,u256用于无符号整数类型。 -
f16、f32、f64和f128用于浮点类型。 -
_可用于数字分隔符。例如:如果声明不带引号,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 字节序列的只读参考。
字符串字面量可以通过两种方式声明。
- 单行:单行使用双引号(
")。
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];
}
带碳的条件控制流
if和else的组合可用于控制 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 视频发布
更多推荐


所有评论(0)