파이썬과 러스트의 기본 툴들을 비교한 내용을 표로 함께 살펴볼까요? 파이썬의 경우, pip를 제외한 툴은 일반적으로 별도 설치가 필요합니다. 하지만 러스트는 cargo라는 툴을 통해 대부분의 기능을 바로 사용할 수 있습니다. cargo는 크레이트(crate)라고 하는 패키지를 관리하는 도구이면서, 동시에 소스 코드를 컴파일하고 빌드하는 시스템 빌드 매니저 기능이 있는 빌드 시스템입니다. 표 1-2와 같이 cargo에는 포매터, 린트(lint), 테스트, 문서화, 벤치마크 등의 기능이 내장돼 있습니다. 여기에 플러그인을 설치해서 더 다양하게 cargo를 사용할 수도 있습니다.
--- p.4
매크로는 함수와 비슷하게 사용되지만, 실제로 함수와 비교했을 때 중요한 차이점이 있습니다. 기본적으로 매크로는 ‘다른 코드를 생성하는’ 코드를 작성하는 방법으로, 메타 프로그래밍(meta programming)이라고 합니다. 함수를 정의할 때는 파라미터의 개수와 타입을 미리 지정해야 합니다. 반면에 매크로는 매개변수의 개수가 가변적입니다. 예를 들어, println!("hello")와 같이 하나의 인수로 println!을 호출하거나 println!("hello {}", name)과 같이 두 개의 인수로 호출할 수 있습니다.
--- p.40
파이썬은 스택을 사용하지 않고 모든 객체를 힙 영역에 저장합니다. 이렇게 저장된 객체들은 파이썬에서 가비지 컬렉션을 통해 메모리를 관리하기 때문에 파이썬을 사용할 때는 메모리 관리에 신경쓰지 않아도 됩니다. 앞에서 힙 영역을 설명할 때 언급한 개발자가 할당하고 할당 해제하는 메모리를 파이썬의 가비지 컬렉터가 대신해주는 것입니다. 반면 러스트는 스택 영역과 힙 영역 모두를 사용합니다. 러스트는 기본적으로 다음과 같이 함수에서 사용하는 모든 값을 제한된 크기의 스택 영역에 저장합니다. 따라서 함수 호출이 종료되면 지역 변수 foo와 var는 모두 삭제됩니다.
--- p.56
러스트는 pop 메서드에 인덱스를 넣을 수 없고, 무조건 마지막 원소가 제거됩니다. 마지막 원소가 아닌 다른 원소를 제거하려면 remove 메서드에 인덱스를 넣어야 합니다. 러스트의 pop과 remove 모두 원소를 제거하고, 제거된 원소를 리턴합니다. 여기서 만일 벡터의 원소가 없는 상태에서 pop을 하게 되면 문제가 발생할 수 있습니다. 따라서 unwrap 함수를 통해 에러가 있는지를 확인하는 과정을 거치게 됩니다. 즉 벡터의 길이가 0인 상태에서 pop을 호출하면 패닉이 발생해 프로그램이 멈추지만, 그게 아니라면 정상적으로 원소를 참조할 수 있게 됩니다.
--- pp.74-75
러스트에서는 이터레이터에서 sum, max, min 메서드를 호출합니다. 여기서 max나 min 메서드는 모두 Option을 리턴합니다. 만일 벡터가 비어있을 때는 최댓값과 최솟값을 구할 수 없기 때문에 이런 경우는 None이 리턴됩니다. max나 min에서 None이 리턴되면, unwrap()은 패닉을 일으킵니다. 따라서 원칙적으로는 match 등을 사용해서 각 경우를 처리해줘야 하지만 여기서는 벡터가 비어있지 않다는 것을 알고 있기 때문에 unwrap을 사용해도 괜찮습니다.
--- p.101
러스트의 접근 방식은 컴파일 타임과 런타임으로 나눠 생각해볼 수 있습니다. 컴파일 타임에는 LBYL 방식으로 컴파일러가 타입, 소유권 등을 미리 검사하게 됩니다. 런타임에 발생할 수 있는 에러는 Result를 사용합니다. Result는 에러가 발생하더라도 프로그램이 종료되지 않고, 에러의 종류에 따라 호출한 코드에서 적절한 처리를 해야 하기 때문에 EAFP 방식이라고 할 수 있습니다. / Result를 사용하면 에러가 발생하더라도 원래 코드의 진행을 복구시킬 수 있지만, 간혹 프로그램에 패닉이 발생하면 더는 프로그램을 진행할 수 없습니다. 또는 직접 panic! 매크로를 사용해 복구 불가능한 치명적인 오류에 대해 프로그램을 즉시 종료할 수 있습니다.
--- p.164