자동 메모리 관리

전통적으로, 두 종류의 프로그래밍 언어가 있습니다:

  • 메모리 관리가 프로그래머의 완전한 통제하에 있지만 수동(그래서 안전하지 않을 수 있는)인 언어: C, C++, Pascal, ...
    • 프로그래머가 힙 메모리를 할당하거나 확보할 시기를 결정합니다.
    • 프로그래머는 포인터가 여전히 유효한 메모리를 가리키는지 확인해야 합니다.
    • 연구 결과에 따르면 프로그래머도 실수합니다.
  • 메모리 관리가 런타임에 의해 되므로 안전하지만 자동(그래서 프로그래머가 개입할 여지가 적거나 없는)인 언어: Java, Python, Go, Haskell, ...
    • 런타임 시스템은 메모리를 더 이상 참조할 수 없을 때까지 해제되지 않도록 합니다.
    • 일반적으로 참조 계산, 가비지 컬렉션 또는 RAII로 구현됩니다.

러스트는 이 둘을 혼합한 새로운 형태의 메모리 관리 기법을 제공합니다:

컴파일 시 올바른 메모리 관리를 강제함으로써 완전한 통제와 안전성 모두 제공.

이를 가능하게 하는 러스트의 컨셉은 명시적인 소유권입니다.

This slide should take about 10 minutes.

이 슬라이드는 다른 언어를 사용하는 학생들이 맥락에 따라 Rust를 사용하는 데 도움을 주기 위해 작성되었습니다.

  • C는 mallocfree를 사용하여 힙을 수동으로 관리해야 합니다. 일반적인 오류로는 free 호출을 잊어버리거나, 동일한 포인터에 대해 여러 번 호출하거나, 포인터가 가리키는 메모리가 해제된 후 포인터를 역참조하는 것 등이 있습니다.

  • C++에는 함수가 반환될 때 메모리가 해제되도록 소멸자를 호출하는 것에 관한 언어 보장을 활용하는 스마트 포인터(unique_ptr, shared_ptr)와 같은 도구가 있습니다. 이러한 도구를 오용하여 C와 유사한 버그를 생성하는 것은 여전히 매우 쉽습니다.

  • Java, Go, Python은 가비지 컬렉터를 사용해 더 이상 연결할 수 없는 메모리를 식별하고 삭제합니다. 이렇게 하면 모든 포인터가 역참조될 수 있으므로 use-after-free 및 기타 클래스의 버그를 제거할 수 있습니다. 하지만 GC는 런타임 비용이 발생하며 제대로 조정하기가 어렵습니다.

Rust의 소유권 및 빌림 모델은 대부분의 경우 정확히 필요한 곳에 alloc 및 free 작업을 실행하여 C의 성능을 얻을 수 있습니다. 즉, 비용이 들지 않습니다. C++의 스마트 포인터와 유사한 도구도 제공합니다. 필요한 경우 참조 계산과 같은 다른 옵션을 사용할 수 있으며, 서드 파티 크레이트를 사용하여 런타임 가비지 컬렉션을 지원할 수도 있습니다(이 클래스에서는 다루지 않음).