谷歌发布开源开发语言 Carbon : 号称将替代 C++

2022-07-20 21:22:10 +08:00
 charlieethan

项目的 Github 地址为: https://github.com/carbon-language/carbon-lang

在近日举行的 CppNorth 开发者大会上,谷歌工程师 Chandler Carruth 宣布了名为 “Carbon” 的全新开源开发语言,并称它将是 C++ 的继任者。Chandler Carruth 表示,Carbon 拥有与 C++ 的“双向互操作性”,也就是说开发者可以直接在 Carbon 语言的程序中使用 C++,这大大提升了项目迁移的便捷性。

谷歌在开发该语言的时候,就将接替 C++ 作为了核心目标,它拥有大量与 C++ 相契合的特性,一个熟练的 C++ 开发者将能够迅速上手 Carbon ,并熟练进行程序的编辑

C++

// C++:
#include <math.h>
#include <iostream>
#include <span>
#include <vector>

struct Circle {
  float r;
};

void PrintTotalArea(std::span<Circle> circles) {
  float area = 0;
  for (const Circle& c : circles) {
    area += M_PI * c.r * c.r;
  }
  std::cout << "Total area: " << area << "\n";
}

auto main(int argc, char** argv) -> int {
  std::vector<Circle> circles = {{1.0}, {2.0}};
  // Implicitly constructors `span` from `vector`.
  PrintTotalArea(circles);
  return 0;
}

Carbon

// Carbon:
package Geometry api;
import Math;

class Circle {
  var r: f32;
}

fn PrintTotalArea(circles: Slice(Circle)) {
  var area: f32 = 0;
  for (c: Circle in circles) {
    area += Math.Pi * c.r * c.r;
  }
  Print("Total area: {0}", area);
}

fn Main() -> i32 {
  // A dynamically sized array, like `std::vector`.
  var circles: Array(Circle) = ({.r = 1.0}, {.r = 2.0});
  // Implicitly constructs `Slice` from `Array`.
  PrintTotalArea(circles);
  return 0;
}

Mixed

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

// 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;
}
15982 次点击
所在节点    C++
110 条回复
zhzhh
2022-07-21 11:18:05 +08:00
"NOTE: Carbon Language is experimental"
「一个目标为替代 C++ 的实验性语言」作为标题感觉更合适一点(可能是我过于敏感了..
https://twitter.com/chandlerc1024/status/1549411352657133568
zhzhh
2022-07-21 11:23:47 +08:00
ecloud
2022-07-21 11:34:38 +08:00
@v23x 都是托了 llvm 的福,给帮助烧点纸吧
unnamedhao
2022-07-21 11:36:23 +08:00
指针在哪里?
LeegoYih
2022-07-21 11:41:03 +08:00
无论是开发 Carbon 的动机,还是 Carbon 本身的语法,都有一股浓浓的逆反味道。
nguoidiqua
2022-07-21 11:57:26 +08:00
方括号尖括号之类我觉得只是个习惯问题,像 C Java 之类的括号真要说起来也是有点混杂的。

比如数组 []int i = {1 ,2 ,3} 或者 int[] i = {1 ,2 ,3} 和 map 类似性质但表示方法却差太多,array<int> i =( 1 ,2 ,3 )或者 array[int] i =( 1 ,2 ,3 )这样看起来要一致些,map 、数组、泛型应该用一样括号。另外像 i[0] = 1 这样用方括号包下标,感觉也不是很妥当,应该像 map 一样或者 i.(0) = 1 or i(0) = 1 。

个人认为尖括号就用来表示大小于,花括号就用来包代码,圆括号包参数,方括号包类型,这样比较一致。
crayygy
2022-07-21 12:01:02 +08:00
只看 Sample code 都觉得可读性实在是太差了,宁可去看 C++ 的源码。

虽然 Java 可能在很多人眼里是“落后” 的代名词,但 Java 的代码可读性是很强的,方便 review ,也能控制写出质量可控的代码。C++ 在有了 C++ 11/14/17 以后,在不用其中一些语法的情况下,也是能够达到这样的目标的,比如在我们的项目里面禁用了裸指针,模板方法也组织的比较好,这个时候的可读性也是可接受的。
rainfd
2022-07-21 12:04:38 +08:00
golang 的博客解释不用<>的原因是因为跟<<和<,实现上需要改的东西会比较多
不过就是个习惯问题,至于这么纠结的吗?
wewewefff
2022-07-21 12:52:00 +08:00
我认为在谷歌所有的语言,开源也没要直接拿来,到时候给开发者限制一波 GG
zxCoder
2022-07-21 13:04:51 +08:00
没啥区别
Akagi201
2022-07-21 13:17:15 +08:00
为什么不做个可以无 GC 的 Go 啊, 脑残 Google, 这跟国内的 KPI 项目有啥区别. 为啥不统一设计, 一门语言走天下. go dart carbon 搞这些语言干啥, 完全可以做成一个语言, 为啥要搞这么多啊!
tairan2006
2022-07-21 13:54:26 +08:00
感觉走的路子和 rust 不一样,看看后续吧。

这和 go 没啥关系,场景都不一样。
yiqiao
2022-07-21 13:54:46 +08:00
@nbndco 那这不就是 KPI 项目吗?😓
lifespy
2022-07-21 14:10:01 +08:00
@Huelse #49 方括号数组
soclearn
2022-07-21 14:13:43 +08:00
@ksc010 go 是替代 c ,不是 C++
haolongsun
2022-07-21 14:44:32 +08:00
为什么都说像 go,难道不是像 rust ?碳官方也说了,如果你使用 rust,请忽略 Carbon.
baiy
2022-07-21 14:46:07 +08:00
盗版其他人的一条评论: go 语言尸骨未寒,谷歌又连夜纳了新欢!!!!!
ligiggy
2022-07-21 14:52:24 +08:00
不会真有不懂 C++,就去干 Carbon 的人吧?懂 C++的人,不会真去干 Carbon 吧?
ligiggy
2022-07-21 14:54:26 +08:00
@unnamedhao 指针还好说,先搞个 template 吧
CNife
2022-07-21 14:59:09 +08:00
稍微看了下,目前还是太过早期的阶段,看不出 Carbon 有完成使命的潜力。
语法上很不一致,既然用了后置类型,为什么不能省略类型声明?如果不能省略,用前置类型声明不好吗,还能省个冒号。
从取代 C++的目标来看,应该是要手动管理内存的,没有 GC 。看起来是要借鉴 Rust 的所有权和移动语义模型,但是官方还没有给出内存管理的具体方案。来源: https://github.com/carbon-language/carbon-lang/tree/trunk/docs/design#lifetime-and-move-semantics

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/867631

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX