Carbon 语言:
C++的实验性继任者
观看我们在CppNorth发布的公告视频。 请注意,Carbon 目前尚未准备好供使用。
快速且兼容C++
- 使用LLVM实现与C++相匹配的性能,可低级访问位和地址
- 与现有C++代码互操作,从继承到模板
- 快速且可扩展的构建,兼容现有C++构建系统
现代且不断发展
- 坚实的语言基础,易于学习,尤其是对C++使用者而言
- 轻松的工具化Carbon版本升级
- 更安全的基础,逐步实现内存安全子集
欢迎加入开源社区
- 明确的目标和优先级,健全的治理
- 努力打造热情、包容、友好的社区
- 全面配套:编译器、库、文档、工具、包管理器等
为什么创建Carbon?
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++代码的互操作性和迁移
虽然许多语言共享这些目标的子集,但Carbon的独特之处在于它们的组合。
我们也为Carbon明确设定了一些_非目标_,特别包括:
- 整个语言和库的稳定应用程序二进制接口(ABI)
- 完美的向后或向前兼容性
我们详细的目标文档阐述了这些想法,并深入展示了我们对Carbon项目和语言的目标。
项目状态
Carbon语言目前是一个实验性项目。您可以在compiler-explorer.com上查看Carbon的演示解释器。我们也正在努力开发包含编译器和链接器的工具链实现。
我们希望更好地了解是否能够构建一个满足我们继任语言标准的语言,以及由此产生的语言是否能在更广泛的C++行业和社区中获得关键规模的兴趣。
目前,我们已经详细阐述了Carbon项目和语言的几个核心方面:
- Carbon语言和项目的策略。
- 开源项目结构、治理模式和演进过程。
- 基于我们在C++方面的经验以及预期的最困难挑战而设计的语言关键和基础方面。这包括以下设计:
- 泛型
- 类类型
- 继承
- 运算符重载
- 词法和语法结构
- 代码组织和模块化结构
- 一个原型解释器演示,既可以运行独立示例,又可以对Carbon的具体语义模型和抽象机进行详细分析。我们称之为Carbon Explorer。
- 一个正在开发中的编译器和工具链,可以将Carbon(最终也包括C++代码)编译成标准可执行代码。这是我们当前实现工作的主要重点。
如果你有兴趣贡献,我们目前专注于开发Carbon工具链,直到它能够支持Carbon ↔ C++互操作。在此之后,我们计划继续开发设计和工具链,直到我们可以发布0.1版本的语言,并支持更详细地评估Carbon。
你可以查看我们的完整路线图了解更多详情。
Carbon和C++
如果你已经是C++开发者,Carbon应该有一个平缓的学习曲线。它由一套一致的语言构造组成,这些构造应该让人感到熟悉,易于阅读和理解。
像这样的C++代码:
[图片:C++代码片段]
对应的Carbon代码如下:
[图片:转换后的Carbon代码片段]
你可以无开销地从C++调用Carbon,反之亦然。这意味着你可以在应用程序中将单个C++库迁移到Carbon,或者在现有的C++投资基础上编写新的Carbon代码。例如:
[图片:混合Carbon和C++的代码片段]
阅读更多关于Carbon中的C++互操作性。
除了Carbon和C++之间的互操作性外,我们还计划支持迁移工具,可以将惯用的C++代码机械地转换为Carbon代码,以帮助你将现有的C++代码库切换到Carbon。
泛型
Carbon提供了一个现代泛型系统,具有检查定义的功能,同时仍然支持可选的模板以实现无缝的C++互操作。与C++模板相比,检查型泛型提供了几个优势:
- 泛型定义经过完全类型检查,无需实例化即可检查错误,提高了代码的可信度。
- 避免了每次实例化时重新检查定义的编译时开销。
- 使用经过定义检查的泛型时,使用错误消息更清晰,直接显示哪些要求未满足。
- 无需单独实现即可实现自动、可选的类型擦除和动态分派。这可以减少二进制大小并支持异构容器等构造。
- 强大的、经过检查的接口意味着更少意外依赖于实现细节,为使用者提供更清晰的契约。
在不牺牲这些优势的同时,Carbon泛型支持特化,确保它可以充分满足C++模板的性能关键用例。有关Carbon泛型的更多详细信息,请参阅其设计。
除了与C++的简单而强大的互操作外,Carbon模板可以受到约束,并以细粒度和平滑的演进路径逐步迁移到检查型泛型。
内存安全
安全性,特别是内存安全性,仍然是C++的一个关键挑战,也是继任语言需要解决的问题。我们的初始优先事项和重点是立即解决安全领域重要的、容易解决的问题:
- 更好地跟踪未初始化状态,加强初始化的执行,并在需要时系统地提供针对初始化错误的加固。
- 设计基本API和惯用法,以支持在调试和加固版本中进行动态边界检查。
- 提供一个默认的调试构建模式,该模式比现有的C++构建模式更便宜、更全面,即使与Address Sanitizer结合使用也是如此。
一旦我们能够将代码迁移到Carbon,我们将拥有一个简化的语言,在设计空间中有足够的余地添加任何必要的注解或特性,以及支持更安全设计模式的基础设施,如泛型。长期来看,我们将在此基础上引入一个安全的Carbon子集。这将是一个庞大而复杂的任务,不会出现在0.1设计中。同时,我们正密切关注并学习为C++添加内存安全语义的努力,如受Rust启发的生命周期注解。
入门
要在浏览器中立即尝试Carbon,您可以使用Carbon的演示解释器: carbon.compiler-explorer.com。
我们正在开发一个传统的Carbon工具链,可以编译和链接程序。但是,Carbon仍然是一个早期的实验项目,所以我们只提供非常实验性的Carbon工具链每夜版本下载,而且仅限于特定平台。如果您使用的是最新的Ubuntu Linux或类似系统(Debian、WSL等),可以通过访问我们的发布页面并下载最新的每夜工具链tar文件来尝试:
carbon_toolchain-0.0.0-0.nightly.YYYY.MM.DD.tar.gz
。然后您可以按以下步骤尝试:
# 设置特定的每夜版本变量:
VERSION="0.0.0-0.nightly.YYYY.MM.DD"
# 解压工具链:
tar -xvf carbon_toolchain-${VERSION}.tar.gz
# 创建一个简单的Carbon源文件:
echo "fn Run() { Core.Print(42); }" > forty_two.carbon
# 编译为目标文件:
./carbon_toolchain-${VERSION}/bin/carbon compile \
--output=forty_two.o forty_two.carbon
# 安装用于链接的最小系统库。注意,安装用于使用GCC编译C/C++代码的`gcc`
# 或`g++`也足够,这些只是Carbon链接仍在使用的特定系统库。
sudo apt install libgcc-11-dev
# 链接为可执行文件:
./carbon_toolchain-${VERSION}/bin/carbon link \
--output=forty_two forty_two.o
# 运行:
./forty_two
请记住,工具链仍处于非常早期的阶段,许多功能尚未实现。请暂时不要提交大量bug报告:我们知道很多部分还不能工作或可能在某些系统上无法工作。我们预计在达到0.1里程碑时,将提供更加稳健可靠的版本供您尝试。
如果您想自己构建Carbon的工具链,或者考虑为Carbon贡献修复或改进,您需要安装我们的构建依赖项(Clang、LLD、libc++)并检出Carbon仓库。例如,在Debian或Ubuntu上:
# 更新apt。
sudo apt update
# 安装工具。
sudo apt install \
clang \
libc++-dev \
libc++abi-dev \
lld
# 下载Carbon的代码。
$ git clone https://github.com/carbon-language/carbon-lang
$ cd carbon-lang
然后您可以尝试我们的工具链,它包含一个非常早期的Carbon编译器:
# 构建并运行工具链的帮助,以获取命令行文档。
$ ./scripts/run_bazelisk.py run //toolchain -- help
有关完整说明,包括在各种不同平台上安装依赖项,请参阅我们的贡献工具文档。
了解更多关于Carbon项目的信息:
会议演讲
来自社区的Carbon相关演讲:
即将举行
- 设计具有C++互操作性的Carbon如何教会我C++可变参数和重载, CppNorth,7月21-24日
- Carbon语言:通往0.1的道路, NDC {TechTown},9月11日
2024年
- 通用元数:Carbon中的定义检查可变参数, C++Now
- Carbon:一个尝试不同权衡的实验 小组讨论,EuroLLVM
- Carbon的高级语义IR 闪电演讲, EuroLLVM
2023年
- Carbon的继承策略:从C++互操作到内存安全, C++Now
- 定义检查泛型(第1部分, 第2部分),C++Now
- 为Carbon的工具链现代化编译器设计, C++Now
2022年
- Carbon语言:语法和权衡,Core C++
- Carbon语言:C++的实验性继任者, CppNorth
加入我们
我们非常欢迎大家加入并为项目做出贡献。Carbon致力于营造一个欢迎和包容的环境,让每个人都能贡献。
- Carbon的大多数设计讨论发生在 Discord上。
- 要关注重大发布公告,请订阅我们的 GitHub上的Carbon发布帖子 并标星carbon-lang。
- 查看我们的行为准则和 贡献指南,了解有关Carbon 开发社区的信息。
贡献
您还可以直接: