[include(틀:다른 뜻1, other1=화학 원소, rd1=탄소)]
[include(틀:프로그래밍 언어)]
||
개발 || [[Google]] ||
|| 종류 || [[C(프로그래밍 언어)|C]] 패밀리 ||
|| 상태 || 개발 중 ||
|| 라이선스 || [[아파치 라이선스]] v2 ||
[목차]
{{{#!syntax rust
package Sample api;
fn Main() -> i32 {
Print("Hello, World!");
return 0;
}
}}}
== 개요 ==
Carbon은 구글에서 개발 중인 다목적 범용 프로그래밍 언어이며, [[C++]]를 대체하거나 기존의 레거시 [[C++]]코드와의 상호 운용성 달성을 목표로 하고 있다.
공식 저장소에서는 "C++ successor"(C++ 후계자) 라는 문구로 이를 표현하고 있다.[* 홈페이지에선 타입스크립트가 자바스크립트를 계승한 듯, 코틀린이 자바를 계승한 듯, C++이 C언어를 계승한 것과 같다고 한다.]
== 역사 ==
[[2022년]] [[7월 19일]] [[토론토]]에서 열리는 [[https://cppnorth.ca/|CppNorth 컨퍼런스]]에서 [[구글]]의 개발자인 [[https://cppnorth2022.sched.com/speaker/chandlerc|Chandler Carruth]]가 발표하며 처음으로 공개되었다. [[https://cppnorth2022.sched.com/event/140f8/keynote-chandler-carruth-nulbscience-experiment-timenulb|당시 키노트]]
같은 날 모든 프로젝트를 [[오픈소스]]로 전환하고 0.1 프리뷰 버전을 출시하였다. [[https://github.com/carbon-language/carbon-lang|GitHub Repository]]
현재 카본 코드를 컴파일할 수 있는 멀쩡한 컴파일러가 없기 때문에, [[https://github.com/carbon-language/carbon-lang/tree/trunk/explorer|Carbon Explorer]]라는 인터프리터를 통해 코드를 실행시킬 수 있다. 다만 이 인터프리터도 한창 개발 중이기 때문에 문서에 있는 코드를 그대로 실행해도 {{{<}}} 연산자나 {{{i64}}} 자료형이 구현이 안 되어있어 에러가 나는 등 정상적인 실행은 거의 불가능하다.[* 이는 위 오픈소스를 그대로 사용해 컴파일을 시도해도 마찬가지이다.]
== 특징 ==
주로 영향받은 언어는 [[C++]]와 [[Rust(프로그래밍 언어)|Rust]]이며, 문법을 보면 Rust와 매우 흡사하다는 것을 알 수 있다.
다만 [[Rust(프로그래밍 언어)|Rust]]와는 달리 C++와 양방향 호환이 가능할 수 있도록 디자인 된다고 한다.
또 다른 특징 중 하나로, Rust처럼 유연하고 컴파일 타임에 체크 가능한 제네릭을 도입했다는 점이다. C++식 템플릿을 여전히 지원하기 때문에 기존 코드와도 상호 운용이 가능하다.
== 문법 ==
=== 기본 자료형 ===
* {{{bool}}}
* signed 또는 unsigned 정수 타입. [[Rust(프로그래밍 언어)|Rust]]와 비슷하게 {{{i32}}}, {{{u64}}}[*미구현 현재 미구현 상태인 표준.] 등으로 표현한다. {{{Carbon.Int(비트 수)}}}[*미구현]와 같이 표현하는 것도 가능하다. 부호 없는 정수는 {{{Carbon.UInt(비트 수)}}} 처럼 표기 가능하다.
* IEEE-754 부동소수점. {{{f32}}}, {{{f64}}} 등으로 표현한다.
* 문자열
* {{{String}}} [[UTF-8]] valid한 문자열을 표현하는 바이트 배열. 이 점 역시 [[Rust(프로그래밍 언어)|Rust]]와 유사하다.
* {{{StringView}}} 위의 String과 똑같지만 읽기 전용이라는 점이 다르다.
=== 복합 자료형 ===
* 튜플: Rust와 상당히 유사한 튜플 자료형을 가지고 있다. {{{(T, V)}}} 처럼 사용할 타입을 지정할 수 있다.
* 구조체: 독특한 구조체 선언 및 리터럴 문법을 가지고 있다.
* 구조체 선언(타입): {{{{.key1: i32, .key2: String}
}}} 처럼 필드(키)명이 반드시 {{{.}}}으로 시작한다. 그 외에는 [[Rust(프로그래밍 언어)|Rust]], [[JavaScript]]와 유사하다.
* 구조체 리터럴: {{{{.key1 = 123, .key2 = "hello"}
}}} 처럼 {{{=}}}(대입 연산자)를 사용한다.
* 배열: Rust의 영향을 받았다. 5개의 요소를 가진 {{{i32}}}타입의 배열은 아래와 같이 선언한다.
{{{#!syntax rust
var arr: [i32; 5] = (1, 2, 3, 4, 5);
}}} 이때 r-value로 들어간 튜플은 암시적으로(implicitly) 배열로 변환된다.
배열 내 요소는 {{{배열[인데스]}}} 를 통해 접근할 수 있다. 따라서 {{{arr[3]}}}은 4가 나온다.
* 슬라이스[*미구현]
=== 변수 선언 ===
* [[Kotlin]], [[JavaScript]], [[Rust(프로그래밍 언어)|Rust]]와 마찬가지로 상수 선언과 변수 선언 문법이 별도로 존재한다. {{{let}}}은 상수를 선언하며 {{{var}}}은 변수를 선언한다. 또한 Rust와 마찬가지로 선언 또한 irrefutable 패턴 매칭이기에 {{{#!syntax rust
let (x: i32, y: i32) = (12, 34)}}} 등의 선언이 가능하다. [[C++]]와 마찬가지로 {{{auto}}} 키워드를 사용하는 것도 가능하다.
=== 함수 선언 ===
[[Rust(프로그래밍 언어)|Rust]]와 유사한 문법을 가진다. 두 숫자를 더하는 함수는 다음과 같이 선언한다.{{{#!syntax rust
fn Add(a: i32, b: i32) -> i32 {
return a + b;
}
}}}
=== 제어문 ===
[[C++]]의 if, else, while과 거의 같은 키워드를 가지고 있다. 배열을 순회하는 for문의 경우 C++와 조금 달라지는데, 기존의 C++가{{{#!syntax cpp
for (int n : arr) {
// ...
}
}}}위와 과 같이 짜던 부분을{{{#!syntax rust
for (var n: <타입> in arr) {
// ...
}
}}}이렇게 작성할 수 있다.
match문 또한 존재하는데, Rust의 {{{match}}}구문을 C식 {{{switch}}} 스타일로 다듬은 모양새이다.
{{{#!syntax rust
match (Bar()) {
case (1, y: i32) => {
// ...
}
case (x: i32, 2) => {
// ...
}
case (x: i32, _: auto) if (x > 3) => { // 매치 가드
// ...
}
default => {
// ...
}
}
}}}
=== 제네릭 ===
카본의 가장 큰 특징은 Rust방식의 모던한 제네릭을 도입했다는 점이다. ([[C++]]식 템플릿도 지원한다.){{{#!syntax rust
fn Min[T:! Ordered](x: T, y: T) -> T {
return if x <= y then x else y;
}
Min(1, 2); // 1
Min("abc", "xyz"); // "abc"
}}}
{{{[T:! Ordered]}}}는 T가 제네릭 타입이며, 컴파일 타임에 체크되고({{{:!}}}), {{{Ordered}}} 인터페이스를 구현한다는 뜻이다. 이를 동일한 동작을 하는 rust코드로 바꿀 수 있다.{{{#!syntax rust
fn min(x: T, y: T) -> T {
if x <= y { x } else { y }
}
assert_eq![min(1, 2), 1];
assert_eq![min("abc", "xyz"), "abc"];
}}}반대로 항수가 실행될 때 동적으로 타입을 지정하는 것도 가능하다. 상술했듯이 카본은 C++식 템플릿도 지원하며, {{{template}}}키워드를 사용할 수 있다.{{{#!syntax rust
// 템플릿 형태의 제네릭 타입 T를 선언한다.
// 동시에 템플릿 형태의 인자 타입 U를 선언한다.
fn Tmpl[template T:! Type](a: T, template U:! Type) -> U {
var result: U = do_something(a);
return result;
}
fn Main() -> i32 {
// 이때 T는 암시적으로 i32로 지정되며
// U의 경우 명시적으로(타입을 직접 넘김으로써) String으로 지정한다.
// 결국 Tmpl이 String을 리턴하리란 사실을 알 수 있다.
Tmpl(123, String);
return 0;
}
}}}
== 관련 문서 ==
* [[C++]]
* [[Rust(프로그래밍 언어)|Rust]]
* [[Zig]]
== 외부 링크 ==
* [[https://github.com/carbon-language/carbon-lang|공식 리포지토리]]
* [[https://discord.com/invite/ZjVdShJDAs|공식 디스코드]]
* [[https://www.ryugod.com/pages/ide/carbon|온라인 실행기]]
* 관련 기사
* [[https://mybroadband.co.za/news/software/453410-googles-carbon-programming-language-aims-to-replace-c.html|Google’s Carbon programming language aims to replace C++]]
* [[https://www.phoneworld.com.pk/carbon-a-new-programming-language-from-google-as-a-c-successor/|Carbon, A New Programming Language from Google As A C++ Successor]]
* [[https://www.techradar.com/news/google-thinks-its-new-programming-language-can-topple-c|Google thinks its new programming language can topple C++]]
[[분류:프로그래밍 언어]]