러스트, Move·Forget 트레이트로 Pin 없는 불변 타입과 확정 소멸자 도입 추진
- 러스트 프로젝트가 2026~2027년 목표로 Move와 Forget 트레이트를 새로 도입해 타입이 이동(move)이나 mem::forget을 거부할 수 있게 만듦
- 기존에는 모든 타입이 이동 가능하고 forget 가능하다는 전제가 언어에 박혀 있었는데, 이 전제를 깨서 Pin 없이도 자기참조(self-referential) 타입을 안전하게 다룰 수 있게 함
- 이 변화로 scoped async spawn이 가능해져 tokio::spawn처럼 부모 스코프의 데이터를 async 작업이 안전하게 빌려 쓰는 구조적 동시성을 지원함
- Sized 계층 작업의 선례를 따라 컴파일러 MVP 구현과 RFC 작성을 진행하고 리눅스 커널에서 실제 검증까지 계획함
- 담당자는 lcnr, lang 챔피언은 jackh726이며 트래킹 이슈는 rust-lang/rust#149607, 아직 확정된 언어 변경이 아닌 project goal 단계임
Hacker News 의견들
비동기 러스트 안 써봤는데 이게 정확히 뭘 가능하게 해주는건지 모르겠음
재귀 async 함수 짜기 쉬워지고, async 함수가 바깥 스코프에서 클론 안 하고 그냥 빌려쓸 수 있게 됨. 다 인체공학적이고 좋은 변화임
진짜 핵심은 구조적 동시성(structured concurrency)임. 지금 러스트는 스코프드 스레드가 있어서 함수 리턴 전에 스레드가 반드시 끝난다는 보장이 있는데, async task는 그런 보장이 아예 없음. future는 그냥 상태 머신 객체라 취소당하기 쉽고 끝까지 실행된다는 보장도 없음
새로 뭘 추가하는게 아니라 원래 되어야 했던 걸 되게 하는거임. tokio::spawn이 어색한 이유가 바로 이거고, Pin은 안전을 보장한다기보다 그냥 '조심해' 표지판에 가까움
이거 그냥 대수적 효과(algebraic effect) 또 갖다 붙이는거 아니냐
아니다, 이건 함수의 속성이 아니라 타입 자체의 속성이라 async나 const 같은 것들이랑은 결이 다름
mem::forget 말고도 참조 순환으로 안전하게 leak 가능한데 컴파일러가 그걸 못 잡지 않냐, 그래서 mem::forget이 안전하다고 치는건데 이건 어떻게 우회하냐
Sized 트레이트 처리했던 것처럼 제네릭 파라미터에 Forget 바운드를 자동으로 걸고, 필요 없는 메서드만 옵트아웃하게 함. 기존 코드는 그대로 컴파일되고 unsafe 코드도 안전성 안 깨짐. Arc가 T: Sync 없으면 Send를 구현 안 하듯이 참조카운트 스마트포인터가 pointee에 Forget을 요구하게 만들면 됨
2016년부터 불변 타입이 러스트에 빠진 핵심 조각이란 게 명백했는데, 다 깨뜨리지 않고는 못 넣는다고 여겨져서 Pin이란 땜빵으로 버텨왔음. 드디어 방법을 찾아서 기쁨
근데 이거 기존 Pin 쓰는 코드랑 통합되냐? 안되면 생태계가 더 쪼개질텐데
목표에는 안 들어있지만 !Destruct(must-move 타입, 선형 타입) 얘기도 나옴. 값을 그냥 버릴 수 없고 반드시 인자를 받는 함수를 호출해야 없앨 수 있는 타입임. 트랜잭션 API에서 commit()이나 rollback() 둘 중 하나를 강제로 부르게 만들 수 있어서 좋음. 지금은 Drop에서 조용히 롤백하거나 패닉치는 것밖에 선택지가 없음
선형 타입을 기본 컬렉션이랑 타입에 통합하려면 일이 엄청 많음. Mojo에서 하는 거 보면 러스트는 이미 stable이라 같은 수준으로는 못 할 것 같음
withoutboats가 제안한 pinned places라는 다른 접근도 있는데, 불변성을 타입이 아니라 place/reference의 속성으로 두는 방식임. 이번 목표는 그거 대신 yoshuawuyts의 불변 타입 제안을 택한거냐
이 작업은 2025H2 Pin ergonomics 실험 목표의 대안이라고 명시돼 있음. &pin x 같은 새 아이템이나 Drop 트레이트 원오프 오버로드를 다루던 그 목표 대신 이걸로 가는거임
컨텍스트 모르는 사람들 위해 말하면 이건 아직 확정된 언어 변경이 아니라 프로젝트 목표일 뿐임. 작업하기로 합의된거지 디자인이 바뀌거나 아예 엎어질 수도 있음