Carbon
#
Find similar titles
- 최초 작성자
- 최근 업데이트
Structured data
- Category
- Programming
Carbon은 2022년 7월 19일 cppnorth 컨퍼런스에서 구글의 개발자인 Chandler Carruth에 의해 처음으로 공개된 다목적 범용 프로그래밍 언어이다. C++을 대체하거나 기존의 레거시 C++ 코드와의 상호 운용성 달성을 목표로 설계된 언이이다. 공식적으로도 C++ successor(후계자)라는 문구로 Carbon 표현한다. 진행 중인 프로젝트는 모두 오픈소스로 공개하고 GitHub에서 형상 관리가 되고 있다. 작성일 기준 개발된지 얼마 되지 않은 언어이다 보니 현재 Carbon 코드를 컴파일할 수 있는 컴파일러가 존재하지 않아 Carbon Explorer 인터프리터를 통해 코드를 실행시키는 것으로 제한된다. 문제는 이 인터프리터도 마찬가지로 개발이 진행 중이다 보니 공식문서에서 제공하는 샘플 코드를 그대로 실행해도 몇몇 Operator가 정상적으로 작동되지 않으며 i64 자료형이 아직 구현되지 않아 정상적인 실행이 되지 않는 등 아직 정상적으로 사용하기에는 무리가 있다.
Table of Contents
Carbon 특징 #
Carbon이 가장 크게 영향받은 언어는 C++가 Rust이다. 문법을 자세히 살펴보면 Rust와 매우 유사한 것을 확인할 수 있다.
Carbon은 Rust의 장점인 유연하고 컴파일 타임 체크가 가능한 제네릭을 적극적으로 채용했다. 기존 C++이나 Java에서 사용하는 <>
방식을 그대로 가져왔기 때문에 Carbon에 익숙하지 않더라도 코드를 이해하는 데 큰 도움을 준다.
하지만 Rust의 아쉬운 부분인 C++과의 양방향 상호작용 수준이 Java나 Kotlin에 비해 부족해 꾸준한 마이그레이션이 어렵다는 점을 지적했고, 이는 Carbon에서 개선되어 양방향 호환이 가능하게 하는 것을 목표로 가지고 있다.
Carbon이 탄생하게 된 이유에 대해서 조금 더 자세히 알아보자.
Carbon의 탄생 #
C++은 오래된 역사, 그에 맞는 큰 규모의 프로그래밍 언어로 하드웨어와 소프트웨어의 구분 없이 정말 많은 영역에서 활용되고 있는 언어이다. 하지만 오래된 역사는 수십 년간 기술 부채로 인해 적지 않은 부분에서 개발자의 요구사항을 개선하고 충족하는 데는 어려움을 겪고 있다. Go, Swift, Kotlin, Rust 등 기존 최신 언어는 이미 개발자들에게 높은 만족도를 주고 있으며, 그에 따라 점유율도 높아지고 있다. 하지만 불행하게도 C++를 채택하고 사용하는 프로젝트를 위 언어들로 마이그레이션한다면 상당한 장벽을 느끼게 될 것이다. 이 장벽은 프로젝트의 관용적 설계를 변경해야 할 수도 있으며, 성능 오버헤드에 이르기까지 다양한 문제를 일으킨다. Carbon은 C++을 발전시키는 것이 목표가 아닌 후속 언어로 접근하는 것을 목표로 하고 있다. C++와의 상호 운용성과 기존 C++ 코드베이스 및 개발자를 위한 대규모 채택 및 마이그레이션을 중심으로 설계됐다. 정리하자면 다음과 같다.
- C++와의 성능 일치
- 기존 C++ 스택의 모든 라이브러리가 나머지를 포팅하지 않고 Carbon을 채택할 수 있도록 C++와의 원활한 양방향 상호 운용성
- C++ 개발자를 위한 합리적인 친숙함을 갖춘 부드러운 학습 곡선
- 기존 소프트웨어의 설계 및 아키텍처에 대한 유사한 표현 및 지원
- 관용적인 C++ 코드에 대해 일정 수준의 소스 간 변환이 포함된 확장 가능한 마이그레이션
이러한 모델을 따르는 다른 언어들처럼 Carbon은 C++에 대해 유사한 역할을 수행하는 것을 목표로 탄생했다.
- JavaSCript → TypeScript
- Java → Kotlin
- C++ → Carbon
Carbon의 목표 #
- 성능이 우수한 소프트웨어
- 소프트웨어 및 언어의 진화
- 읽고, 이해하고, 쓰기 쉬운 코드
- 실용적이며 안전하고 테스트를 지향하는 메커니즘
- 빠르게 확장할 수 있는 개발
- 최신 OS 플랫폼, 하드웨어 아키텍처 환경 제공
- 기존 C++ 코드와의 상호 운용성 및 마이그레이션
물론 대다수 언어들이 지향하는 목표이긴 하지만 이를 모두 조합 가능한 언어는 Carbon이라고 공식적으로 발표하였다. 여기에 Carbon은 명확한 비 목표를 가지고 있으며, 다음을 포함한다고 한다.
- 전체 언어 및 라이브러리에 대한 안정적인 애플리케이션 바이너리 인터페이스 (ABI)
- 완벽한 역방향 또는 순 뱡항 호환성
사실 예전부터 C++ Killer 프로그래밍 언어는 굉장히 많이 나오고 있다. 하지만 결과적으론 아직 완벽하게 C++을 죽인 언어가 탄생하지는 못했다. D 언어는 완벽하게 실패했고, Rust가 점점 C++를 잡아가며 성장해나가고 있지만 완벽하게 점유율을 가져오기에는 시간이 많이 소요될 것이다. 하지만 특이하게도 Carbon은 C++을 죽이는 것이 목표가 아닌 뒤를 잇는 방식을 선택했다는 점이다. 이렇게 다른 관점에서 접근했다는 것은 굉장히 신선하게 느껴지고 성공한다면 C++보다 더욱 넓은 범위에 Carbon을 적용해 성능, 보안, 확장성을 모두 고려할 수 있는 강한 소프트웨어가 탄생하지 않을까 싶다.
Carbon, C++ 마이그레이션 #
C++ 개발자라면 Carbon에 대해 완만한 학습을 할 수 있도록 친숙하고 읽기 쉽고 이해하기 쉬운 일련의 일관된 언어 구성으로 구축되었다. 그럼 예시를 한번 만들어 보자.
// C++:
#include <math.h>
#include <iostream>
#include <span>
#include <vector>
struct Circle {
float r;
};
void PrintTotalArea(std::span<Circle> circles) {
float area = 0;
for (const Circle& c : circles) {
area += M_PI * c.r * c.r;
}
std::cout << "Total area: " << area << "\n";
}
auto main(int argc, char** argv) -> int {
std::vector<Circle> circles = {{1.0}, {2.0}};
// Implicitly constructors `span` from `vector`.
PrintTotalArea(circles);
return 0;
}
위와 같은 C++ 코드와
// Carbon:
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 constructs `Slice` from `Array`.
PrintTotalArea(circles);
return 0;
}
Carbon 코드를 마이그레이션하면
// C++ code used in both Carbon and C++:
struct Circle {
float r;
};
// Carbon exposing a function for C++:
package Geometry api;
import Cpp library "circle.h";
import Math;
fn PrintTotalArea(circles: Slice(Cpp.Circle)) {
var area: f32 = 0;
for (c: Cpp.Circle in circles) {
area += Math.Pi * c.r * c.r;
}
Print("Total area: {0}", area);
}
// C++ calling Carbon:
#include <vector>
#include "circle.h"
#include "geometry.carbon.h"
auto main(int argc, char** argv) -> int {
std::vector<Circle> circles = {{1.0}, {2.0}};
// Carbon's `Slice` supports implicit construction from `std::vector`,
// similar to `std::span`.
Geometry::PrintTotalArea(circles);
return 0;
}
이런 형태로 코드가 완성된다. 즉 기존에 작성된 C++ 코드를 Carbon 코드로 대체하기보단 Carbon에서 C++ 라이브러리에 직접적으로 접근하여 두 코드를 마이그레이션하는데 집중하고 있다. 이미 방대해진 C++를 대체하지 않고 이렇게 상호 운용하는 것은 앞으로의 프로그래밍 언어를 크게 발전시킬 것으로 생각한다.
마무리하며 #
Carbon을 정상적으로 사용하기 위해선 적어도 1년 이상은 걸릴 것이다. 지금 당장 사용하기엔 당연히 무리가 있고, 정식적으로 출시한다고 해도 기존의 잘 구현된 Rust, Swift, Go 언어들을 대체할 수 있을지도 아직까진 알 수 없다. 그래도 Carbon을 만들기 위해 Carbon 팀은 노력하고 있으며 다른 개발자들도 이를 많이 기대하고 있다. 오로지 개발자를 위해서 탄생한 언어인 Carbon은 변화하고 있는 프로그래밍 세계에 더 큰 변화를 줄 것이다.