Carbon
Carbon is an experimental successor language to C++ from the carbon-language project. As of 2026-09-05 there is no 1.0 and no 0.1: the 0.1 milestone is the minimum language for evaluation, and the 2025 roadmap revision moved its earliest realistic date to the end of 2026 after memory-safety design was added to its scope. The only downloads are nightly toolchain tarballs tagged v0.0.0-0.nightly.YYYY.MM.DD, on limited platforms. Treat every finding below as dated to the nightly you ran.
Contract
| Field | Bound contract |
|---|---|
| Trigger | A team with a large C++ code base asks whether to evaluate Carbon, wants to run the toolchain, wants to call C++ from Carbon, or asks how Carbon's safety model and readiness compare with C++. |
| Authority | Reversible local: writes only the toolchain checkout or extracted nightly tarball, Carbon source files, and --output artifacts in the working directory; rollback is deleting them. No remote mutation. |
| Side effect | A Bazel build of the toolchain compiles a pinned LLVM commit and takes substantial disk and time. |
| Done | The evaluation report states the nightly date or commit used, what compiled and what did not, and a decision (evaluate further or stay on C++) tied to the constraints in step 7. |
Inputs
- The C++ code base under consideration and its constraints: stdlib and Boost dependence, template depth, platforms.
- A toolchain source: a nightly tarball from the GitHub releases page, or a checkout of
https://github.com/carbon-language/carbon-langwith Clang 19 or newer,libc++-dev,libc++abi-dev, andlldinstalled. Bazel is pinned by.bazelversion(8.6.0 at grounding) and fetched byscripts/run_bazelisk.py; LLVM is pinned as an upstream commit throughgit_overrideinMODULE.bazel, not as a release number. - The evaluation question: syntax and ergonomics, C++ interop, or readiness.
Procedure
Record the toolchain identity. From a nightly: extract the tarball, take the version from the
carbon_toolchain-${VERSION}directory name, and run./carbon_toolchain-${VERSION}/bin/carbon help. From source:./scripts/run_bazelisk.py run //toolchain -- helpbuilds and runs the driver (target//toolchain:carbon, alias//toolchain:toolchain);//toolchain/install:carbon_toolchainpackages the tarball. Done when: the nightly tag or commit hash is written into the report.Compile the README example to prove the toolchain works:
import Core library "io"; fn Run() { Core.Print(42); }carbon compile --output=forty_two.o forty_two.carbonthencarbon link --output=forty_two forty_two.o. Type-check only withcarbon compile --phase=check file.carbon(phases:lex,parse,check,lower,optimize,codegen). Done when: the binary prints42.Read the syntax against the design docs, not against tutorials. A package declaration is
[impl] [package Name] [library "Name"];; there is noapikeyword, and an API file is one that omitsimpl. The entry point is a function namedRunin the default library of theMainpackage; its valid signatures are undecided. Variables arevar x: i32 = 3;. Printing isCore.Print(...)afterimport Core library "io";. Done when: each construct in the evaluation has a line indocs/design/README.mdbehind it.Test C++ interop with the documented form. Import a header into the
Cppnamespace and call through it:import Cpp library "circle.h"; fn Area(r: f64) -> f64 { return Cpp.circle_area(r); }import Cpp library "<cstdio>";works for standard headers. Interop is semantic: C++ functions, classes, and macros map intoCpp.with explicit-cast rules for types such asCpp.int. The design says Carbon functions and types may be marked as exported to C, comparable toextern "C", but no exported-to-C++ header generator exists in the docs;Carbon.his not a real artifact. Done when: at least one C++ function is called from Carbon on the recorded nightly, or the failure is quoted.State the safety model as designed, not as marketed. Safe and unsafe code are split by a narrow
unsafekeyword, with two modes: Strict Carbon marks all unsafe code, Permissive Carbon relaxes that for C++ interop and migration. Type safety and temporal and data-race safety are meant to come from the type system at compile time, spatial safety from run-time checks. The docs state the temporal model is expected to follow Rust's direction at the highest level. None of this is implemented enough to evaluate; say so. Done when: the report citesdocs/design/safety/README.mdand marks the model as design-stage.List the limitations that apply today: no standard library comparable to C++'s, toolchain and syntax change nightly, editor support is thin, and the platform list is short. Done when: each limitation is tied to something observed on the recorded nightly.
Decide. Evaluate further when the team owns a large C++ code base it intends to migrate gradually, wants C++ interop without an FFI layer, and can absorb nightly churn on an evaluation branch. Stay on C++ when production stability is needed now, when the code leans on the standard library, Boost, or deep template metaprogramming, or when the target platforms exceed the nightly's list.
cpp-modulesandcpp-templatescover the C++ side of that comparison. Done when: the decision names the constraint that settled it.
Failure and recovery
| Failure | Cause | Fix |
|---|---|---|
| Bazel build fails on LLVM | Host Clang older than 19, or libc++, libc++abi, lld missing |
Install the listed prerequisites; let Bazel fetch the pinned LLVM commit rather than pointing at a system LLVM |
| C++ import rejects a header | Unsupported C++ feature in the header | Wrap the needed calls in a plain C or simpler C++ shim header and import that |
| Tutorial syntax fails to parse | Pre-0.1 churn | Rewrite against docs/design/README.md at the same commit as the toolchain |
| Compiler Explorer and local results differ | Different nightlies | Pin both to the same date; carbon.compiler-explorer.com is the project's own instance |
| Needed library function does not exist | No standard library yet | Call the C++ library through import Cpp library |
| Link error mixing Carbon and C++ objects | Toolchain mismatch | Link with carbon link from the same nightly that compiled the objects |
Output
An evaluation report naming the nightly tag or commit, the examples that compiled and ran, the C++ interop result, the safety model status as design-stage, the observed limitations, and the decision from step 7 with its deciding constraint.