러스트의 새 프로젝트 목표, Immobile 타입과 보장된 소멸자

러스트 프로젝트가 2026년 목표로 Move와 Forget이라는 새 트레이트 도입을 승인했습니다. Pin에 의존해 온 자기참조 타입 표현 방식을 근본적으로 바꾸는 제안입니다.

Move·Forget 제안이 타입에 이동과 소멸 가능 여부를 표시하고 컴파일러·RFC·리눅스 커널에서 검증되는 과정을 요약한 도식
Move와 Forget은 이동·소멸 가능 여부를 타입 속성으로 드러내려는 2026~2027 프로젝트 목표다.

러스트 프로젝트가 2026년 프로젝트 목표 중 하나로 Move와 Forget이라는 새 트레이트 도입을 승인했다. rust-lang/rust-project-goals 저장소에 올라온 2026/move-trait.md 문서에 따르면, 담당자는 컴파일러 팀의 @lcnr이고 상태는 이미 "Accepted"이다. 목표는 타입이 "이동 가능하다"거나 "소멸자 없이 버려질 수 있다"는, 지금까지 러스트가 모든 타입에 당연하게 적용해 온 두 가정에서 벗어날 수 있게 하는 것이다. 작업 기간은 2026년부터 2027년까지로 잡혀 있고, lang팀과 types팀 모두 "Large" 수준의 지원을 확정했다.

Pin은 왜 지금 문제가 되나

러스트는 지금까지 값을 메모리에서 옮기는 이동(move)과 소멸자를 건너뛰는 mem::forget을 모든 타입에서 안전하다고 가정했다. 그런데 비동기 퓨처처럼 자기 자신을 참조하는(self-referential) 타입은 안전하게 이동시킬 수 없다. 현재 해법인 Pin은 이동 불가라는 성질을 타입이 아니라 "그 값이 놓인 자리"에 붙인다. 문서는 이 방식이 리눅스 커널처럼 자기참조 구조체를 많이 쓰는 환경에서 안전한 초기화를 특히 어렵게 만든다고 지적한다. rust-for-linux.com에 정리된 "The Safe Pinned Initialization Problem" 글이 그 구체적인 어려움을 다룬다.

Pin과 Move 트레이트가 이동 불가를 표현하는 방식을 항목별로 비교한 표
이동 불가라는 성질을 장소가 아니라 타입에 붙이는 것이 Move 트레이트 제안의 핵심이다.

Move 트레이트는 정확히 무엇을 바꾸나

제안의 핵심은 이동 불가 여부를 장소가 아니라 타입 자체의 속성으로 옮기는 것이다. 문서에 실린 선언은 #[lang = "move"] unsafe auto trait Move {} 형태다. 어떤 타입이 !Move를 구현하면 그 값은 존재하는 동안 주소가 절대 바뀌지 않아야 한다. 이렇게 하면 &pin mut self 같은 새 문법을 언어에 추가하지 않고도 자기참조 타입을 표현할 수 있다. 이 접근은 2025년에 진행된 Sized 트레이트 계층 작업과 같은 패턴을 따릅니다. 그 작업이 "모든 타입은 컴파일 시점에 크기를 알 수 있다"는 가정을 완화해 스케일러블 벡터를 지원했던 것처럼, 이번 목표는 "모든 타입은 이동 가능하다"는 가정을 완화한다. !Move 타입을 생성하는 구체적인 방법은 별도로 진행 중인 in-place-init 관련 작업에 의존한다.

왜 소멸자 실행을 강제해야 하나

두 번째 갈래는 소멸자를 강제하는 Forget 트레이트다. 지금은 mem::forget이 어떤 타입에도 안전하게 적용되기 때문에, 커밋(commit)이나 롤백(rollback)을 반드시 거쳐야 하는 트랜잭션 타입, 또는 스코프를 벗어나기 전에 반드시 조인(join)해야 하는 스코프드 태스크 핸들 같은 타입도 소멸자 실행을 보장받지 못한다. 문서가 든 예시는 unsafe impl !Forget for ScopedTaskHandle {}이다. 핸들이 !Forget이면 mem::forget 호출 자체가 막히므로, 핸들의 소멸자가 부모 스코프가 끝나기 전에 반드시 실행되어 태스크를 조인한다. 지금 안전한 러스트에서는 만들 수 없는 비동기용 안전한 스코프드 스폰(scoped spawn)이 이 방식으로 가능해집니다.

핸들을 mem::forget으로 건너뛸 수 있는 현재 방식과 !Forget으로 소멸자 실행을 강제하는 제안 방식을 비교한 도식
!Forget은 소멸자 실행을 타입 수준에서 강제해 안전한 scoped spawn을 가능하게 한다.

올해 실제로 진행되는 작업은 무엇인가

Move 트레이트 갈래는 컴파일러 구현(@lcnr, @nia-e), RFC 작성(@yoshuawuyts), 리눅스 커널에서의 실증(@BennoLossin), Iterator와 !Move의 상호작용 검증(@yoshuawuyts) 네 가지 작업으로 나뉜다. 리눅스 커널 검증은 자기참조 자료구조를 많이 쓰는 실제 대규모 사용자를 대상으로 이 설계가 통하는지 확인하는 절차이다. 보장된 소멸자 갈래는 아직 트레이트 계층과 기존 기능과의 상호작용을 탐색하는 설계 단계(@nikomatsakis)에 머물러 있어, Move보다 진행 속도가 느리다.

2026~2027년 Move 트레이트와 보장된 소멸자 작업 항목을 담당자별로 정리한 표
Move 트레이트 갈래는 네 가지 작업으로 나뉘고, 보장된 소멸자 갈래는 아직 설계 탐색 단계다.

Future 트레이트는 왜 이번 범위에서 빠졌나

문서는 올해 범위에서 명시적으로 제외한 것도 밝힌다. Future는 안정화된 트레이트 중 유일하게 Pin에 의존하는 트레이트라서, Move로 옮기려면 별도의 마이그레이션 경로가 필요하다. 게다가 Pin 의존은 Future가 가진 여러 한계 중 하나일 뿐이라, 담당자들은 Future 자체를 고치는 일을 이번 목표와 분리된 독립 프로젝트로 다루기로 했다. 또한 이 작업은 2025년 하반기부터 진행되던 "Pin 인체공학(pin ergonomics)" 구상과 경쟁 관계에 있다. 문서는 &pin 같은 새 문법을 추가해 Pin을 계속 쓰는 방향 대신, Pin 자체를 장기적으로 폐기하는 쪽을 명시적 목표로 제시한다. 러스트가 영원한 하위 호환을 약속하는 언어인 만큼, pin을 &나 mut처럼 문법 차원에 새로 박아 넣는 결정은 향후 계속 짊어져야 할 부담이라는 것이 그 이유다.

출처: rust-lang/rust-project-goals, src/2026/move-trait.md