[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++]] [[분류:프로그래밍 언어]]