'언젠가 읽기' 컨텐츠는 논문이나 영문 컨텐츠 등 언젠가 읽으려고 즐겨찾기 하고선
읽지 않고 계속 미룰만한 컨텐츠를 읽고 요약하거나 소개합니다.
Rust, C++ 및 Hylo에서의 이동 의미론
Move Semantics in Rust, C++, and Hylo
동기
Hylo의 기본 설계를 소개한 "Borrow Checking Hylo"라는 논문을 읽었다. Hylo는 초기 단계의 프로그래밍 언어로, C++의 대안이면서도 Rust처럼 메모리 안전성을 제공한다. 특히, Rust의 대여 검사(borrow checking) 아이디어를 이동 가능 값 의미론(Movable Value Semantics, MVS)과 선형 타입(Linear Types, LT)의 프레임워크에 통합했다.
C++, Rust, Hylo의 차이점을 하나의 예제를 통해 설명하고자 한다.
예제
다음과 같은 상황을 구성한다:
-
Person 이라는 이름과 나이 속성을 가진 레코드를 정의한다.
-
Dave 라는 이름의 사람 객체를 생성한다.
-
이 사람 객체를 show 함수에 전달한다.
이때 다음 질문을 고려한다:
-
Dave 를 show 에 전달할 때, 객체의 복사본이 생성되는가?
-
만약 그렇다면, 복사본 생성을 어떻게 피할 수 있는가?
-
복사본이 아닌 유일한 Dave 를 show 에 전달한 후에도 Dave 를 사용할 수 있는가?
C++에서의 상황
C++에서는 객체를 함수에 값으로 전달하면 복사본이 생성된다. 이는 큰 객체일 경우 성능에 영향을 줄 수 있다. 복사본 생성 여부를 확인하기 위해 복사 생성자를 정의하여 복사 시 출력하도록 할 수 있다.
복사본 생성을 피하려면 다음과 같은 방법을 사용한다:
-
참조 전달 : 함수 매개변수를 Person& person 으로 선언하여 객체를 복사하지 않고 참조를 전달한다.
-
상수 참조 전달 : 수정되지 않는 객체는 const Person& person 으로 선언하여 안전하게 참조를 전달한다.
이렇게 하면 객체의 복사 없이 함수에 전달할 수 있으며, 함수 호출 후에도 원본 객체를 계속 사용할 수 있다.
Rust에서의 상황
Rust에서는 기본적으로 함수에 객체를 전달하면 소유권이 이동(move)된다. 따라서 함수 호출 후 원본 객체를 더 이상 사용할 수 없으며, 사용하려면 컴파일 오류가 발생한다. 이는 메모리 안전성을 보장하기 위한 Rust의 소유권 시스템 때문이다.
복사본 생성 없이 객체를 함수에 전달하면서 원본 객체를 계속 사용하려면:
-
객체 복제 : clone() 메서드를 사용하여 객체의 복사본을 생성한 뒤 함수에 전달한다.
-
대여(Borrow) : 함수 매개변수를 참조로 선언하고, 호출 시 & 를 사용하여 객체를 대여한다.
대여를 사용하면 소유권을 이동하지 않고도 객체를 함수에 전달할 수 있으며, 호출 후에도 원본 객체를 사용할 수 있다. Rust의 대여 검사기는 이러한 대여 관계를 추적하여 메모리 안전성을 보장한다.
Hylo에서의 상황
Hylo는 이동 가능 값 의미론과 선형 타입을 결합하여 메모리 안전성을 제공한다. 여기서 중요한 개념은 다음과 같다:
-
sink 매개변수 : 함수 매개변수를 sink 로 선언하면 객체의 소유권이 함수로 이동하며, 함수 호출 후 원본 객체를 사용할 수 없다.
-
복사 가능성 : 객체를 Copyable 로 선언하여 복사할 수 있도록 한다.
-
기본 전달 방식 : 매개변수를 특별한 키워드 없이 전달하면 기본적으로 복사가 발생한다.
원본 객체를 함수 호출 후에도 사용하려면:
-
객체를 Copyable 로 선언하여 복사본을 생성하여 전달한다.
-
매개변수를 let 으로 전달하여 복사가 일어나도록 한다.
Hylo에서는 개발자가 객체의 소유권과 복사 여부를 명시적으로 관리하여 메모리 안전성을 유지하면서도 효율적인 코드 작성을 가능하게 한다.
결론
C++, Rust, Hylo 모두 함수에 객체를 전달할 때 복사 여부와 소유권 이동에 대한 각기 다른 접근 방식을 취한다. 이는 메모리 안전성과 성능 최적화를 위한 것으로, 개발자는 각 언어의 특성을 이해하고 적절히 활용해야 한다.
참고 자료
-
"Borrow Checking Hylo"
-
"The Rust Programming Language"
-
"Effective Modern C++"