ITADN
carbon-language/carbon-lang
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Carbon 语言:
C++ 的实验性后继者

为什么? | 目标 | 状态 | 入门指南 | 加入我们

**观看我们的发布视频,来自 CppNorth。请注意,Carbon 尚不可用

Quicksort code in Carbon. Follow the link to read more.

快速且与 C++ 兼容

  • 使用 LLVM 实现与 C++ 匹配的性能,并提供对位和地址的低级访问
  • 与您现有的 C++ 代码互操作,从继承到模板
  • 快速且可扩展的构建,可与您现有的 C++ 构建系统配合使用

现代且不断演进

  • 坚实的语言基础,易于学习,特别是如果您曾使用过 C++
  • 在 Carbon 版本之间进行基于工具的轻松升级
  • 更安全的基础,以及通往内存安全子集的渐进路径

欢迎的开源社区

  • 明确的目标与优先级,辅以健全的治理机制
  • 致力于营造欢迎、包容且友好的社区氛围
  • 开箱即用的方法:编译器、库、文档、工具、包管理器及其他

为什么要构建 Carbon?

C++ 仍然是性能关键软件的主导编程语言,拥有庞大且不断增长的代码库和投资。然而,如上所述,由于积累了数十年的技术债务,C++ 在改进和满足开发者需求方面正面临巨大挑战。逐步改进 C++ 是极其困难的,这既源于技术债务本身,也源于其演进过程中的挑战。解决这些问题的最佳方式是避免直接继承 C 或 C++ 的遗留包袱,而是从坚实的语言基础出发,例如现代泛型系统、模块化的代码组织以及一致且简洁的语法。

现有的现代语言已经提供了出色的开发者体验:Go、Swift、Kotlin、Rust 以及许多其他语言。能够_使用_其中一种现有语言的开发者_应该_这样做。 不幸的是,这些语言的设计在从 C++ 采用和迁移方面存在重大障碍。这些障碍的范围从软件惯用设计的变更到性能开销不等。

Carbon 从根本上说是一种后继语言方案,而非 对 C++ 进行渐进式演化的尝试。它围绕与 C++ 的互操作性以及 现有 C++ 代码库和开发者的大规模采用与迁移而设计。C++ 的后继语言需要:

  • 与 C++ 匹配的性能,这是我们开发者的基本属性。
  • 与 C++ 无缝、双向的互操作性,使得现有 C++ 技术栈中任何位置的库 都可以采用 Carbon,而无需移植其余部分。
  • 平缓的学习曲线,对 C++ 开发者而言具有合理的熟悉度。
  • 相当的表现力,并支持现有软件的设计和 架构。
  • 可扩展的迁移,对惯用的 C++ 代码提供一定程度的源到源转换。

通过这种方式,我们可以建立在 C++ 现有生态系统之上,并 带来现有的投资、代码库和开发者群体。有一些语言已经为其他生态系统 遵循了这种模式,Carbon 旨在为 C++ 填补类似的角色:

  • JavaScript → TypeScript
  • Java → Kotlin
  • C++ → Carbon

语言目标

我们正在设计 Carbon 以支持:

  • 性能关键型软件
  • 软件与语言的演进
  • 易于阅读、理解和编写的代码
  • 实用的安全性与测试机制
  • 快速且可扩展的开发
  • 现代操作系统平台、硬件架构和环境
  • 与现有 C++ 代码的互操作性及从 C++ 代码的迁移

尽管许多语言都共享这些目标的部分子集,但使 Carbon 与众不同的是 这些目标的组合。

我们还有针对 Carbon 的明确 非目标,特别包括:

我们详细的 目标 文档进一步阐述了这些理念, 并提供了对 Carbon 项目和语言目标的更深入见解。

项目状态

Carbon Language 目前是一个实验性项目。我们正在努力开发 包含编译器和链接器的工具链实现。你可以在 compiler-explorer.com 上尝试当前状态。

我们希望更好地理解我们是否能够构建一种满足我们 后继语言标准的语言,以及由此产生的语言是否能够在更广泛的 C++ 行业和社区中 聚集起足够的关注度。

