원문 캡처 · verdagon.dev
원문 캡처 · verdagon.dev

Valen의 빌림 검사기는 함수의 마지막 문장에서 시작해 위쪽으로 거슬러 올라가며 메모리 안전성을 확인한다. 제작자 이반 오바디아(Evan Ovadia)는 이 역방향 검사가 변수의 마지막 사용 시점과 반복문에서의 참조 유효성을 다루기 편하다고 설명하지만, 속도 향상은 아직 벤치마크로 확인하지 않았다.

Valen은 공유 참조와 변경 가능한 참조를 함께 허용하면서 메모리 안전성을 검사하는 실험적 프로그래밍 언어다. 현재 검사기는 아직 완성되지 않았고, 여러 기능에 빈틈이 있으며 예외적인 동작도 남아 있다. 오바디아는 v0.1이 나올 예정인 2월까지 이런 문제가 계속될 수 있다고 밝혔다. Valen 저장소에서 프로젝트를 확인할 수 있다.

검사 과정은 네 단계로 이뤄진다. 소스 코드를 구문 트리로 바꾸고, 변수와 표현식의 유형을 정한 뒤, 각 참조가 어떤 변수나 변수의 일부를 가리키는지 알아낸다. 마지막 단계에서 참조가 무효화된 뒤에도 사용되는지 검사한다. 앞의 세 단계와 달리 마지막 단계는 함수 끝에서 시작해 역방향으로 진행한다.

검사기는 역방향으로 코드를 훑으면서 사용된 변수는 pending 목록에 넣고, 선언을 만나면 목록에서 뺀다. 변수에 영향을 줄 수 있는 변경을 만나면 pending에 남은 참조가 무효화되는지 확인한다. 예를 들어 배열의 원소를 가리키는 참조를 만든 뒤 배열을 변경하고 그 참조를 사용하면, 변경 지점에서 오류를 낸다.

반복문을 처리할 때는 반복문 안에서 일어난 변경과 다시 유효해진 참조를 따로 추적한다. 반복문 뒤쪽에서 참조가 다시 설정되는 경우, 앞선 반복에서 그 참조가 무효화될 수 있는지를 반복문 시작점에서 확인한다. 오바디아는 이 방법으로 반복문 안의 참조 유효성을 판별하는 과정을 설명했다.

오바디아가 역방향 검사를 택한 이유는 마지막 사용 지점을 찾기 쉽고, 반복문에서 참조가 다시 설정되는 경우를 처리하기 편하며, 처리 속도도 더 빠를 수 있다고 보기 때문이다. 다만 속도 주장은 아직 벤치마크하지 않았으며, 변경 작업 때 pending 목록을 확인해야 하므로 알고리즘이 O(n)이라고 단정할 수는 없다고 덧붙였다.

현재 Valen은 Rust처럼 함수 곳곳의 정보를 모아 참조의 수명을 추론하지 않는다. 오바디아는 이후 유형 추론 단계를 전체 정보를 푸는 방식으로 바꾸더라도, 안전성 검사의 역방향 진행은 유지할 수 있다고 봤다. 제어 흐름 중단, 연관 그룹, 클로저 등도 아직 추가해야 한다고 밝혔다.

Valen의 역방향 빌림 검사에 대한 원문 설명과 Valen의 그룹 빌림 소개를 참고할 수 있다.