Rust 프로젝트 목표: 이동 불가 타입과 소멸자 실행 보장
요약
Rust 언어의 핵심 전제인 '모든 값은 이동 가능하고 잊힐 수 있다'는 점을 완화하기 위한 새로운 프로젝트가 승인되었습니다. Move, Destruct, Forget 트레이트를 도입하여 타입 수준에서 이동 불가와 소멸자 실행 보장을 명시함으로써 Pin의 복잡성을 줄이고 안전한 비동기 프로그래밍을 지향합니다.
핵심 포인트
- Move, Destruct, Forget 자동 트레이트 도입을 통한 타입 역량 명시
- !Move 타입을 통해 Pin의 복잡성을 줄이고 안정된 주소 유지 보장
- !Forget 타입을 통해 소멸자 실행을 보장하여 안전한 비동기 패턴 지원
- Linux 커널 및 자기 참조 자료구조에서의 설계 검증 계획
- 모든 값이 이동되거나
mem::forget
으로 소멸자 실행 없이 잊힐 수 있다는 Rust의 전제를 완화해, 타입이 이동과 망각을 거부할 수 있도록 하는 2026~2027년 프로젝트가 승인됨
- 새로운 자동 트레이트
Move
·Destruct
·Forget
으로 이동, 암묵적 드롭, 망각 가능 여부를 명시하고 각 역량을 계층적으로 부여함
!Move
는 자기 참조 타입의 주소가 생존 기간 내내 고정되도록 하며, 이동 불가를 장소의 속성으로 표현하는 Pin
의 복잡성을 줄이는 대안임
!Forget
은 소멸자 실행을 보장해 작업 핸들의 소멸자가 join을 수행하는 안전한 비동기 범위 지정 spawn 같은 패턴을 가능하게 함
- 컴파일러 MVP와 RFC, Linux 커널 검증, 소멸자 보장 설계에 집중하되
Future
변경과 Pin
마이그레이션은 별도 프로젝트로 남겨둠
프로젝트 목표와 범위
현재 Rust가 가진 두 가지 전제
모든 값은 이동할 수 있음
- Rust는 대입할 때 값을 메모리의 다른 위치로 이동할 수 있다고 가정함
- 많은 비동기 future가
자기 참조 구조를 필요로 하지만, 자기 참조 타입은 안전하게 이동할 수 없음 - 현재의
Pin
은 이동 불가를 타입이 아닌 장소(place)의 속성으로 표현해 상당한 복잡성을 유발함
- The Safe Pinned Initialization Problem은 Linux 커널 같은 시스템에서
Pin
으로 자기 참조 타입을 안전하게 표현하기 어려운 문제를 다룸
모든 값은 잊힐 수 있음
- 안전한 함수인
mem::forget
은 소멸자를 실행하지 않고 값을 잊을 수 있어, Rust는 특정 타입의 소멸자 실행을 보장할 수 없음
Transaction
은 정리 전에 commit()
또는 rollback()
을 요구할 수 있고, 범위 지정 작업 핸들은 범위를 벗어나기 전에 작업을 join해야 할 수 있음
- 비동기 범위 지정 spawn에서 생성된 작업이 부모 범위의 값을 빌렸다면, 핸들을 잊는 순간 작업이 범위보다 오래 살아남아
댕글링 참조에 접근할 수 있음
역량을 명시하는 트레이트 계층
- 타입에 허용된 연산을 긍정적인 역량으로 나타내는 새로운
자동 트레이트를 도입함
Move
: 값을 메모리의 다른 위치로 이동할 수 있음
Destruct
: 범위를 벗어날 때 암묵적으로 드롭할 수 있음
Forget
: 소멸자를 실행하지 않고 mem::forget
으로 잊을 수 있음
- 특별한 역량이 없는 타입을 기반으로 두고 필요한 역량을 계층적으로 추가함
- Sized hierarchy가 “모든 타입은 컴파일 타임에 크기를 안다”는 전제를 완화한 것처럼, 같은 방식을 이동과 망각에도 적용함
Move
와 이동 불가 타입
Move
는 이동 가능성을 장소가 아닌 타입의 속성으로 표현함
#[lang = "move"]
unsafe auto trait Move {}
!Move
타입은 이동할 수 없으며, 존재하는 동안 안정된 주소를 유지해야 함
- 자기 참조 타입 자체를 이동 불가로 표시할 수 있어
Pin
보다 단순한 모델을 지향함
!Move
타입 생성은 #t-lang/in-place-init의 제자리 초기화 작업에 의존함
구현과 검증 계획
Move
컴파일러 구현은 @lcnr
와 @nia-e
가 담당함
Move
RFC는 @yoshuawuyts
가 작성함
@BennoLossin
은 자기 참조 자료구조를 많이 사용하는 Rust for Linux에서 설계를 시험함
Iterator
와 !Move
의 상호작용도 검증함
- 생성기 기반 효과가
impl Trait + !Move
로 디슈거링돼 자기 참조를 지원할 수 있는지 입증하는 것이 목적임
Forget
과 소멸자 실행 보장
!Forget
은 타입이 mem::forget
으로 잊히는 것을 금지해 소멸자 실행을 보장함
unsafe impl !Forget for ScopedTaskHandle {}
- 안전한 범위 지정 spawn은 생성된 핸들의 소멸자가 작업을 join하는 구조를 사용할 수 있음
- 핸들을 잊을 수 있다면 작업이 부모 범위보다 오래 살아남을 수 있음
- 핸들이
!Forget
이면 소멸자와 join 실행이 보장돼 이 패턴을 안전하게 만들 수 있음
- 보장된 소멸자의 구체적인 트레이트 계층과 기존 기능의 상호작용은
@nikomatsakis
가 탐색함
Move
가 반드시 Destruct
의 상위 트레이트여야 하는 것은 아님
- 정리가 필요하지만 이동할 수 없는
자기 참조 타입처럼 드롭 가능성과 이동 가능성을 분리해야 하는 사례가 있음
Future
변경은 별도 과제
Future
트레이트 변경이나 갱신은 올해 범위에서 명시적으로 제외됨
Future
는 안정화된 Rust 트레이트 중 Pin
에 의존하는 유일한 트레이트이므로, Move
를 사용하려면 마이그레이션 방안이 필요함
Pin
의존성 외에도 waker 할당 문제와 generator 자동 트레이트 문제를 비롯한 여러 문제가 있어, Future
수정은 독립 프로젝트로 취급함
Pin ergonomics 프로젝트를 대체하는 접근
- 이번 작업은 Project Goal 2025H2: Continue Experimentation with Pin Ergonomics를 보완하는 대신
대체하는 방향임 - Pin ergonomics 구상에는 다음 언어 확장이 포함됨
- lvalue의 새
pin
항목 계열인 &pin x
, &pin mut x
, &pin const x
fn drop(&pin mut self)
형태의 Drop
트레이트 전용 오버로드
- 패턴의 새
pin
항목인 &pin <pat>
- 이 확장만으로는 Pin의 중복 정의 문제를 해결하지 못해 기존 트레이트마다
Trait
와 PinnedTrait
변형이 생김
Drop
은 일회성 특수 오버로드를 제안하므로 예외임
- 언어를 바꿔
Pin
을 유지하기보다 이동 불가 타입의 표현 방식을 개선하고, 장기적으로 Pin
전체를 폐기하는 것이 목표임
- Rust는 영구적인 하위 호환성을 약속하므로
pin
을 &
나 mut
같은 언어 항목으로 만들면 계속 지원해야 함
- 장기적으로 폐기하려는 기능을 언어에 영구 편입하지 않도록
Move
를 Pin
의 보완책이 아닌 대안으로 선택함
언어·타입 팀의 지원 요구
[lang]
팀에는 설계를 구체화하기 위한 대규모 지원과 설계 세션이 필요함
[types]
팀에도 구현과 검토를 위한 대규모 지원이 요구됨
관련 설계 자료
AI 자동 생성 콘텐츠
본 콘텐츠는 GeekNews의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기