探索C++的新超集--Carbon(附代码)

485 阅读8分钟

C++是C编程语言的继承者,无可争议地是现代最相关的语言之一。C++为Python机器学习、JavaScript库、游戏开发以及现代编程语言中使用的许多其他工具提供动力。

对于每一个大挑战,如果你得到一个解决方案,你会在底部某个你看不到的地方找到一些C++。

C++也是较早的面向对象的编程语言之一,具有适应性强的设计、多功能性和广泛的兼容性。C++启发了像Java这样的新语言,使这种语言在开发游戏、医疗设备、人工智能和控制系统以及许多其他应用方面都是可行的。

许多现代编程语言,如Rust和Golang,已经兴起,并允许开发人员灵活地编写干净、安全的代码,而且比前辈们的麻烦更少。然而,旧的编程语言仍然为我们日常生活中运行的许多代码库提供动力。

我们也看到有的编程语言推出了对C/C++等老的编程语言的解决方案。在今天的世界,它们是JavaScript、TypeScript、Objective-C、Swift、Java和Kotlin。

在最近结束的CPP North会议上,谷歌宣布他们已经在研究C++的继任者:Carbon编程语言。在这篇文章中,我们将介绍什么是Carbon,它的特点,它与C++有什么不同,如何设置它,等等。

让我们开始吧

什么是Carbon?

在C++中,有一种更小、更干净的语言正在努力地走出来--Bjarne Stroustrup。

Carbon是一种开源的、静态类型的、已编译的编程语言,最初由Google建立,以接替C++。Carbon为开发者提供了现代编程实践,如泛型、模块化代码组织和简单的语法。

Carbon希望能与C++的性能和可扩展性相匹配。该语言被设计为与C++的双向互操作性,以便于迁移和采用。这意味着你可以将C++代码库移植到Carbon,反之亦然,也可以使用现有的C++库。

Carbon也非常友好,对C++开发者来说有一个温和的学习曲线,提供更多的表现力并支持现有的软件设计和架构。

Carbon仍然是一个实验,处于开发阶段。有鉴于此,许多帮助你写出你喜欢的Carbon代码的功能还没有被加入。

Carbon编程语言的特点

Carbon与C++有一些强烈的相似之处。它注入了现代编程实践、对C++的支持、互操作性、内存安全和泛型。这些是Carbon编程语言的一些显著特点,我们现在就来看看其中的一些特点。

互操作性

从逻辑上讲,像Carbon这样的后继语言需要与它之前的语言兼容。Carbon与C++双向兼容,你可以用任何一种语言来使用另一种语言。让我们来看看它的互操作性的实际情况:

// Source code by the authors of the Carbon programming language

// 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);
}

在上面的例子中,Carbon代码使用circle.h C++库来打印一个圆的面积:

// Source code by the authors of the Carbon programming language

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

auto main(int argc, char** argv) -> 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;
}

上面的C++代码使用geometry.carbon.h 库,用提供的参数打印圆的面积。注意到Carbon的代码如何更加可读和直观。

现代泛型系统

泛型是你在现代编程语言中发现的许多伟大功能之一,包括Rust和Go。Carbon的特点是现代泛型系统,具有检查过的定义和选择的模板,可与现有的C++代码无缝互操作。

Carbon的泛型系统是一个值得关注的系统。它将确保泛型定义的类型检查,以避免在编译时进行定义检查的成本。它还将确保强大的检查过的接口,以减少对实现的意外依赖,并创建重要的明确契约。

内存安全的改进

内存安全是使用C++的一个重要任务点。Carbon旨在通过跟踪未初始化的状态、增加初始化的执行力以及阻止初始化错误来解决内存安全问题。

Carbon将以基本的API和习性为特征,支持调试中的动态绑定检查。它还将支持具有全面默认调试模式的加固构建。Carbon的安全策略也可能具有一些保证内存安全的编程模型。

你可以根据你对内存安全的偏好,在调试、性能和加固模式下运行Carbon程序。你可以在GitHub文档中阅读更多关于Carbon安全策略的内容。

