Carbon 语言:
C++ 的实验性后继者
**观看我们的发布视频,来自 CppNorth。请注意,Carbon 尚不可用。

快速且与 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 的明确 非目标,特别包括:
- 针对整个语言和库的稳定 应用程序二进制接口 (ABI)
- 完美的向后或向前兼容性
我们详细的 目标 文档进一步阐述了这些理念, 并提供了对 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++ 代码:
对应于这段 Carbon 代码:
你可以从 C++ 调用 Carbon 而无需额外开销,反之亦然。这 意味着你可以在应用程序中将单个 C++ 库迁移到 Carbon,或者在 现有 C++ 投资之上编写新的 Carbon。例如:
阅读更多关于 C++ interop in Carbon.
除了 Carbon 与 C++ 之间的互操作性之外,我们还计划支持 迁移工具,这些工具将机械地将惯用的 C++ 代码转换为 Carbon 代码,以帮助您将现有的 C++ 代码库切换到 Carbon。
泛型
Carbon 提供了一个 现代泛型系统 具有经过检查的定义,同时支持可选的 模板 以实现与 C++ 的无缝互操作。经过检查的 泛型与 C++ 模板相比具有几个优势:
- 泛型定义完全经过类型检查,消除了通过
实例化来检查错误的需要,并提高了对代码的信心。
- 避免了为每个 实例化重新检查定义的编译时成本。
- 当使用经过定义检查的泛型时,使用错误消息更 清晰,直接显示哪些要求未满足。
- 启用自动、可选的类型擦除和动态分发,无需 单独的实现。这可以减少二进制大小并启用 诸如异构容器之类的结构。
- 强类型、经过检查的接口意味着对 实现细节的意外依赖更少,并为使用者提供更清晰的契约。
在不牺牲这些优势的情况下,Carbon 泛型支持 特化,确保它可以完全解决 C++ 模板的性能关键用例。有关 Carbon 泛型的更多详细信息,请参阅其 设计。
除了与 C++ 轻松且强大的互操作性之外,Carbon 模板还可以以细粒度进行约束,并沿着平滑的演进路径增量迁移到受检泛型。
内存安全
安全性,尤其是 内存安全,仍然是 C++ 面临的一项关键 挑战,也是后继语言需要解决的问题。
我们计划支持一个两步迁移过程:
- 从 C++ 到专为 C++ 互操作和迁移设计的 Carbon 方言的高度自动化、最少监督的迁移。
- 对 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
- Carbon 内存安全:首次深入探讨(7 月 10 日, 视频, 文字记录, 幻灯片)
- 基准测试与优化 Carbon 编译器,NDC {Toronto}(5 月 5-8 日) (视频, 幻灯片)
- Carbon:从实验走向成熟,NDC {Toronto}(5 月 5-8 日) (视频, 幻灯片)
2025
2024
- Carbon 和 Clang 中的通用实现策略,LLVM 开发者会议(视频, 幻灯片)
- Carbon 语言:通往 0.1 的道路,NDC {TechTown} (视频, 幻灯片)
- 设计具有 C++ 互操作性的 Carbon 如何让我了解 C++ 可变参数和重载,CppNorth(视频, 幻灯片)
- 通用元数:Carbon 中定义检查的可变参数,C++Now (视频, 幻灯片)
- Carbon:不同权衡的实验,小组讨论,EuroLLVM (视频, 幻灯片)
- Carbon 的高级语义 IR 闪电演讲,EuroLLVM (视频)
2023
2022
其他视频
我们还有工具链视频。
加入我们
我们非常欢迎大家加入并为本项目做出贡献。Carbon 致力于营造一种欢迎和包容的环境,让每个人都能 做出贡献。
- Carbon 的大部分设计讨论都在 Discord上进行。
- 要关注主要版本发布公告,请订阅我们的 Carbon 发布帖(GitHub) 并star carbon-lang。
- 请参阅我们的行为准则和 贡献指南,了解有关 Carbon 开发社区的信息。
贡献
您也可以直接:
- 为语言设计做出贡献: 设计反馈、新的设计提案
- 为语言实现做出贡献
- Carbon 工具链,以及项目基础设施
您可以查看一些
"good first issues",
或加入 #contributing-help 频道
Discord。请参阅我们的完整
CONTRIBUTING 文档以获取更多详细信息。