C++继任者?Carbon语法速览!

C语言与CPP编程 2022-07-29 09:30

7月19日Cpp North大会上,谷歌的C++专家Chandler Carruth发表了『C++: What Comes Next? (Announcing the Carbon Language experiment) 』的主题演讲,官宣了正在实验中的Carbon语言,其目标是成为C++的继任者。该消息迅速火爆全球,中文互联网圈在7月20号也开始大量报道这一消息。

Chandler Carruth在谷歌负责LLVM编译器的优化,也是谷歌在 C++ 委员会的代表。

目前Carbon语言在Github上已经开源,地址:https://github.com/carbon-language/carbon-lang

7月22日,Cpp North的Youtube频道公开了这一演讲的视频:https://www.youtube.com/watch?v=omrY53kbVoA&ab_channel=CppNorth

接下来让我们来速览一下Carbon的语法,首先声明本文的Carbon代码都是基于Chandler Carruth的Keynote以及当前Carbon的github仓库中的代码。

由于Carbon还在实验阶段,Chandler Carruth的Keynote中演示某些语法,当前的Carbon还不支持编译……,比如abstract class、类外定义函数等等。当然已经实现的语法部分可能不稳定,后期也可能会再有重大调整也未可知。

由于当下并且没有支持Carbon语法的代码高亮插件,所以下面代码中的高亮并不准,敬请见谅。

Hello World

package ExplorerTest api;

第一行是定义了package(包),包名是ExplorerTest。后面的api,那个不是包名的一部分,但是又不能省略(当前可以是api或impl)。

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

定义了main函数,Carbon中使用的Main()。从这个Hello World的例子中,变量语法、函数定义语法可见一斑。

变量

var

即变量:

var x: i64 = 42;
x = 7;

笔者点评:个人感觉还不如C++的语法简洁…… int64_t x = 42;

冒号后面是变量的类型,i64是int64,也可以使用auto做类型推导:

var x: auto = 42;

let

基本等同于C++中常量,Rust也采用let表示常量。

let x: i64 = 42;

同样也支持auto

let x: auto = 42;

控制流

if else