Carbon vs. C++

由于Carbon是一种新的语言,而且该语言还没有为生产做好准备,你只能根据它们的共同特征来比较Carbon和C++。C++已经存在了一段时间,开发人员已经能够分享他们关于该语言的挫折感。希望Carbon能够像TypeScript为JavaScript所做的那样,将众多的C++问题最小化。

下面是Carbon和C++之间的简要比较:

Carbon
C++
面向对象
是的
是的
学习曲线
温和
难以 掌握
表达能力
非常有 表现力
几乎没有 表达能力
类型 系统
强类型化静态类型化
强类型化 静态类型化
支持泛型
模板类似 于泛型

在我看来,Carbon成功继承C++的概率相对较高,特别是考虑到C++的现状和该语言背后的公司。进一步考虑到两种语言之间的双向互操作性,开发者不一定要错过C++的功能。

Go和Dart已经在它们的目标领域中被大量采用,Carbon也可能会相当成功。

开始使用Carbon

Carbon仍处于实验模式,因此该语言还远未达到可用于生产的程度。然而,你仍然可以玩一玩该语言的当前状态,并考虑为其发展做出贡献

现在,我们将介绍如何使用Carbon的资源管理器来检查代码库和玩弄该语言。

安装Carbon

你首先需要在你的电脑上安装Homebrew。你可以查看这些安装说明,在Linux和macOS上安装Homebrew

首先用Homebrew软件包管理器安装Bazelisk:

brew install bazelisk

接下来,安装llvm ,并导出PATH 这个变量:

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

克隆Carbon资源库并将其移至你机器上的目录:

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

最后,建立并运行Carbon explorer:

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

就这样了!现在你可以开始尝试使用Carbon,并检查该语言如何工作。

Carbon的语法概述

Carbon的语法实际上与Rust和其他一些语言的语法非常相似。让我们来看看Carbon的语法概述,包括变量、循环、条件反射、函数和类。

Carbon中的变量

你可以用var 关键字来声明变量。Carbon是静态类型的,所以你必须指定一个数据类型:

var hello: auto = "Hello, world!";

auto 数据类型是一种通用的数据类型,你可以在任何变量上使用。就像C++一样,每个语句都必须以分号结束。

Carbon中的For循环

Carbon采用了c风格的for循环,包括一系列for循环的功能:

for (var name: String in names) { // names is an array
    Print(name);
}

for循环遍历一个数组,并打印出数组中的元素。

Carbon中的函数

Carbon的函数与Rust的非常相似,除了你必须明确声明参数变量之外:

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

Sum 函数在调用时返回参数的总和。

Carbon中的条件式

Carbon也使用c风格的条件语句:

fn check(var value: i32) -> i32 {
  if(value == 7) {
    Print(value);
  } else {
    Print(0);
  }
}

check 函数检查参数输入是否等于7 ,如果等于则打印value ,如果if语句无效则打印0

Carbon中的类

Carbon提供了一个定义类的关键字,其标识符和字段是任何类型的:

class Human {
  var phone: i32;
  var age: i32;
  var name: String;
}

Human 类有phone,age, 和name 字段。你可以为你的操作声明任何数量的字段。

展望Carbon的未来

谷歌和Carbon的团队设想Carbon是一种快速、可扩展的语言,它可以发展并支持在现代操作系统、硬件和环境中运行的性能关键型软件。Carbon还将朝着向后或向前兼容的方向航行,并为该语言提供一个稳定的应用二进制接口(ABI)。

一个实验性但工作性的Carbon版本预计将在2022年底前公开,而完整的版本将在2024-2025年推出。你可以查看该语言目标的详细概述

总结

在这篇文章中,我们介绍了Carbon及其特点的概况,将Carbon与它的前辈C++进行了比较,看了如何安装Carbon以及它的语法是如何工作的,还研究了Carbon希望在未来的发展方向。

Carbon正在采取一种包含电池的方法来开发该语言。仓库已在GitHub上上线,在那里你可以为讨论和开发做出贡献,以建立一个大家都喜欢的C++继任者。