Rust 1.99.0 발표
요약
Rust 1.99.0 버전 발표와 관련하여, 개발자들이 Rust의 발전 방향과 언어적 변화에 대해 논하고 있습니다. 특히 C/C++의 가변 인자(varargs) 처리 방식과의 비교를 통해 Rust가 추구하는 안정성과 호환성을 강조합니다. Rust는 에디션 시스템을 통해 큰 폭의 버전 차이에도 불구하고 높은 코드 호환성을 유지하며, 개발자들이 새로운 기능을 점진적으로 도입할 수 있도록 돕고 있습니다.
핵심 포인트
- Rust 1.99.0 발표로 가변 인자(varargs) 지원 등 기능 개선 기대.
- C/C++의 varargs와 Rust의 구현 방식 차이를 명확히 이해하는 것이 중요함.
- 에디션 시스템 덕분에 큰 버전 차이에도 높은 코드 호환성을 유지할 수 있음.
- 새로운 기능을 익힐 때는 에디션 문서나 공식 블로그를 참고하는 것이 좋음.
예전에 Rust로 LD_PRELOAD 작업을 할 때 가로채고 싶어도 못 했던 C 함수가 있었는데, 아마 mremap이었던 것 같음. 드디어 가변 인자 지원이 들어와서 반가움.
같은 말을 반복해서 미안하지만, 이 용어는 정말 신경 쓰임. C와 C++을 다루는 컴파일러 개발자들은 오랫동안 varargs와 variadics를 명확히 구분해 왔음. C에는 varargs가, C++에는 variadics가 있으며, C의 varargs는 va_* 등을 사용하는 동적 방식이고 C++의 variadics는 컴파일 시점에 인스턴스화됨.
이 Rust 기능을 C variadics라고 부르면 두 언어의 기능을 모두 깊이 다뤄 온 입장에서는 굉장히 혼란스러움.
C를 안 쓴 지 꽤 됐지만, 가변 인자 함수와 va_list를 받는 함수는 서로 달랐던 것으로 기억함. 특히 가변 인자 함수를 정의하고 그 안에서 va_list를 받는 함수를 호출하는 코드를 많이 봤는데, 둘이 사실 ABI 호환이 되는 건가?
va_list 매개변수는 구현체나 ABI가 정의한 타입의 일반 매개변수임. 따라서 가변 인자 함수 안에서 va_list를 만들어 다른 함수에 전달할 때는 호출 규약상 특별한 처리가 필요하지 않음.
예를 들어 libc의 vprintf·vsprintf·vfprintf가 흔히 그렇듯 vfmt_impl 같은 내부 구현을 공유한다면, 이들이 vfmt_impl을 호출할 때는 해당 구현체가 정의한 타입의 ABI 규칙에 따라 va_list를 일반 매개변수로 넘길 뿐임.
1.100은 굉장한 릴리스가 될 듯함. 오랫동안 기대해 온 사용자 정의 할당자와 never 타입이 모두 들어올 예정임.
Rust를 다시 시작하려는데, 60개 버전을 건너뛴 동안 달라진 내용을 어떻게 따라잡을지 고민 중임.
Rust의 좋은 점 중 하나는 1.39에서 유효했던 코드가 1.99에서도 유효하다는 것임. 원한다면 에디션을 올릴 수 있는데, 마이그레이션 항목은 적고 범위도 명확하며 대부분 자동으로 해결 가능함. 그 외에는 예전에 없던 메서드를 쓰려 할 때 주로 새 버전을 체감함.
추가된 내용을 살펴보고 싶다면 ncameron의 블로그 글을 추천함. https://www.ncameron.org/blog/recent-rust-changes/.
대체로 예전에 있었으면 했던 함수가 이제 생겼는지 확인하면 되고, const fn 은 알아둘 만함. never 타입도 안정화됐던가? 대부분은 기억하는 모습 그대로일 것 같음.
표준 프렐루드를 포함한 언어 차원의 큰 변화는 에디션 문서에 정리되어 있으니 읽어보는 게 좋음. 나머지는 대부분 함수·타입·메서드 추가로, 편리하고 새로운 작업을 가능하게 해 주지만 필요할 때 찾아보거나 사용하는 타입과 모듈을 살펴보며 익혀도 됨.
에디션 차이를 제외하면 1.30에서 쓰던 코드는 1.130에서도 잘 동작할 것임.
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기