Bun 런타임, Zig에서 Rust로의 변환, 핵심 가이드 공개!

by DD
1개월 전
조회수 6

Bun 런타임의 Zig 코드베이스를 Rust로 포팅(Porting)하는 과정에 대한 상세 가이드라인 제시

코드 변환 규칙, 메모리 관리, FFI(Foreign Function Interface) 처리 등 구체적인 기술적 요구사항 설명

안전성(Safety) 확보를 위해 `unsafe` 코드 사용 시 주석 처리 및 메모리 관리 전략 강조

동시성(Concurrency) 문제 해결을 위한 Rust의 Send/Sync 특성 활용 및 락(Lock) 사용 지침 제공

Zig to Rust 포팅(Porting) 가이드라인

가이드라인은 Zig 코드를 Rust로 변환하는 데 필요한 세부 규칙을 제시하며, 특히 코드 구조(Code Structure) 유지에 중점을 둔다. Zig의 함수명, 필드 순서, 제어 흐름을 Rust 코드와 일치시키고, `unsafe` 코드 사용 시 안전성을 보장하기 위해 주석을 추가하도록 권장한다. 또한, 성능 최적화(Performance Optimization)를 위해 Zig의 특정 관용구(Idiom)를 Rust에서 어떻게 처리해야 하는지에 대한 지침을 제공한다.

메모리 관리 및 안전성 확보

Rust로의 포팅 과정에서 메모리 안전성(Memory Safety)을 확보하기 위해, `Box`, `Vec`, `String`과 같은 스마트 포인터(Smart Pointer) 사용을 권장한다. 특히, `allocator.free()` 호출을 대체하고, `ManuallyDrop` 사용을 최소화하여 메모리 누수(Memory Leak)를 방지한다. 또한, FFI(Foreign Function Interface)를 통해 C 코드를 호출할 때, 포인터(Pointer)의 안전한 사용을 위해 `unsafe` 블록 내에서 주석을 통해 안전성을 명시하도록 한다.

FFI(Foreign Function Interface) 및 플랫폼 조건부 처리

가이드라인은 FFI(Foreign Function Interface)를 통해 C 코드를 호출하는 방법을 설명하며, `extern "C"`를 사용하여 C ABI(Application Binary Interface)를 지정한다. 또한, 플랫폼별 조건부 컴파일(Conditional Compilation)을 위해 `#[cfg(windows)]`와 같은 속성을 사용하고, 플랫폼 의존적인 코드(Platform-Specific Code)를 분리한다. 이러한 접근 방식은 코드의 이식성(Portability)을 높이고, 플랫폼 간의 호환성 문제를 해결하는 데 기여한다.

동시성(Concurrency) 및 락(Lock) 관리

Rust의 Send/Sync 특성을 활용하여 스레드 안전성(Thread Safety)을 보장하고, 동시성 문제를 해결한다. Zig의 락(Lock)을 Rust로 변환할 때, `parking_lot::Mutex`와 같은 라이브러리를 사용하여 데이터 보호(Data Protection)를 구현한다. 또한, `std::sync::Once`와 `LazyLock`를 사용하여 초기화(Initialization)를 안전하게 처리하고, 불필요한 락 사용을 최소화한다.

Bun (the js runtime) is being vibe-ported from zig to rust