러스트로 갈아타기

Erdos·2026년 3월 3일

서재

목록 보기
14/15
post-thumbnail

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다."

감상

특히, 개인적으로 재미있게 본 부분은

  • CHAPTER 03 C FFI와 unsafe 러스트 소개
  • CHAPTER 05 러스트 라이브러리 구조화 중에서도 "경로!"
  • CHAPTER 08 러스트를 사용한 비동기 파이썬 "망델브로" "비동기" "GIL"
  • CHAPTER 10 리팩터링을 위한 웹 어셈블리 인터페이스 "Wasm"

언어 자체로 보면 러스트는 c 요소도 있고, c++적인 면이 강하게 보여서 흥미로웠다.
반대로 말하면, 이 책은 러스트만을 배우고자 하는 초급자에게는 친밀하지 않을 수 있다.
최소한, c/c++/리눅스에 익숙하거나 rust를 조금 다뤄본 사람에게는 재미있는 키워드를 던져주는 책인 것 같다.

"CHAPTER 08 러스트를 사용한 비동기 파이썬"에서 무척 연산이 많은 망델브로 집합(프랙탈)로 파이썬 코드를 러스트로 갈아탐으로써 성능 개선을 하는 과정이 나온다.
개인적으로 그래픽스 과제로 해보았던 프렉탈이 책에 등장해서 코드를 흥미롭게 보았다.

wasm 적용하기

wasm = WebAssembly
c/c++/rust로 만든 프로그램을 웹브라우저에서 돌리는 브라우저 전용 실행파일

챕터 10도 무척 흥미롭게 보았는데, 이전에 만들었던 망델브로 집합을 웹으로 배포해 보았다.

키보드 c키는 색상 변경(4개의 팔레트 존재), page up/page down은 정밀도를 높이고 낮추는 것이다.
확대를 하면서 "page up"(HOME 키 옆에)을 하면 망델브로의 망델브로의 망델브로의 망델브로(.....)로 계속 들어갈 수 있다.
이미지는 page up을 많이 하면 할 수록, 예쁘게 나온다(파란색 팔레트에서는 흑백 영역이 줄어들고 흰색 비중이 커질것이다). 연산량은 늘어나고!

키 바인딩이 불...편해서 죄송

https://erdoslibrary.github.io/fractal/

기록

CHAPTER 01 러스트로 리팩터링하는 이유

1.1 리팩터링이란?

리팩터링: 코드를 재구조화하는 프로세스

1.3 왜 러스트인가?

메모리 안정성, 성능, 타입 시스템을 제공해서 이 세 가지가 제대로 작동하는 애플리케이션 구성

수명과 소유권 시스템을 사용하면 리소스 해제에 대한 책임을 고려할 필요가 없다.

스레드 안정성이 강력하게 보장되어 있다.(위험도가 높은 병렬 처리 추가)

1.4 리팩터링하는 이유

  • 성능
  • 메모리 안정성
  • 유지 보수성: 러스트는 강력한 정적 타입 시스템

1.5 리팩터링 하지 않는 경우

  • 새 소프트웨어를 작성할 때는 수년간 유지 보수할 방법을 항상 계획해야 한다.

CHAPTER 02 러스트 개요

2.3 수명

  • 메모리 관리 프로세스

[참조와 대여]

러스트는 값을 소유하는 대신 대여 가능

러스트에서 값을 대여하면 항상 여러분이 대여한 것에 대해 참조.

참조는 러스트에게 다른 값을 찾는 방법을 알려주는 값

2.5 열거형

오 c로 줄창 짜던 Fizzbuzz인데 Rust로는 이렇게 짜는군. 🤔
열거형도 똑똑하게 잘 썼다.

enum FizzBuzzValue {
    Fizz,
    Buzz,
    FizzBuzz,
    NotDivisible,
}


fn main() {
    for i in 1..101 {
        print_fizzbuzz(i);
    }
}

fn print_fizzbuzz(x: i32) {
    match fizzbuzz(x) {
        FizzBuzzValue::FizzBuzz => {
            println!("FizzBuzz");
        }
        FizzBuzzValue::Fizz => {
            println!("Fizz");
        }
        FizzBuzzValue::Buzz => {
            println!("Buzz");
        }
        FizzBuzzValue::NotDivisible => {
            println!("{}", x);
        }
    }
}

