Family | C |
---|---|
Designed by | |
Typing discipline | Static, nominative, partly inferred |
Implementation language | C++ |
License | Apache-2.0-with-LLVM-Exception |
Filename extensions | .carbon |
Website |
github |
Influenced by | |
C++, Rust, Swift [ citation needed] |
Carbon is an experimental programming language designed for connectiveness with C++. [1] The project is open-source and was started at Google. Google engineer Chandler Carruth first introduced Carbon at the CppNorth conference in Toronto in July 2022. He stated that Carbon was created to be a C++ successor. [2] [3] [4] The language is expected to have an experimental MVP version 0.1 in 2025 and a production-ready version 1.0 after 2027. [5]
The language intends to fix several perceived shortcomings of C++ [6] but otherwise provides a similar feature set. The main goals of the language are readability and "bi-directional interoperability" (which allows the user to include C++ code in the Carbon file), as opposed to using a new language like Rust, that, whilst being influenced by C++, is not two-way compatible with C++ programs. Changes to the language will be decided by the Carbon leads. [7] [8] [9] [10]
Carbon's documents, design, implementation, and related tools are hosted on GitHub under the Apache-2.0 license with LLVM Exceptions. [11]
The following shows how a program might be written in Carbon and C++: [12]
Carbon | C++ |
---|---|
package Geometry api;
import Math;
class Circle {
var r: f32;
}
fn PrintTotalArea(circles: Slice(Circle)) {
var area: f32 = 0;
for (c: Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Print("Total area: {0}", area);
}
fn Main() -> i32 {
// A dynamically sized array, like `std::vector`.
var circles: Array(Circle) = ({.r = 1.0}, {.r = 2.0});
// Implicitly converts `Array` to `Slice`.
PrintTotalArea(circles);
return 0;
}
|
#include <numbers>
#include <print>
#include <span>
#include <stdfloat>
#include <vector>
// or: import std;
struct Circle {
std::float32_t r;
};
void PrintTotalArea(std::span<Circle> circles) {
std::float32_t area = 0;
for (const Circle& c : circles) {
area += std::numbers::pi * c.r * c.r;
}
std::print("Total area: {}\n", area);
}
int main() {
std::vector<Circle> circles{{.r = 1.0}, {.r = 2.0}};
// Implicitly converts `vector` to `span`.
PrintTotalArea(circles);
return 0;
}
|
It is designed around interoperability with C++ as well as large-scale adoption and migration for existing C++ codebases and developers.
Family | C |
---|---|
Designed by | |
Typing discipline | Static, nominative, partly inferred |
Implementation language | C++ |
License | Apache-2.0-with-LLVM-Exception |
Filename extensions | .carbon |
Website |
github |
Influenced by | |
C++, Rust, Swift [ citation needed] |
Carbon is an experimental programming language designed for connectiveness with C++. [1] The project is open-source and was started at Google. Google engineer Chandler Carruth first introduced Carbon at the CppNorth conference in Toronto in July 2022. He stated that Carbon was created to be a C++ successor. [2] [3] [4] The language is expected to have an experimental MVP version 0.1 in 2025 and a production-ready version 1.0 after 2027. [5]
The language intends to fix several perceived shortcomings of C++ [6] but otherwise provides a similar feature set. The main goals of the language are readability and "bi-directional interoperability" (which allows the user to include C++ code in the Carbon file), as opposed to using a new language like Rust, that, whilst being influenced by C++, is not two-way compatible with C++ programs. Changes to the language will be decided by the Carbon leads. [7] [8] [9] [10]
Carbon's documents, design, implementation, and related tools are hosted on GitHub under the Apache-2.0 license with LLVM Exceptions. [11]
The following shows how a program might be written in Carbon and C++: [12]
Carbon | C++ |
---|---|
package Geometry api;
import Math;
class Circle {
var r: f32;
}
fn PrintTotalArea(circles: Slice(Circle)) {
var area: f32 = 0;
for (c: Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Print("Total area: {0}", area);
}
fn Main() -> i32 {
// A dynamically sized array, like `std::vector`.
var circles: Array(Circle) = ({.r = 1.0}, {.r = 2.0});
// Implicitly converts `Array` to `Slice`.
PrintTotalArea(circles);
return 0;
}
|
#include <numbers>
#include <print>
#include <span>
#include <stdfloat>
#include <vector>
// or: import std;
struct Circle {
std::float32_t r;
};
void PrintTotalArea(std::span<Circle> circles) {
std::float32_t area = 0;
for (const Circle& c : circles) {
area += std::numbers::pi * c.r * c.r;
}
std::print("Total area: {}\n", area);
}
int main() {
std::vector<Circle> circles{{.r = 1.0}, {.r = 2.0}};
// Implicitly converts `vector` to `span`.
PrintTotalArea(circles);
return 0;
}
|
It is designed around interoperability with C++ as well as large-scale adoption and migration for existing C++ codebases and developers.