packagemain.tech에서 원본 기사 읽기
Rust를 해야 할까요, 아니면 가야 할까요? 어떤 언어가 더 좋고, 그 질문이 말이 되나요? 특별 게스트인 John Arundel과 함께 2024년 Go 대 Rust에 대해 이야기해 보겠습니다. John은 For the Love of Go, Cloud Native DevOps with Kubernetes 및 기타 여러 책의 저자입니다. 그는 또한 Go와 Rust를 모두 가르치고 있으므로 그의 관점을 듣는 것도 흥미로울 것입니다. 인터뷰 내용을 공개합니다!
John, 요즘 Rust에 대한 이야기가 점점 더 많이 들리는 것 같아요. 간단한 소개를 해주실 수 있나요? Rust는 무엇을 위한 것이며, 왜 존재합니까?
물론이죠. 쉽습니다. Rust는 엘리베이터를 제어하는 언어입니다.
장난하시나요?
전혀 그렇지 않습니다. Rust의 창시자인 Graydon Hoare는 소프트웨어 문제로 인해 건물의 엘리베이터가 계속 고장나자 좌절감을 느꼈습니다. 그는 “확실히 우리는 이것보다 더 잘할 수 있을 거야!”라고 생각했습니다. 그리고 나머지는 역사입니다.
모든 버그를 예방할 수는 없지만 적어도 버퍼 오버플로, 데이터 경합, '무료 후 사용' 문제 등 일부 주요 버그 범주를 제거하는 프로그래밍 언어를 사용할 수는 있습니다. 따라서 처음부터 Rust의 초점은 신뢰할 수 있는 소프트웨어를 구축하고, 어쨌든 훌륭한 프로그래머가 수행하는 많은 안전 검사를 자동화하고, 실수가 프로덕션에 도달하기 전에 이를 포착하도록 돕는 것이었습니다.
좋은 생각인 것 같지만, 특히 Go에 비해 Rust는 배우기 어려운 언어라는 인상을 받았습니다. 그게 공평한가요? 그렇다면 왜 그렇습니까?
Go와 Rust는 서로 다른 방식으로 동일한 문제를 해결하려고 노력하고 있습니다. C 및 C++와 같은 전통적인 언어로 대규모 소프트웨어를 작성하는 것은 어렵습니다. 왜냐하면 프로그래머는 실수를 피하려면 경험이 풍부하고 지식이 풍부해야 하기 때문입니다. 전문가라도 가끔은 실수할 수 있고, 프로그래머를 전문가로 양성하는 데는 오랜 시간이 걸립니다.
Go는 언어를 근본적으로 단순화하여 이 문제를 해결합니다. C++와 비교할 때 배울 구문이 훨씬 적습니다. 따라서 프로그래머는 크고 복잡한 언어를 익히는 대신 프로그램을 잘 작성하는 방법을 배우는 데 시간을 보낼 수 있습니다. Go는 간결하지만 효과적입니다.
비유를 하자면 우주선을 조종하는 것보다 트랙터 운전을 배우는 것이 더 쉽습니다. 트랙터는 소박하고 실용적인 기계일 수 있지만 제 역할을 완벽하게 수행하며 실제로 밭을 가는 등의 많은 작업에서 우주선보다 더 나은 선택입니다.
당신의 비유가 마음에 듭니다. 러스트가 우주선인가봐요?
예, Rust는 C와 같은 전통적인 명령형 언어의 최고의 아이디어와 Haskell 및 Lisp와 같은 언어에서 차용한 함수형 프로그래밍 개념을 결합한 크고 복잡하며 강력합니다.
Rust에는 Go보다 배울 것이 더 많지만 더 많은 일을 할 수 있습니다! 화성으로 날아가고 싶다면 트랙터보다 우주선이 더 나은 선택입니다. 물론 우주비행사를 훈련시키는 데에는 트랙터 운전사보다 시간이 조금 더 걸립니다.
Go에는 가비지 수집 기능이 내장되어 있어 단순성이 뛰어납니다. Rust에서 메모리 관리는 어떻게 작동하며, 배우는 것이 큰 도전인가요?
예, 가비지 수집은 C++와 같은 언어에서처럼 메모리를 직접 할당하고 해제하는 것에 대해 걱정할 필요가 없음을 의미합니다. 이를 통해 프로그래밍이 더 쉬워지고 모든 종류의 메모리 관련 버그가 제거됩니다. 반면 상대적으로 복잡한 런타임이 필요하며 가비지 수집은 성능에 영향을 미칩니다.
Rust는 다른 접근 방식을 취합니다. 프로그램을 일시 중지할 필요 없이 자동으로 메모리를 회수합니다. 존재하는 특정 데이터에 대한 모든 참조를 추적하여 이를 수행할 수 있습니다. 프로그램의 어떤 부분도 더 이상 데이터를 참조할 수 없을 때 Rust는 메모리의 일부가 즉시 안전하게 재활용될 수 있다는 것을 알고 있습니다.
네, Rust가 소유권과 차용에 중점을 두고 있다고 들었습니다. 이러한 개념은 Go의 포인터 작업과 어떻게 비교되며, 이를 이해하는 좋은 방법은 무엇입니까?
좋은 소식이 있습니다. 이미 Go의 포인터에 익숙하다면 Rust의 참조는 기본적으로 동일한 방식으로 작동하지만 더 안전합니다. 변수에 대한 변경 가능한 참조를 생성하면 Go 포인터처럼 작동합니다. 이를 함수에 전달하거나 어딘가에 저장할 수 있습니다.
그러나 Go와 달리 변경 가능한 참조가 존재하는 한 Go는 데이터에 독점적으로 액세스할 수 있습니다. 다른 사람은 이를 수정하거나 읽을 수도 없습니다. Go 용어로 말하면 자동 뮤텍스 잠금을 사용하는 것과 같습니다. 그리고 함수가 데이터를 수정할 필요가 없는 경우 읽기 전용 공유 참조를 대신 빌릴 수 있으며 많은 참조가 동시에 존재할 수 있습니다.
Rust는 또한 원본 데이터를 추적합니다. 데이터가 범위를 벗어나면 해당 데이터에 대한 참조는 더 이상 유효하지 않습니다. 따라서 컴파일러는 더 이상 존재하지 않는 값에 대한 참조를 사용하려고 시도하는 다양한 종류의 매달린 포인터 버그를 감지할 수 있습니다. 그 결과 정의되지 않은 동작이 발생하는데, 이는 끔찍한 일이 일어날 것이라는 좋은 표현이며, Rust의 가치 제안 중 일부는 "정의되지 않은 동작은 절대 없습니다"입니다.
Rust에서는 데이터에 대한 참조가 항상 유효하고 변경 가능한 참조가 한 번에 하나만 존재하도록 프로그램을 작성하는 방법을 찾아야 합니다. 익숙해지는 데 시간이 좀 걸리지만(Rust 프로그래머는 이를 "빌림 검사기와의 싸움"이라고 함) 결과 프로그램은 더 안정적이고 정확할 가능성이 더 높습니다.
예를 들어, 모든 Go 프로그래머는 두 개 이상의 고루틴이 동시에 일부 공유 데이터에 액세스하려고 시도하여 예측할 수 없는 결과를 초래하는 데이터 경쟁에 익숙합니다. 기껏해야 프로그램이 충돌하고 최악의 경우 계속됩니다. 데이터가 손상되었거나 유효하지 않습니다.
Rust에서는 이런 프로그램이 컴파일되지 않습니다! 소유권 및 참조 규칙은 동일한 항목에 대한 두 개의 변경 가능한 참조가 동시에 존재할 수 없음을 의미합니다. 다른 방법으로 문제를 해결하면 됩니다.
이렇게 하면 깔끔하게 동시성이 구현됩니다. 나는 채널과 고루틴을 갖춘 Go의 동시성 기능을 좋아합니다. Rust는 동시성을 어떻게 처리하며, Go 경험에서 활용할 수 있는 유사점이 있습니까?
예, 고루틴과 채널은 훌륭합니다. 기존 멀티스레딩에 비해 매우 저렴한 초경량 작업 추상화입니다. 반면에 Go는 기본적인 구성 요소만 제공합니다. 이를 안전하게 사용하고 데이터 경합이나 교착 상태를 피하는 것은 우리의 몫입니다. 그리고 그것은 어려울 수 있습니다!
Rust에는 고루틴이 없지만 고루틴과 매우 유사한 비동기 작업이 있지만 일반적인 Rust 안전 보장만 있습니다. Tokio 및 Rayon과 같은 뛰어난 타사 프레임워크도 있어 대량의 데이터를 가져와 병렬로 처리하는 가장 효율적인 방법을 자동으로 찾아낼 수 있습니다.
따라서 동시성 프로그램은 항상 잘 작성하기 어렵지만 Go에서 할 수 있다면 이러한 기술이 Rust에도 잘 전달된다는 것을 알게 될 것입니다.
저는 직접 하면서 배우는 것을 좋아합니다. 예를 들어 Tour of Go와 같이 Rust를 시작하는 Go 프로그래머에게 추천하고 싶은 좋은 실습이나 프로젝트가 있습니까?
Rustlings는 시작하기 좋은 곳입니다. 모든 언어 기초를 안내하는 대화형 간단한 연습 세트입니다. 실제 인간으로부터 피드백을 받고 싶다면 Exercism에 대한 Rust 트랙을 확인하세요. 예제 스니펫 작업을 위한 훌륭한 리소스인 Rust by 예제도 있습니다.
두 언어 모두를 좋아하시는 것 같군요. 어느 쪽을 선호하시나요? 이미 Go를 아는 사람도 Rust를 배워보라고 권하고 싶으신가요?
예, Go와 Rust는 각각 내 뇌의 서로 다른 부분에 호소합니다. 저는 Go의 급진적인 단순성과 실용성을 좋아합니다. Go는 아주 적은 비용으로 많은 일을 하고 대부분의 문제를 꽤 잘 해결합니다.
반면 Rust는 커널, 펌웨어, 임베디드 장치 및 의료 기기, 산업, 항공우주 등과 같이 안전에 중요한 애플리케이션 등 Go가 이상적인 선택이 아닌 부분을 깔끔하게 채웁니다.
물론 엘리베이터도요.
당연히! 그래서 저는 Rust의 그런 측면을 좋아하고, 정말 재미있고 표현력이 풍부한 언어이기도 합니다. 나는 누구든지 Rust를 가지고 놀아볼 가치가 충분히 있다고 생각하며, 구문의 초기 생소함과 빌림 검사기의 어려움을 극복할 수 있을 만큼 오랫동안 Rust를 사용합니다.
Rust가 자신에게 적합하지 않다고 판단하더라도 문제에 대해 흥미롭고 새로운 사고 방식을 배울 수 있으며 Go의 다양한 절충안을 더 잘 이해하는 데도 도움이 됩니다.
경력 관점에서 볼 때 Go와 Rust는 모두 가까운 미래에 매우 귀중한 기술이 될 것입니다. 조만간 "Go 대 Rust" 대신 "Go와 Rust 대 다른 모든 것"에 대해 이야기하게 될 것 같습니다.
John님, 저희 게스트로 참여해 주시고 Go와 Rust에 대한 관점을 알려주셔서 감사합니다. 사람들이 귀하의 책이나 교육 과정에 관심이 있는 경우 어디에서 귀하에 대해 더 자세히 알 수 있습니까?
기뻐요! 자세한 내용을 알고 싶으시면 제 웹사이트(bitfieldconsulting.com)를 방문하시거나 연락주세요. 기꺼이 채팅해 드리겠습니다.
위 내용은 Gophers를 위한 Rust의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!