fn fizzbuzz(x: i32) -> FizzBuzzValue
{
    if x % 3 == 0 && x % 5 == 0 {
        FizzBuzzValue::FizzBuzz 
    } else if x % 3 == 0 {
        FizzBuzzValue::Fizz
    } else if x % 5 == 0 {
        FizzBuzzValue::Buzz
    } else {
        FizzBuzzValue::NotDivisible
    }
}

아래 코드는 재미삼아서.. ㅋㅋ; 전에 짜놓은 C언어 fizzbuzz다.

// 미묘하게 다른 것을 비교하라고


#include <unistd.h>

void ft_putchar(char c)
{
    write(1, &c, 1);
}

void put_number(int n)
{
    if (n >= 10)
        put_number(n / 10);
    ft_putchar((n % 10) + '0');
}

void fizzbuzz(void)
{
    int num = 1;
    while (num <= 100)
    {
        if (num % 3 == 0 && num % 5 == 0) // 꼭 이게 먼저!!
            write(1, "fizzbuzz", 8);
        else if (num % 3 == 0)
            write(1, "fizz", 4);
        else if (num % 5 == 0)
            write(1, "buzz", 4);
        else
            put_number(num);
        ft_putchar('\n');
        num++;
    }
}

int main(void)
{
    fizzbuzz();
    return 0;
}


CHAPTER 03 C FFI와 unsafe 러스트 소개

C 외부 함수 인터페이스(FFI, Foreign Function Interface): 런타임에서 C 함수와 동일하게 작동하는 함수를 작성하는 것.

러스트 코드가 허용하지 않는 작업을 수행하기 위해 unsafe 블록과 함수를 사용해야 함.

3.1 Unsafe 러스트

WOW) 성능 향상, 단순선 증가, 러스트 컴파일러가 추론할 수 없는 타입을 처리하기 위해 메모리 안정성의 일부를 없애버릴 필요가 있다.

  • unsafe란 코드를 엄격하게 검사하지 않고 러스트의 안전 규칙을 유지하고 준수할 책임이 개발자에게 있다는 의미다.
  • unsafe 는
    • 원시 포인터 역참조
    • unsafe로 표시된 함수 호출
    • unsafe로 표시된 트레이트 구현
    • 정적 값 변경
    • union필드에 접근

3.1.1 원시 포인터

포인터란: 다른 값의 메모리 위치를 알려주는 값. 해당 배열에 대한 인덱스.

역참조(de-reference): 포인터가 가리키는 값에 엑세스하는 것

  • 참조 (&): "이 데이터의 주소는 여기야." (주소 생성)
  • 역참조 (*): "그 주소에 가서 실제 내용을 가져와." (데이터 접근)

번외

ferris

ferris는 러스트의 비공식 마스코트다. (공식 홈에서도 언급되는)
유래도 꽤 위트가 있는데,
rust를 사용하는 사람들을 rustaceans라고 부르는데 이 발음이 갑각류(Crustaceans)와 유사하다는 이유로 마스코트가 "게"가 되었다고 한다.

철(Ferrous)이 있어야 녹(Rust)이 슬고, 그 녹을 다루는 사람들(Rustaceans)은 갑각류(Crustaceans)와 이름이 비슷하니, 붉은색 게인 '페리스'가 우리의 상징이다


학습 중에 온라인 모각코를 이용하는데 거기서도 획득할 수 있는 펫 중에 페리스가 존재한다.
포인트 1점을 한 땀 한 땀 모아 NN번 뽑기(어느덧 두자리 수..)를 해보았는데, 나는 ferris가 안 나온다...

Rust철학

  • 공식홈: https://rust-lang.org/

    Performance
    Rust is blazingly fast and memory-efficient: with no runtime or garbage collector, it can power performance-critical services, run on embedded devices, and easily integrate with other languages.

    Reliability
    Rust’s rich type system and ownership model guarantee memory-safety and thread-safety — enabling you to eliminate many classes of bugs at compile-time.

    Productivity
    Rust has great documentation, a friendly compiler with useful error messages, and top-notch tooling — an integrated package manager and build tool, smart multi-editor support with auto-completion and type inspections, an auto-formatter, and more.

profile
수학을 사랑하는 애독자📚 Stop dreaming. Start living. - 'The Secret Life of Walter Mitty'

0개의 댓글