많은 개발자와 마찬가지로,나는 꽤 많은 시간 동안 녹에 관심이있다. 해커 뉴스에 너무 많은 헤드 라인에 나타나거나 언어가 안전과 성능에 걸리는 새로운 접근 방식 때문에뿐만 아니라 사람들이 사랑과 감탄의 특별한 감각으로 그것에 대해 이야기하는 것처럼 보이기 때문입니다. 스위프트:이 같은 목표와 내가 좋아하는 이동-에 언어의 기능 중 일부를 공유하기 때문에 그 꼭대기에,녹 나에게 특별한 관심이다. 나는 최근에 몇 가지 작은 개인 프로젝트에 녹을 시도 할 수있는 시간을 촬영 한 이후,나는 언어의 내 인상을 문서화하기 위해 약간의 시간이 걸릴 싶어,특히이 스위프트에 비교하는 방법.

큰 그림

러스트와 스위프트는 공통점이 많습니다. 대수 형식 및 선택적 값의 일류 처리와 같은 기능은 이러한 두 언어로 많은 오류 클래스를 런타임에서 컴파일 시간으로 이동하는 데 도움이됩니다.

이 언어는 어떻게 다릅니 까? 내가 그 차이를 특징 지을 수있는 가장 좋은 방법은:

스위프트는 쉽게 안전한 코드를 작성할 수 있습니다.
녹 때문에 안전하지 않은 코드를 작성하기가 어렵습니다.

이 두 문장은 동일하게 들릴 수 있지만 중요한 차이점이 있습니다. 스위프트는 성능을 희생하여 인체공학을 우선시하고 녹이 인체공학을 희생하여 성능을 우선시합니다.

트레이드 오프: 성능 대 인체 공학

이 우선 순위의 차이가 입증되는 가장 큰 방법은 이러한 언어가 메모리 관리에 대한 접근 방식입니다. 메모리 관리에 대한 언어의 접근 방식이 고유 한 판매 포인트 중 하나이기 때문에 녹부터 시작할 것입니다.

녹에서 메모리는 주로 정적으로 관리됩니다(예,참조 계산과 같은 다른 메모리 관리 모드가 있지만 지금은 무시하겠습니다). 이것이 의미하는 것은 녹 컴파일러가 프로그램을 분석하고 일련의 규칙에 따라 메모리를 할당 및 해제해야 할시기를 결정하는 것입니다.

안전을 제공하기 위해 러스트는 대출 확인이라는 새로운 전략을 사용합니다. 이것이 실제로 작동하는 방식은 프로그래머로서 변수(즉,메모리 위치에 대한 참조)를 통과 할 때마다 참조가 변경 가능한지 변경 불가능한지 여부를 지정해야한다는 것입니다. 그런 다음 컴파일러는 규칙 집합을 사용하여 한 번에 두 곳에서 단일 메모리 조각을 변형할 수 없도록 하여 프로그램에 데이터 경주가 없음을 입증할 수 있게 합니다.

이 접근 방식은 메모리 사용 및 성능과 관련하여 매우 유익한 특성을 가지고 있습니다. 대출 검사는 일반적으로 값 복사를 피하기 때문에 메모리와 함께 매우 양심적 일 수 있습니다. 또한 작업이 런타임이 아닌 컴파일 타임에 수행되기 때문에 가비지 수집과 같은 솔루션의 성능 오버헤드를 피할 수 있습니다.

그러나 사용 편의성만큼 몇 가지 단점이 있습니다. 녹에 있는 소유권의 본질 때문에,단순히 녹에서 작동하지 않는 몇몇 디자인 본이 있습니다. 예를 들어,이중 연결 목록 또는 전역 변수와 같은 것을 구현하는 것은 사소한 일이 아닙니다. 이 가능성이 시간이 더 직관적이되고,이러한 문제에 대한 해결 방법이 있지만,녹 확실히 다른 언어에없는 프로그래머에 제한을 부과한다.

러스트로 자주 언급되는 것은 아니지만,스위프트는 메모리 관리에 대해서도 흥미로운 이야기를 가지고 있다.

스위프트에는 참조 유형과 값 유형의 두 가지 기본 변수 유형이 있습니다. 일반적으로 참조 형식은 힙 할당되며 참조 계산에 의해 관리됩니다. 즉,런타임에 참조 카운트된 개체에 대한 참조 수가 추적되고 개수가 0 에 도달하면 개체가 할당 해제됩니다. 즉,참조 횟수가 변경될 때마다 모든 프로세서 스레드 간에 동기화가 있어야 합니다. 이렇게 하면 다중 스레드 응용 프로그램에서 참조가 실수로 해제될 가능성을 없앨 수 있습니다.