目前,我们已经详细阐述了 Carbon 项目和语言的几个核心方面:

  • Carbon 语言和项目的战略。
  • 开源项目结构、治理模式和演进过程。
  • 基于我们在 C++ 方面的经验以及我们预计面临的最具挑战性的问题,语言设计的关键和基础方面。 这包括以下设计:
    • 泛型
    • 类类型
    • 继承
    • 运算符重载
    • 词法和句法结构
    • 代码组织和模块化结构
  • 正在开发中的 编译器和工具链,它将把 Carbon(最终也包括 C++ 代码)编译为标准可执行代码。 这是我们目前大部分实现工作的重点方向。
    • 历史上,还有一个原型 explorer 解释器, 它实现了 Carbon 语言设计的旧版本,但已不再开发并已被归档。

如果您有兴趣参与贡献,我们目前专注于开发 Carbon 工具链,直到它能够 支持 Carbon ↔ C++ 互操作。 除此之外,我们计划继续开发设计和工具链,直到我们 能够发布 0.1 语言 并支持更详细地评估 Carbon。

您可以查看我们的 完整路线图 以获取更多详细信息。

Carbon 和 C++

如果你已经是一名 C++ 开发者,Carbon 应该具有平缓的学习曲线。 它由一组一致的语言结构构建而成,这些结构应该让你感到 熟悉,并且易于阅读和理解。

这里的 Carbon 代码是假设性的,旨在展示该语言的 外观和感觉。

像这样的 C++ 代码:

A snippet of C++ code. Follow the link to read it.

对应于这段 Carbon 代码:

A snippet of converted Carbon code. Follow the link to read it.

你可以从 C++ 调用 Carbon 而无需额外开销,反之亦然。这 意味着你可以在应用程序中将单个 C++ 库迁移到 Carbon,或者在 现有 C++ 投资之上编写新的 Carbon。例如:

A snippet of mixed Carbon and C++ code. Follow the link to read it.

阅读更多关于 C++ interop in Carbon.

除了 Carbon 与 C++ 之间的互操作性之外,我们还计划支持 迁移工具,这些工具将机械地将惯用的 C++ 代码转换为 Carbon 代码,以帮助您将现有的 C++ 代码库切换到 Carbon。

泛型

Carbon 提供了一个 现代泛型系统 具有经过检查的定义,同时支持可选的 模板 以实现与 C++ 的无缝互操作。经过检查的 泛型与 C++ 模板相比具有几个优势:

  • 泛型定义完全经过类型检查,消除了通过 实例化来检查错误的需要,并提高了对代码的信心。
    • 避免了为每个 实例化重新检查定义的编译时成本。
    • 当使用经过定义检查的泛型时,使用错误消息更 清晰,直接显示哪些要求未满足。
  • 启用自动、可选的类型擦除和动态分发,无需 单独的实现。这可以减少二进制大小并启用 诸如异构容器之类的结构。
  • 强类型、经过检查的接口意味着对 实现细节的意外依赖更少,并为使用者提供更清晰的契约。

在不牺牲这些优势的情况下,Carbon 泛型支持 特化,确保它可以完全解决 C++ 模板的性能关键用例。有关 Carbon 泛型的更多详细信息,请参阅其 设计

除了与 C++ 轻松且强大的互操作性之外,Carbon 模板还可以以细粒度进行约束,并沿着平滑的演进路径增量迁移到受检泛型。

内存安全

安全性,尤其是 内存安全,仍然是 C++ 面临的一项关键 挑战,也是后继语言需要解决的问题。

我们计划支持一个两步迁移过程:

  1. 从 C++ 到专为 C++ 互操作和迁移设计的 Carbon 方言的高度自动化、最少监督的迁移。
  2. 对 Carbon 代码进行增量重构,以采用内存安全的设计、 模式和 API。

我们还想在迁移到 Carbon 时立即解决安全领域中重要且容易解决的问题:

  • 更好地跟踪未初始化状态,加强初始化的执行,并在必要时 针对初始化错误进行加固。
  • 设计支持动态边界检查的基础 API 和惯用法。
  • 在可能的情况下,从未定义行为切换到错误行为, 并使用可见的 unsafe 语法标记剩余的未定义行为。
  • 提供一种默认的调试构建模式,其运行时开销较低,同时比现有的 C++ 调试构建模式 结合 Address Sanitizer 更加全面。

有关更多详细信息,请参阅我们的 safety design

