TECH 으로 돌아가기
TECH HACKER NEWS 오늘 5분 읽기 31 READS

러스트 대여 검사기의 새 접근법: 지역을 '대여의 집합'으로 다시 정의하다

러스트(Rust)가 다른 시스템 프로그래밍 언어와 구별되는 핵심은 컴파일 시점에 메모리 안전성을 보장하는 대여 검사기(borrow checker)다. 러스트 개발팀의 니코 마차키스(Niko Matsakis)는 2018년, 당시 진행 중이던 NLL(Non-Lexical Lifetimes) 제안의 한계를 극복하기 위해 대여 검사기를 완전히 다른 방식으로 다시 정식화하는 실험을 공개했다. 흥미롭게도 이 글이 나온 시점은 대여 검사가 처음 커밋된 지 정확히 6년이 되던 날이었는데, 6년 사이에 러스트의 안전성 모델이 얼마나 정교해졌는지를 보여주는 상징적인 순간이기도 하다.

사용자에게는 같지만 컴파일러에게는 다른 모델

가장 먼저 짚어둘 점은, 이 새로운 정식화가 러스트를 실제로 사용하는 개발자 입장에서는 아무런 차이를 만들지 않는다는 것이다. 대여 검사기는 기존 NLL 제안과 사실상 동일하게 동작하며, 컴파일이 되던 코드는 그대로 되고 거부되던 코드도 그대로 거부된다. 달라지는 것은 컴파일러가 프로그램을 '어떻게 사고하는가'다. 이 내부 모델의 변화는 지금 당장은 눈에 보이지 않지만, 앞으로 도입될 언어 기능의 설계 여지에 영향을 줄 수 있다는 점에서 실무자가 주목할 만하다.

핵심 발상은 참조 타입 &'a i32에서 수명(lifetime) 'a의 의미 자체를 바꾸는 데 있다. 기존 NLL은 'a를 제어 흐름 그래프상의 '지점(program point)들의 집합'으로 보았지만, 새 모델은 'a를 '대여(loan)의 집합'으로 정의한다. 즉 어떤 참조가 프로그램 어느 위치에서 살아 있는지가 아니라, 그 참조가 어떤 대여로부터 파생된 데이터를 가리킬 수 있는지를 추적한다. 예를 들어 어떤 지역이 두 개의 대여 L0, L1에서 나온 데이터를 참조할 수 있다면 그 지역은 집합 {L0, L1}에 대응한다.

하위 집합 관계와 대여의 무효화

이렇게 지역의 의미가 바뀌면 참조의 서브타이핑 규칙도 달라진다. 지점 기반 모델에서는 수명을 '짧게' 만들어 참조를 근사했지만, 대여 집합 모델에서는 반대로 집합을 '넓혀서' 근사한다. 러스트 문법의 'a: 'b(전통적으로 'outlives' 관계라 부르던 것)를 저자는 이 새 의미에 맞게 '부분집합(subset) 관계'라 부른다. 대여에는 각기 지켜야 할 조건이 있는데, 이를 어기는 것이 곧 '무효화(invalidation)'다. r = &mut v 같은 가변 대여가 있으면 값 v는 오직 r을 통해서만 접근해야 하며, v를 직접 읽거나 쓰거나 이동시키면 대여가 무효화된다. p = &x 같은 공유 대여라면 읽기는 허용되지만 쓰기나 변경은 조건 위반이 된다.

분석은 실제로 MIR(러스트 중간 표현) 위에서 수행되며, 저자는 이를 Datalog 규칙으로 기술한다. Datalog는 효율적 실행을 위해 설계된 Prolog의 부분집합으로, 유한한 사실 집합에 대해 항상 종료가 보장되고 부정 순환을 허용하지 않아 '논리적 부정'과 '실패에 의한 부정'의 미묘한 문제에서 자유롭다. 저자는 각 지역을 '0, '1 같은 번호가 붙은 추상 지역 변수로 표현하고, 타입 검사 과정에서 발생하는 부분집합 요구를 base_subset이라는 입력 사실로 수집한다. 이 관계들은 제어 흐름 그래프의 간선을 따라 전파되며 이행적으로 누적되는데, 그 결과 프로그램 안의 데이터 흐름이 지역 변수들 사이의 관계로 자연스럽게 드러난다.

대여 의존성을 흐름을 따라 추적하기

부분집합 관계가 지역 변수 간의 구조를 잡아준다면, 그다음 단계는 어떤 지역이 어떤 대여에 의존하는지를 추적하는 것이다. 이를 위해 borrow_region 입력이 각 대여 표현식(&x, &mut v 등)마다 정의되고, requires 관계가 '지역 R이 지점 P에서 대여 L의 조건 준수를 요구한다'는 사실을 표현한다. 여기에 지역의 '생존성(liveness)' 개념이 결합된다. 어떤 지역 'a는 그 타입을 가진 참조가 이후에 역참조될 수 있을 때 살아 있다고 본다. 다만 소멸자(drop) 처리에는 미묘함이 있어서, 예컨대 Vec

SOURCE · HACKER NEWS
원문 전체 보기 → https://smallcultfollowing.com/babysteps/blog/2018/04/27/an-...
SHARE
처리 중...