Google 的 C++ 實(shí)驗(yàn)性繼任者 Carbon 是否值得學(xué)習(xí)
自其誕生以來,C++ 一直是構(gòu)建性能密集型應(yīng)用程序的首選。但由于“委員會(huì)式設(shè)計(jì) design by committee”,該語言仍有一些過時(shí)的做法。
2022年7月19日,在多倫多舉行的 CPP North C++ 會(huì)議上,Google 工程師 Chandler Carruth 介紹了 Carbon。
我們?cè)賮砹私馐裁词?Carbon 以及它打算如何取代 C++。
什么是 Carbon?
Google 工程師開發(fā)了 Carbon 編程語言來解決 C++ 的缺點(diǎn)。
許多現(xiàn)有的語言,如 Golang 和 Rust 已經(jīng)存在,它們反映了 C++ 的性能而沒有缺點(diǎn)。不幸的是,這些語言對(duì)現(xiàn)有 C++ 代碼庫的遷移構(gòu)成了重大障礙。
Carbon 的目標(biāo)就像 TypeScript 之于 JavaScript, Kotlin 之于 Java。它不是一種替代語言,而是一種圍繞與 C++ 的互操作性而設(shè)計(jì)的繼承性語言。它的目標(biāo)是對(duì)現(xiàn)有代碼庫和開發(fā)人員進(jìn)行大規(guī)模的采用和遷移。
Carbon 的主要特征
Carbon 的一些關(guān)鍵特性包括 C++ 互操作性、現(xiàn)代泛型和內(nèi)存安全。
與 C++ 的互操作性
Carbon 旨在為 C++ 開發(fā)人員提供一個(gè)溫和的學(xué)習(xí)曲線,并提供一套標(biāo)準(zhǔn)、一致的語言結(jié)構(gòu)。
例如,以這個(gè) 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 << endl;
}
auto main(int argc, char** argv) ->; int {
std::vector<Circle> circles = {{1.0}, {2.0}};
// Implicitly constructs `span` from `vector`.
PrintTotalArea(circles);
return 0;
}
轉(zhuǎn)化為 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;
}
您還可以在應(yīng)用程序中將單個(gè) C++ 庫遷移到 Carbon,或在現(xiàn)有 C++ 代碼之上添加新的 Carbon 代碼。例如:
// 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;
}
現(xiàn)代泛型系統(tǒng)
Carbon 提供了一個(gè)帶有檢查定義的現(xiàn)代泛型系統(tǒng)。但它仍然支持可選模板以實(shí)現(xiàn)無縫 C++ 互操作性。
這個(gè)泛型系統(tǒng)為 C++ 模板提供了很多優(yōu)勢(shì):
- 通用定義的類型檢查。這避免了為每個(gè)實(shí)例重新檢查定義的編譯時(shí)成本。
- 強(qiáng)大、經(jīng)過檢查的接口。這些減少了對(duì)實(shí)現(xiàn)細(xì)節(jié)的意外依賴,并創(chuàng)建了更明確的合同。
內(nèi)存安全
Carbon 試圖通過以下方式解決內(nèi)存安全問題,這是困擾 C++ 的一個(gè)關(guān)鍵問題:
- 更好地跟蹤未初始化的狀態(tài),增加初始化的執(zhí)行,并加強(qiáng)初始化錯(cuò)誤。
- 設(shè)計(jì)基本 API 和習(xí)慣用法以支持調(diào)試和強(qiáng)化構(gòu)建中的動(dòng)態(tài)邊界檢查。
- 具有比 C++ 現(xiàn)有構(gòu)建模式更全面的默認(rèn)調(diào)試構(gòu)建模式。
開始使用 Carbon
您現(xiàn)在可以通過查看代碼庫并使用 Carbon explorer 來探索 Carbon:
# 使用 Homebrew 安裝 bazelisk
$ brew install bazelisk
# 使用 Homebrew 安裝 Clang/LLVM
# 許多Clang/LLVM版本并沒有使用我們所依賴的選項(xiàng)構(gòu)建。
$ brew install llvm
$ export PATH="$(brew --prefix llvm)/bin:${PATH}"
# 下載 Carbon 代碼
$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbon-lang
# 構(gòu)建并運(yùn)行explorer。
$ bazel run //explorer -- ./explorer/testdata/print/format_only.carbon
Carbon 路線圖
根據(jù) Carbon 路線圖,Google 將在 2022 年底之前發(fā)布核心工作版本(0.1)來公開實(shí)驗(yàn)。他們計(jì)劃在 2023 年發(fā)布 0.2 版本,并在 2024-2025 年發(fā)布完整的 1.0 版本。
Carbon 是否能夠復(fù)制 Golang 和 Kotlin 等其他語言的成功,還有待觀察。