Carbon
덤프버전 :
분류
package Sample api;
fn Main() -> i32 {
Print("Hello, World!");
return 0;
}
1. 개요[편집]
Carbon은 구글에서 개발 중인 다목적 범용 프로그래밍 언어이며, C++를 대체하거나 기존의 레거시 C++코드와의 상호 운용성 달성을 목표로 하고 있다.
공식 저장소에서는 "C++ successor"(C++ 후계자) 라는 문구로 이를 표현하고 있다.[1]
2. 역사[편집]
2022년 7월 19일 토론토에서 열리는 CppNorth 컨퍼런스에서 구글의 개발자인 Chandler Carruth가 발표하며 처음으로 공개되었다. 당시 키노트
같은 날 모든 프로젝트를 오픈소스로 전환하고 0.1 프리뷰 버전을 출시하였다. GitHub Repository
현재 카본 코드를 컴파일할 수 있는 멀쩡한 컴파일러가 없기 때문에, Carbon Explorer라는 인터프리터를 통해 코드를 실행시킬 수 있다. 다만 이 인터프리터도 한창 개발 중이기 때문에 문서에 있는 코드를 그대로 실행해도
<
연산자나 i64
자료형이 구현이 안 되어있어 에러가 나는 등 정상적인 실행은 거의 불가능하다.[2]3. 특징[편집]
주로 영향받은 언어는 C++와 Rust이며, 문법을 보면 Rust와 매우 흡사하다는 것을 알 수 있다.
다만 Rust와는 달리 C++와 양방향 호환이 가능할 수 있도록 디자인 된다고 한다.
또 다른 특징 중 하나로, Rust처럼 유연하고 컴파일 타임에 체크 가능한 제네릭을 도입했다는 점이다. C++식 템플릿을 여전히 지원하기 때문에 기존 코드와도 상호 운용이 가능하다.
4. 문법[편집]
4.1. 기본 자료형[편집]
-
bool
- signed 또는 unsigned 정수 타입. Rust와 비슷하게
,i32
[미구현] 등으로 표현한다.u64
[미구현] 와 같이 표현하는 것도 가능하다. 부호 없는 정수는Carbon.Int(비트 수)
처럼 표기 가능하다.Carbon.UInt(비트 수)
- IEEE-754 부동소수점.
,f32
등으로 표현한다.f64
- 문자열
4.2. 복합 자료형[편집]
- 튜플: Rust와 상당히 유사한 튜플 자료형을 가지고 있다.
처럼 사용할 타입을 지정할 수 있다.(T, V)
- 구조체: 독특한 구조체 선언 및 리터럴 문법을 가지고 있다.
- 구조체 선언(타입): {{{{.key1: i32, .key2: String}
- 구조체 리터럴: {{{{.key1 = 123, .key2 = "hello"}
}}} 처럼
=
(대입 연산자)를 사용한다.- 배열: Rust의 영향을 받았다. 5개의 요소를 가진
타입의 배열은 아래와 같이 선언한다.i32
이때 r-value로 들어간 튜플은 암시적으로(implicitly) 배열로 변환된다.배열 내 요소는 배열[인데스]
를 통해 접근할 수 있다. 따라서 arr[3]
은 4가 나온다.- 슬라이스[미구현]
4.3. 변수 선언[편집]
- Kotlin, JavaScript, Rust와 마찬가지로 상수 선언과 변수 선언 문법이 별도로 존재한다.
은 상수를 선언하며let
은 변수를 선언한다. 또한 Rust와 마찬가지로 선언 또한 irrefutable 패턴 매칭이기에 {{{#!syntax rustvar
auto
키워드를 사용하는 것도 가능하다.4.4. 함수 선언[편집]
Rust와 유사한 문법을 가진다. 두 숫자를 더하는 함수는 다음과 같이 선언한다.
fn Add(a: i32, b: i32) -> i32 {
return a + b;
}
4.5. 제어문[편집]
C++의 if, else, while과 거의 같은 키워드를 가지고 있다. 배열을 순회하는 for문의 경우 C++와 조금 달라지는데, 기존의 C++가
for (int n : arr) {
// ...
}
위와 과 같이 짜던 부분을for (var n: <타입> in arr) {
// ...
}
이렇게 작성할 수 있다.match문 또한 존재하는데, Rust의
match
구문을 C식 switch
스타일로 다듬은 모양새이다.match (Bar()) {
case (1, y: i32) => {
// ...
}
case (x: i32, 2) => {
// ...
}
case (x: i32, _: auto) if (x > 3) => { // 매치 가드
// ...
}
default => {
// ...
}
}
4.6. 제네릭[편집]
카본의 가장 큰 특징은 Rust방식의 모던한 제네릭을 도입했다는 점이다. (C++식 템플릿도 지원한다.)
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코드로 바꿀 수 있다.fn min<T: Ord>(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
키워드를 사용할 수 있다.// 템플릿 형태의 제네릭 타입 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;
}
5. 관련 문서[편집]
6. 외부 링크[편집]
이 문서의 내용 중 전체 또는 일부는 2023-10-22 02:12:07에 나무위키 Carbon 문서에서 가져왔습니다.
[1] 홈페이지에선 타입스크립트가 자바스크립트를 계승한 듯, 코틀린이 자바를 계승한 듯, C++이 C언어를 계승한 것과 같다고 한다.[2] 이는 위 오픈소스를 그대로 사용해 컴파일을 시도해도 마찬가지이다.[미구현] A B C 현재 미구현 상태인 표준.