부록 E: 에디션
부록 E: 에디션 (Editions)
1장에서 cargo new가 여러분의 Cargo.toml 파일에 에디션(edition)에 관한 메타데이터 한 줄을 넣어 두는 걸 보셨을 거예요. 이 부록은 그게 정확히 무슨 뜻인지 다뤄볼게요.
출처: Rust 공식문서
본문
Rust 언어와 컴파일러는 6주 배포 주기(six-week release cycle)를 갖고 있어요. 덕분에 사용자들은 끊임없이 새 기능을 받아보죠. 다른 프로그래밍 언어들은 큰 변화를 드물게 내놓는 편인데, Rust는 작은 업데이트를 자주 내놓는 쪽이에요. 이런 작은 변화들이 쌓이고 쌓이다 보면 어느 순간 갑자기 커져 있죠. 그런데 배포 단위 하나하나만 들여다보면 "와, Rust 1.10과 Rust 1.31 사이에 이렇게 많이 바뀌었구나" 하고 뒤를 돌아보기 어려울 때가 있어요.
그래서 Rust 팀은 3년쯤마다 새로운 Rust 에디션(edition) 을 만들어요. 각 에디션은 그동안 쌓인 기능들을 완전히 갱신된 문서와 도구와 함께 하나의 명확한 패키지로 묶어 줘요. 새 에디션도 보통 6주 배포 과정의 일부로 함께 배포됩니다.
에디션은 사람마다 다른 의미를 갖고 있어요:
- 이미 Rust를 쓰고 있는 사용자에게는, 누적된 변화들을 이해하기 쉬운 하나의 패키지로 모아주는 역할이에요.
- 아직 Rust를 안 써본 분에게는, 주요한 발전이 있었다는 신호로 보여서 Rust를 다시 한번 살펴볼 만하게 만들어 주죠.
- Rust를 개발하는 사람들에게는, 프로젝트 전체가 함께 모이는 구심점을 제공해 줘요.
이 글을 쓰는 시점 기준으로는 4가지 Rust 에디션이 있어요: Rust 2015, Rust 2018, Rust 2021, Rust 2024. 이 책은 Rust 2024 에디션 관용구(idioms)로 작성됐어요.
Cargo.toml 안의 edition 키는 컴파일러가 여러분의 코드에 어떤 에디션을 써야 하는지를 나타내요. 이 키가 없으면 Rust는 하위 호환성(backward compatibility)을 위해 에디션 값을 2015로 사용합니다.
각 프로젝트는 기본인 2015 에디션 대신 다른 에디션을 선택할 수 있어요. 에디션에는 호환되지 않는 변화가 포함될 수 있지요. 예를 들어 코드에 있는 식별자(identifier)와 충돌하는 새 키워드가 추가되는 경우가 그렇죠. 하지만 여러분이 그 변화를 선택해서 받아들이지 않는 한, 사용하는 Rust 컴파일러 버전을 올려도 여러분의 코드는 계속 컴파일됩니다.
모든 Rust 컴파일러 버전은 해당 컴파일러가 출시되기 전에 존재했던 어떤 에디션이든 다 지원해요. 그리고 지원되는 어떤 에디션의 크레이트(crate)든 서로 연결(link)할 수 있죠. 에디션 변화는 컴파일러가 코드를 처음 파싱(parsing)하는 방식에만 영향을 줘요. 그래서 여러분이 Rust 2015를 쓰고 있고, 어느 의존성이 Rust 2018을 쓴다 해도 그 프로젝트는 컴파일되고 의존성도 잘 사용할 수 있어요. 반대 상황, 즉 프로젝트가 Rust 2018이고 의존성이 Rust 2015인 경우도 마찬가지로 잘 동작해요.
분명히 짚고 넘어갈게요: 대부분의 기능은 모든 에디션에서 사용 가능해요. 어느 에디션을 쓰든 개발자들은 새 안정 버전이 나올 때마다 계속 개선된 점을 확인할 수 있어요. 다만 어떤 경우, 주로 새 키워드가 추가될 때, 일부 새 기능은 뒤에 나온 에디션에서만 쓸 수 있을 수 있어요. 그런 기능을 활용하고 싶다면 에디션을 바꿔야 합니다.
더 알아보기
더 자세한 내용은 The Rust Edition Guide를 참고하세요. 이 안내서에는 에디션 간 차이가 낱낱이 정리되어 있고, cargo fix를 통해 코드를 새 에디션으로 자동 업그레이드하는 방법도 설명되어 있어요.