녹에는 참조 계산 및 원자 참조 계산을위한 도구도 있지만 기본값이 아닌 옵트 인입니다.반면

값 유형은 일반적으로 스택에 할당되며 메모리는 정적으로 관리됩니다. 그러나 스위프트의 값 유형 동작은 러스트가 메모리를 처리하는 방식과 크게 다릅니다. 즉,값 형식이 새 변수에 기록되거나 함수에 전달될 때마다 복사가 이루어집니다.

기본적으로 복사-에-쓰기 복사는 대출 검사의 동일한 목표의 일부를 달성:프로그래머로서 당신은 일반적으로 인해 프로그램의 다른 곳에서 예기치 않은 부작용에 신비하게 변화하는 값에 대해 걱정할 필요가 없습니다. 단순히 스위프트에 존재하지 않는 녹에 소유권 관련 컴파일 타임 오류의 전체 클래스가 있기 때문에 그것은 또한,검사를 빌려보다 조금 덜인지 부하가 필요합니다. 그러나,그것은 비용에 온다:그 추가 복사본을 완료 하려면 추가 메모리 사용 및 중앙 처리 장치 사이클이 필요 합니다.

녹에서는 차용 검사 오류를 침묵시키는 방법으로 값을 복사 할 수도 있지만 복사본이 명시 적으로 지정되어야하므로 시각적 노이즈가 추가됩니다.

그래서 여기에 우리는이 두 언어에 의해 트레이드 오프의 좋은 예가있다:스위프트는 당신에게 여전히 안전 수준을 유지하면서 메모리를 관리하는 방법에 대한 몇 가지 폭 넓은 가정을 제공합니다. 그것은 최적화에 많은 생각을하기 전에 모범 사례에 따라 메모리를 처리 할 수있는 방법과 같습니다. 이것은 매우 쉽게 뛰어 낮은 수준의 세부 사항에 많은 생각을주지 않고 코드를 작성하고,또한 몇 가지 기본적인 런타임 안전성과 정확성을 달성하는 것은 당신이 파이썬이나 골랑 같은 언어로 얻을 것 보장 할 수 있습니다. 그러나 그것은 당신이 당신의 프로그램을 실행할 때까지 심지어 그것을 실현하지 않고 떨어져 쉽게 일부 성능 절벽과 함께 않습니다. 고성능 스위프트 코드를 작성할 수 있지만 이를 위해서는 신중한 프로파일링 및 최적화가 필요한 경우가 많습니다.

녹,다른 한편으로,메모리를 관리 하는 방법을 지정 하기 위한 특정 도구를 많이 제공 하 고 안전 하지 않은 동작을 방지 하기 위해 그들을 사용 하는 방법에 몇 가지 어려운 제한을 배치 합니다. 이 바로 상자 밖으로 당신에게 아주 좋은 성능 특성을 제공하지만,모든 규칙을 준수하는 것을 보장의 추가인지 오버 헤드에 걸릴 필요 않습니다.

이것에서 나의 테이크 아웃은 이러한 언어가 몇 가지 공통의 목표를 가지고 있지만,그들은 다른 사용 사례에 자신을 빌려 근본적으로 다른 특성을 가지고 있다는 것이 었습니다. 예를 들어,러스트는 임베디드 개발,메모리 및 프로세서 사이클의 최적 사용이 매우 중요하고 코드 컴파일 실행 루프가 느려질 수 있으므로 컴파일 타임에 가능한 모든 문제를 포착하는 것이 중요합니다. 스위프트는 데이터 과학,또는 서버리스 로직 같은 뭔가 더 나은 선택이 될 수 있습니다 반면,여기서 성능은 보조 관심사입니다,그것은 낮은 수준의 세부 사항을 많이 고려하지 않고 문제 도메인에 가까운 작업하는 것이 중요합니다.

어쨌든,나는 앞으로이 두 언어를 모두 따르는 데 매우 관심을 가질 것이며,스위프트와 러스트의 비교에 대한 더 많은 관찰로이 게시물을 따를 것입니다.

답글 남기기

이메일 주소는 공개되지 않습니다.