入门

要在浏览器中立即试用 Carbon,您可以使用位于以下地址的工具链: carbon.compiler-explorer.com

我们正在开发一套用于 Carbon 的传统工具链,它可以编译和链接 程序。然而,Carbon 仍然是一个早期的实验性项目,因此我们 仅提供非常实验性的 Carbon 工具链每日构建版本供下载,且仅支持有限的平台。如果你使用的是较新版本的 Ubuntu Linux 或类似系统(Debian、WSL 等),你可以前往我们的 releases 页面并 下载最新的每日构建工具链 tar 文件: carbon_toolchain-0.0.0-0.nightly.YYYY.MM.DD.tar.gz。然后你可以尝试使用它:

# A variable with the nightly version from yesterday:
VERSION="$(date -d yesterday +0.0.0-0.nightly.%Y.%m.%d)"

# Get the release
wget https://github.com/carbon-language/carbon-lang/releases/download/v${VERSION}/carbon_toolchain-${VERSION}.tar.gz

# Unpack the toolchain:
tar -xvf carbon_toolchain-${VERSION}.tar.gz

# Create a simple Carbon source file:
echo "import Core library \"io\"; fn Run() { Core.Print(42); }" > forty_two.carbon

# Compile to an object file:
./carbon_toolchain-${VERSION}/bin/carbon compile \
  --output=forty_two.o forty_two.carbon

# Install minimal system libraries used for linking. Note that installing `gcc`
# or `g++` for compiling C/C++ code with GCC will also be sufficient, these are
# just the specific system libraries Carbon linking still uses.
sudo apt install libgcc-11-dev

# Link to an executable:
./carbon_toolchain-${VERSION}/bin/carbon link \
  --output=forty_two forty_two.o

# Run it:
./forty_two

作为提醒,工具链仍处于非常早期的阶段,许多功能尚不可用。 请暂缓提交大量缺陷报告:我们知道其中许多部分目前尚不可用, 或者可能无法在所有系统上正常工作。我们预计在达到 0.1 里程碑] 时,将发布更加稳健和可靠、可供您尝试的版本。

如果您想自行构建 Carbon 的工具链,或者考虑为 Carbon 贡献修复或改进, 您需要安装我们的 构建依赖项](Clang、 LLD、libc++)并检出 Carbon 仓库。例如,在 Debian 或 Ubuntu 上:

# Update apt.
sudo apt update

# Install tools.
sudo apt install \
  clang \
  libc++-dev \
  libc++abi-dev \
  lld

# Download Carbon's code.
$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbon-lang

然后你可以试用我们的工具链,其中包含一个非常早期阶段的 Carbon 编译器:

# Build and run the toolchain's help to get documentation on the command line.
$ ./scripts/run_bazelisk.py run //toolchain -- help

有关完整说明,包括在各种不同平台上安装依赖项,请参阅我们的 贡献工具文档

了解更多关于 Carbon 项目的信息:

会议演讲

来自社区的 Carbon 相关演讲:

2026

2025

  • Carbon: 从 C++ 到内存安全,REBASE - ICFP/SPLASH (幻灯片)
  • 使用 Carbon 和 Rust 实现无处不在的内存安全,RustConf (视频, 幻灯片)

2024

  • Carbon 和 Clang 中的通用实现策略,LLVM 开发者会议(视频幻灯片
  • Carbon 语言:通往 0.1 的道路,NDC {TechTown} (视频幻灯片
  • 设计具有 C++ 互操作性的 Carbon 如何让我了解 C++ 可变参数和重载,CppNorth(视频幻灯片
  • 通用元数:Carbon 中定义检查的可变参数,C++Now (视频幻灯片
  • Carbon:不同权衡的实验,小组讨论,EuroLLVM (视频幻灯片
  • Carbon 的高级语义 IR 闪电演讲,EuroLLVM (视频

2023

2022

其他视频

我们还有工具链视频

加入我们

我们非常欢迎大家加入并为本项目做出贡献。Carbon 致力于营造一种欢迎和包容的环境,让每个人都能 做出贡献。

贡献

您也可以直接:

您可以查看一些 "good first issues", 或加入 #contributing-help 频道 Discord。请参阅我们的完整 CONTRIBUTING 文档以获取更多详细信息。