Carbon 语言上手指南:从装好工具链到跑通素数筛
【免费下载链接】carbon-langCarbon Language's main repository: documents, design, implementation, and related tools. (NOTE: Carbon Language is experimental; see README)项目地址: https://gitcode.com/GitHub_Trending/ca/carbon-lang
Carbon 是 Google 主导的实验性编程语言,定位为 C++ 的继任者:性能对标 C++、与现有 C++ 代码双向互操作,同时提供泛型、模块化和更现代的安全设计。它的主仓库 carbon-lang 同时包含语言设计文档、编译器实现(toolchain/)和可运行的示例,本教程就走一遍最短上手路径。
它凭什么出现
C++ 经过几十年积累,技术债很重,再往前改已经非常困难。Carbon 的思路不是修补 C++,而是做一个"继任者语言":不继承 C 的历史包袱,从头建立干净的语法和类型基础,同时把 C++ 互操作当作第一公民。README 里把它类比成 JavaScript 之于 TypeScript、Java 之于 Kotlin 的关系。
与相邻语言的关键差异,官方文档里其实讲得很直白——Rust 这类语言"能用就该用",但它们的内存模型和惯用法对 C++ 代码库迁移是硬门槛:
| 维度 | C++ | Go / Rust 类语言 | Carbon |
|---|---|---|---|
| 性能 | 基准 | 存在迁移成本或运行开销 | 对齐 C++(LLVM 后端) |
| 与 C++ 混用 | — | 受内存模型/惯用法限制 | 双向、无开销互操作,可从继承到模板 |
| 泛型 | 模板,使用时才检查 | 各自方案 | 定义即检查(definition-checked),支持特化与类型擦除 |
| 内存安全 | 长期痛点 | 强制/不同模型 | 先迁移、再渐进式收紧,提供安全子集路径 |
最短路径装好它
官方只发布面向近期 Ubuntu/Debian 系(含 WSL)的 nightly 工具链,源码构建也主要针对 Linux。这里给最短且可验证的路径:
sudo apt update sudo apt install clang libc++-dev libc++abi-dev lld装的是构建工具链依赖,装完clang --version应有输出。然后拉代码并构建:
git clone https://gitcode.com/GitHub_Trending/ca/carbon-lang cd carbon-lang./scripts/run_bazelisk.py run //toolchain -- help首次运行会自动下载 Bazel 并编译工具链,耗时较长;预期结果是打印carbon命令行的完整帮助文本,其中包含compile和link两个子命令——这就是后面所有操作的基础。
第一个程序,逐块看懂
仓库里的 examples/hello_world.carbon 一共 3 行有效代码,正好当最小样本:
import Core library "io";用import按模块引入核心库的io组件,不是 C++ 的#include。
fn Run() { Core.PrintStr("Hello world!\n"); }入口函数叫Run而不是main,命名空间用.分隔,没有::。
./scripts/run_bazelisk.py run //examples:hello_world通过 Bazel 构建并执行,预期在终端看到Hello world!。和常见写法的本质区别有三点:变量声明必须显式写var/let前缀和类型,不靠上下文推断省类型;语句用分号但很多场合语法本身就不冗余;没有头文件,模块边界由import决定。
跟着做一个小任务
以 examples/sieve.carbon 的素数筛为例,它演示了类、可变状态和成员方法。
思路:Sieve类持有一个array(bool, 1000)布尔数组,先假设全是素数,再对每个素数标记它的倍数。
核心代码(节选):
class Sieve { impl as Core.UnformedInit {} fn Make() -> Sieve { returned var s: Sieve; for (n: i32 in Core.Range(1000)) { s.is_prime[n] = true; } return var; }impl as Core.UnformedInit声明这个类允许"未初始化状态",Make负责从零填充。
fn MarkMultiplesNotPrime(ref self, p: i32) { var n: i32 = p * 2; while (n < 1000) { self.is_prime[n] = false; n += p; } }ref self表示以可变引用方式访问自身,对应 C++ 里的非 const 成员函数。
怎么跑:
./scripts/run_bazelisk.py run //examples:sieve会看到什么:屏幕上依次打印 2 到 997 之间全部素数;Run的返回值是素数个数,小于 1000 的素数共 168 个。
新手容易踩的坑
- 平台不是近期 Ubuntu/Debian 系。nightly 下载包只覆盖 Linux 系环境,macOS 或非 Debian 系发行版容易缺库。解法:在 WSL2 里跑,或按 构建文档 装齐 Clang、LLD、libc++ 后从源码构建。
link阶段报缺系统库。工具链链接时依赖 glibc 的运行时库,只装 Clang 不够。解法:sudo apt install libgcc-11-dev(或直接装gcc),再重新链接。- 把当前实现当稳定语言用。README 明确写了 Carbon 还是实验项目、"many things don't yet work"。示例代码会随工具链演进频繁调整,比如 Advent of Code 2024 示例 自己也承认需要绕开缺失功能,别照抄进生产环境。
往哪儿走
- docs/design/:语言设计文档,泛型、类、模式匹配等专题都在这,适合想理解"为什么这么设计"的人。
- toolchain/docs/:编译器各阶段(词法、解析、lower、codegen)的实现说明,适合想给工具链贡献代码的人。
- examples/:hello_world、sieve、RE2 集成等可运行示例,适合边读边复现的人。
- docs/project/goals.md 与 docs/project/faq.md:项目目标和对 Rust、fork C++ 等常见问题的回答,适合做技术选型判断的人。
装好之后,下一步可以直接用//examples:sieve换掉hello_world跑自己的第一个改动,或打开toolchain/看看编译器是怎么把这几行 Carbon 变成机器码的。
【免费下载链接】carbon-langCarbon Language's main repository: documents, design, implementation, and related tools. (NOTE: Carbon Language is experimental; see README)项目地址: https://gitcode.com/GitHub_Trending/ca/carbon-lang
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考