if (fruit.IsYellow()) {
  Console.Print("Banana!");
else if (fruit.IsOrange()) {
  Console.Print("Orange!");
else {
  Console.Print("Vegetable!");
}

和C/C++一样。

while

var x: i32 = 0;
while (x < 3) {
  Console.Print(x);
  ++x;
}
Console.Print("Done!");

也和C++一样

for

for (var step: Step in steps) {
  if (step.IsManual()) {
    Console.Print("Reached manual step!");
    break;
  }
  if (step.NotReady()) {
    continue;
  }
  step.Process();
}

语法是for-range循环的语法。同样也能发现Carbon支持break和continue。

match

Carbon中没有switch,但是有match:

fn Bar() -> (i32, (f32, f32));

fn Foo() -> f32 {
  match (Bar()) {
    case (42, (x: f32, y: f32)) => {
      return x - y;
    }
    case (p: i32, (x: f32, _: f32)) if (p < 13) => {
      return p * x;
    }
    case (p: i32, _: auto) if (p > 3) => {
      return p * Pi;
    }
    default => {
      return Pi;
    }
  }
}

不过C++中的switch能比较的只能是整型、枚举。

函数

fn Add(a: i64, b: i64) -> i64 {
  return a + b;
}

Carbon中这个Add函数的写法和Rust中实现一个Add几乎一模一样。比如声明参数的时候类型在后,并且冒号分割的参数写法。还有fn关键字。

当然在函数体内逻辑复杂的时候,会和Rust不同,因为Rust还有不带分号的表达式语法,表达式的值就是整个函数的值。Carbon没有那种怪异的东西。

另外Carbon也能进行返回值的类型推导:

fn Add(a: i64, b: i64) -> auto {
  return a + b;
}

一个更复杂的函数的例子:

package Geometry api;

import Math; // 导入其他包

class Circle { // 定义一个Circle类
    var r: f32;
}

fn ScaleAreaAndAppend(circle: Circle, log2_scale: i32,
                      results: Vector(f32)*) {
  var area: f32 = Math.Pi * c.r * c.r;
  let scale: i32 = 1 << log2_scale;
  area *= scale;
  results->append(area);
}

参数默认都是常量,除非声明成指针类型。

面向对象

类与对象

class Point {
  var x: i32;
  var y: i32;
}
 
fn Main() -> i32 {
  var p1: Point = {.x = 1, .y = 2}; 
  var p2: auto = p1; 
  p2.x = 3;
  return p1.x - 1;
}

成员变量与成员函数

class NewsAriticle {
  // 类似C++的static
  fn Make(headline: String, body_html: String) -> NewsAritcle();

  // 只读方法
  fn AsHtml[meSelf]() -> String;

  // 可修改方法
  fn Publish[addr meSelf*]() { me->published = DateTime.Now(); }

  private var headline: String;
  private var body_html: String;
  private var published: Optional(Datetime);
}
// 类外定义成员函数
fn NewsAriticle.AsHtml[meSelf]() -> String{ ... }

Carbon中类中成员访问控制权限默认都是public,如果需要声明成私有则需要单独加private关键字。这个行为和C/C++的struct相同,但是和主流语言的class都不同。

定义在类中的函数,如果有[me: Self]表示是只读的成员函数,在函数中不能修改类对象的成员变量。me在函数体中是表示对当前对象的引用,类似C++的(*this)

如果有[addr me: Self*]表示的是可对当前对象进行修改的函数。me在函数体中类似C++的this指针。

[me: Self][addr me: Self*]的成员函数,也可以称作方法(method),如果类中的函数没有[me: Self][addr me: Self*],则表示是一个和对象无关的函数,等价于C++中的static成员函数。这个设计很像python中的类中成员函数的设计。

继承与抽象

Carbon只支持单继承,这没的说。值得注意的是普通的class关键字定义的类型默认都是final的,即不能被继承生成子类(俗称『绝育』)。但abstrct classbase class关键字定义的类型可以被继承:

// 抽象类(abstract class)不能被实例化,因为其中可能包含抽象方法
abstract class UIWidget {
  // 抽象方法(abstract fn)没有实现
  abstract fn Draw[meSelf](s: Screen);
  abstract fn Click[addr meSelf*](x: i32, y: i32);
}

// base class 允许扩展和实例化 
base class Button extends UIWidget {
  // 实现抽象方法
  impl fn Draw[meSelf](s: Screen) { ... }
  impl fn Click[addr meSelf*];

  // 新增了一个虚函数(virtual fn
  virtual fn MoveTo[addr meSelf*]
(x: i32, y: i32);
}

// 类外实现方法
fn Button.Click[addr meSelf*](x: i32, y: i32) { ... }
fn Button.MoveTo[addr meSelf*](x: i32, y: i32) { ... }

class ImageButton extends Button {
  ...
}

abstrct class就是抽象类,它不能被实例化,因为其中有抽象方法。抽象类与抽象方法的概念和Java类似。抽象方法等同于C++中的纯虚函数

base class不仅是可以被继承(扩展)的类,还能实例化。因为它里面不会有抽象方法,所有继承而来的抽象方法都要被实现。base class中也能用virtual修饰成员函数,这个语法是从C++中的虚函数而来的。

泛型

泛型接口

定义泛型接口来做泛型代码的类型检查

interface Summary {
  fn Summarize[meSelf]() -> String;
}

这个interface不是Java中的interface,而是有点像C++中的Concept,对泛型做类型检查用的。

泛型函数

fn PrintSummary[T:! Summary](x: T) {
  Console.Print(x.Summarize());
}

定义了一个支持Summary泛型接口的泛型函数PrintSummary

实现泛型接口

class NewsArticle {
  ...
  impl as Summary {
    fn Summarize[meSelf]() -> String { ... }
  }
}

所以可以使用泛型函数来调用实现了泛型接口的类对象

  // n 是 NewsArticle类型
  PrintSummary(n);

也可以直接调用

  // n 是 NewsArticle类型
  n.Summarize();

扩展其他包的API

import OtherPackage;

interface Summary {
  fn Summarize[meSelf]() -> String;
}

// 泛型函数
fn PrintSummary[T:! Summary](x: T) {
  Console.Print(x.Summarize());
}

// 扩展外部API的接口
external impl OtherPackege.Tweet as Summary {
  fn Summarize[meSelf]() -> String { ... }
}

fn SummarizeTweet(t: Tweet) {
  PrintSummary(t);
}

我们导入了一个外部的包OtherPackege,它之中有一个Tweet类型,然后我们可以通过external impl来扩展它支持它本不存在的泛型接口。

指针

基本语法:

  // 定义i32类型变量x,值为5
  var x: i32 = 5;
  // 把x的值改成10
  x = 10;
  // 定义i32*类型的指针p,指向变量x的地址
  var p: i32* = &x;
  // 通过指针修改x的值为7
  *p = 7;
  // 定义i32*类型的指针q,使用&*p,同样指向变量x的地址
  var q: i32* = &*p;
  // 通过指针q修改x的值为0
  *q = 0;
  // 定义一个i32类型的变量y,值为0
  var y: i32 = *p;

另外Carbon的指针不支持空指针,如果想表示不存在,使用Optional。

与C++互操作

与C++互操作是Carbon宣传的重点,也是最大难点。现在Carbon语言还不完善,这里举一个Keynote中演示的例子。

有一个C++的头文件circle.h

struct Circle {
  float r;
}

Carbon调用C++

然后编写一个Carbon代码文件:geometry.carbon

package Geometry api;
import Math;

import Cpp library "circle.h";

fn PrintArea(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);
}

可以通过 import Cpp library "circle.h"; 这种语法来引用C++头文件中声明的类型。

C++调用Carbon

写一个C++的源文件:

#include 
#include "circle.h"

#include "geometry.carbon.h"

auto main(int argc, char* argv) -> int {
  std::vector circles = {{1.0}, {2.0}};

  Geometry::PrintArea(circles);
  return 0;
}

最后提醒

最后再次提醒,某些KeyNote中演示的Carbon语法仅仅是当前规划中的设计,但还没有被实现。当前已经实现,能够通过编译语法,参考Github仓库中explorer/testdata目录中的代码。

C语言与CPP编程 C语言/C++开发,C语言/C++基础知识,C语言/C++学习路线,C语言/C++进阶,数据结构;算法;python;计算机基础等
评论 (0)
  •        深夜的公园里,当路灯熄灭后,传统监控摄像头只能拍出模糊的黑白画面,仿佛老式胶片电影里的场景。而搭载为旌瑶光ISP的摄像头,却能像猫科动物一样,在几乎全黑的环境中捕捉到行人衣服的颜色、树叶的纹理,甚至快速跑动的宠物狗毛发细节。这种从“黑白默片”到“全彩4K电影”的跨越,背后是为旌瑶光ISP对传统红外补光技术的颠覆性创新。一、传统方案之困:被红外光“绑架”的夜视世界        传统安防摄像头依赖红外
    中科领创 2025-03-07 16:50 335浏览
  • 文/Leon编辑/cc孙聪颖2025年全国两会进行时,作为“十四五”规划收官之年,本届两会释放出坚定目标、稳中求进、以进促稳等信号。其中,企业家们的建议备受关注,关系到民营经济在2025年的走向。作为国内科技制造业的“老兵”,全国人大代表、TCL集团创始人及董事长李东生在本届两会中提出三份代表建议,包括《关于优化中国科技制造业融资环境的建议》、《关于加强AI深度伪造欺诈管理的建议》和《关于降低灵活就业人员社会保险参保门槛的建议》,表现出对科技制造、AI发展和劳动者保障方面的关注。会后,李东生接受
    华尔街科技眼 2025-03-06 19:41 149浏览
  • 在六西格玛项目中,团队的选择往往决定了最终的成败。合适的团队成员不仅能推动项目顺利进行,更能确保最终成果符合预期。因此,组建六西格玛团队时,必须挑选最合适的人才,确保他们具备必要的能力和特质。团队主管的关键特质每个精益六西格玛项目都需要一位主管来带领团队。他们不仅需要具备领导力,还要能够分析数据、制定策略,并与管理层和团队成员高效沟通。团队主管的核心职责包括:领导团队行动:能够激励成员,确保团队朝着既定目标前进。数据分析能力:精通数据处理和分析,能基于数据做出决策。沟通协调:能够在管理层和团队之
    优思学院 2025-03-06 12:51 132浏览
  • 一、系统概述MYD-LD25X搭载的Debian系统包含以太网、WIFI/BT、USB、RS485、RS232、CAN、AUDIO、HDMI显示和摄像头等功能,同时也集成了XFCE轻量化桌面、VNC远程操控、SWITCH网络交换和TSN时间敏感网络功能,为工业设备赋予“超强算力+实时响应+极简运维”的体验!类别名称描述源码TF-AArm Trusted Firmware 2.8OP-TEEOP-TEE 3.19BootloaderU-boot 2022.10KernelLinux Ke
    米尔电子嵌入式 2025-03-07 14:08 250浏览
  • 概述随着工业4.0的深入推进,制造业对自动化和智能化的需求日益增长。传统生产线面临空间不足、效率低下、灵活性差等问题,尤其在现有工厂改造项目中,如何在有限空间内实现高效自动化成为一大挑战。此次项目的客户需要在现有工厂基础上进行改造,空间有限。为此,客户选择了SCARA型线性轴机器人作为执行设备。然而,SCARA机器人的高效运行离不开强大的控制系统支持。宏集凭借其先进的智能控制系统,为客户提供了高效、灵活的自动化解决方案,确保SCARA机器人在有限空间内发挥最大效能。一、客户需求在此次改造项目中,
    宏集科技 2025-03-06 11:27 208浏览
  • 随着自动驾驶技术的迅猛发展,构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下,3D高斯点阵渲染(3DGS)技术应运而生,成为自动驾驶仿真场景重建的关键突破。一、3DGS技术概述与原理1、3DGS的技术概述3DGS是一种基于3D高斯分布的三维场景表示方法。通过将场景中的对象转化为多个3D高斯点,每个点包含位置、协方差矩阵和不透明度等信息,3DGS能够精确地表达复杂场景的几何形状和光照特性。与传统的神经辐射场(NeRF)方法相比,
    康谋 2025-03-06 13:17 325浏览
  • 多人同时共享相同无线网络,以下场景是否是您熟悉的日常?姐姐:「妈~我在房间在线上课,影音一直断断续续的怎么上课啊!」奶奶:「媳妇啊~我在在线追剧,影片一直卡卡的,实在让人生气!」除此之外,同时间有老公在跟客户开在线会议,还有弟弟在玩在线游戏,而妈妈自己其实也在客厅追剧,同时间加总起来,共有五个人同时使用这个网络!我们不论是在家里、咖啡厅、餐厅、商场或是公司,都会面临到周遭充斥着非常多的无线路由器(AP),若同时间每位使用者透过手机、平板或是笔电连接到相同的一个网络,可想而知网络上的壅塞及相互干扰
    百佳泰测试实验室 2025-03-06 16:50 162浏览
  • ASL6328芯片支持高达 6.0 Gbps 运行速率的交流和直流耦合输入T-MDS 信号,具备可编程均衡和抖动清理功能。ASL6328 是一款单端口 HDMI/DVI 电平转换 / 中继器,具有重新定时功能。它包含 TypeC双模式 DP 线缆适配器寄存器,可用于识别线缆适配器的性能。抖动清理 PLL(锁相环)能够消除输入抖动,并完全重置系统抖动容限,因此能更好地满足更高数据速率下 HDMI 抖动合规性要求。设备的运行和配置可通过引脚设置或 I2C 总线实现。自动断电和静噪功能提供了灵活的电
    QQ1540182856 2025-03-06 14:26 137浏览
  • 服务器应用环境与客户需求PCIe 5.0高速接口技术的成熟驱动着生成式AI与高效能运算等相关应用蓬勃发展。在随着企业对服务器性能的要求日益严苛,服务器更新换代的周期也持续加快。在此背景下,白牌与DIY(Do It Yourself)服务器市场迎来了新的发展契机,但同时也面临着更趋复杂的技术挑战。传统上,白牌与DIY服务器以其高度客制化与成本效益优势受到市场青睐。然而,随着PCIe 5.0等高速技术的导入,服务器系统的复杂度大幅提升,对组装技术与组件兼容性也就提出更高的要求。举个简单的例子来说,P
    百佳泰测试实验室 2025-03-06 17:00 169浏览
  • ​CS6212是一款可分别用于USB Type-C主机/显示端口源应用的带重定时的有源开关。这设备符合USB 3.2标准版本1.0和USB Type-C标准上的VESA DisplayPort Alt模式 1.0版,支持通过GPIO或12C进行灵活的模式切换。此设备支持USB 3.2第2x1代 运行速度高达10Gbps,DisplayPort 1.4运行速度高达HBR3 8.1Gbps。CS6212管脚分布及功能定义:CS6212支持重定时器训练,并支持USB 3.2标准中定义的状态状态机(RT
    QQ1540182856 2025-03-07 10:09 166浏览
  • 在企业管理和职场环境中,权力是一个常被提及却又让人感到微妙的话题。有人觉得它充满吸引力,有人却对它避之不及。然而,不管你对权力的态度如何,理解它、掌握它,甚至善用它,都是职场成功的重要一环。今天,我们就来深入探讨权力的本质,特别是个人权力和社会权力的区别,以及如何在职场中逐步建立属于自己的影响力。权力的两种面貌:你掌控自己,还是掌控他人?说到权力,首先要区分它的两种类型。个人权力是你对自己生活的掌控感。比如,你能自由决定自己的职业方向,不用总是请示他人。这种权力让人感到踏实和满足,是我们在生活中
    优思学院 2025-03-07 15:56 216浏览
  • 深圳触觉智能SOM3506核心板现已上市,搭载瑞芯微RK3506B/J超低功耗处理器(1.5GHz三核A7+M0),低功耗满载仅0.7W,支持40℃~85℃工作环境,即日起宽温级59元/工业级68元,特价开售!芯片介绍RK3506是瑞芯微Rockchip在2024年第四季度全新推出的Arm嵌入式芯片平台,三核Cortex-A7+单核Cortex-M0多核异构设计,CPU频率达1.5Ghz, M0 MCU为200Mhz。RK3506适用场景简介工业控制‌:RK3506适用于工业控制、工业通信、人机
    Industio_触觉智能 2025-03-07 10:03 165浏览
  • 深圳触觉智能RK3506开发板现已上市,开启预售!搭载瑞芯微RK3506B/J超低功耗工业处理器(1.5GHz三核A7+M0,主频1.5GHz);支持1280×1280显示、双百兆网口、星闪无线三模,板载高达2路CAN FD与5路串口。RK3506适用场景简介工业控制‌:RK3506适用于工业控制、工业通信、人机交互等应用场景。其多核异构架构(3xCortex-A7+Cortex-M0)和外设接口丰富,支持Buildroot、Yocto系统,适合轻量级HMI应用‌。‌工业通信‌:RK3506均支
    Industio_触觉智能 2025-03-07 10:04 136浏览
  • Sub-GHz,即工作频段低于1GHz的无线通信技术,常见频段有315MHz、433MHz、868MHz与915MHz等。其可借助无线电波在自由空间传播的特性,把数据调制到射频载波上进行传输,达成物联网设备间的无线通信,是物联网设备实现高效、稳定、无缝交互的“通信基石”。典型射频信号(无线电波)收发电路简示在工业自动化、智慧城市、智慧农业与智能家居等物联网领域中,LoRa、Wi-SUN、Z-Wave、Sigfox等工业级通信协议大多运行在Sub-GHz频段。而正是通过Sub-GHz射频技术,传感
    华普微HOPERF 2025-03-07 11:39 167浏览
  • 近年来,越来越多的企业在5S管理的基础上,开始追求6S、7S甚至8S管理,仿佛S越多,管理就越先进,企业就越优秀。于是,6S增加了“安全”,7S又加上了“节约”,8S甚至引入了“学习”……看似更加全面,实则很多企业只是机械地增加S,却忽略了管理的核心目标:提升效率、降低浪费、优化工作环境。优思学院认为,5S本身已经是一套成熟的精益管理工具,它的核心理念不仅简单高效,而且易于实施和推广。如果企业只是为了赶时髦,盲目增加S,而没有真正理解5S的本质,那么这些额外的“S”很可能会变成管理上的负担,而不
    优思学院 2025-03-07 12:43 207浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