Rust 가이드
이 문서는 Wave 프로젝트에서 Rust를 사용할 때의 규칙을 정의한다.
Rust는 Wave가 셀프호스팅(Self-hosting)되기 전 단계에서 사용되는 구현 언어이다. 셀프호스팅이 완료된 이후에도 이 문서는 참고 문서로서 유효하지만, 실질적인 Wave 컴파일러 구현은 Rust로 작성되지 않게 된다.
Rust 버전 및 에디션
Wave 컴파일러는 반드시 다음 조건을 만족해야 한다.
- Rust 에디션은 2021 에디션만 사용한다.
- Rust 버전은 1.56.0을 기준으로 작성한다.
특정 최신 기능이나 실험적 기능에 의존해서는 안 된다.
네이밍 규칙
네이밍 규칙은 Rust 공식 네이밍 규칙을 그대로 따른다.
- 타입:
PascalCase - 함수 및 변수:
snake_case - 상수:
SCREAMING_SNAKE_CASE - 모듈 및 파일:
snake_case
파일 및 모듈 크기
하나의 Rust 소스 파일이 5,000줄을 초과할 경우,
반드시 모듈 단위로 분리해야 한다.
과도하게 큰 파일은 유지보수성과 가독성을 심각하게 저하시킨다.
타입 추론
Rust의 타입 추론은 기본적으로 허용한다.
다만 다음 경우에는 타입을 명시적으로 선언해야 한다.
- 타입이 한눈에 명확하지 않은 경우
- 컴파일러 로직에서 타입 안정성이 중요한 경우
- 코드 리뷰 시 의도를 오해할 가능성이 있는 경우
매크로 사용 규칙
Wave 컴파일러 코드에서는 사용자 정의 매크로를 사용하지 않는다.
다만 다음과 같은 Rust 표준 매크로는 예외적으로 허용한다.
println!format!- 기타 Rust 표준 라이브러리에 포함된 기본 매크로
매크로 남용은 코드 추적을 어렵게 하며, 컴파일러 코드에서는 특히 지양해야 한다.
라이브러리 사용 규칙
기본적으로 Rust 표준 라이브러리를 사용하여 개발한다.
다음 규칙을 따른다.
- 컴파일러 프론트엔드 상단에서 필요한 기능은 직접 구현하는 것을 원칙으로 한다.
- 외부 라이브러리를 사용하는 경우, 해당 라이브러리의 기능을 부분적으로만 사용하는 것은 지양한다.
- Rust 재단이 직접 개발한 핵심 라이브러리(예:
libc)가 반드시 필요한 경우에는 사용을 허용한다.
불필요한 의존성 추가는 Wave 컴파일러의 장기 유지보수에 악영향을 준다.
코드 스타일
기본 코드 스타일은 K&R 스타일을 따른다.
다만 where 키워드를 사용하는 등,
가독성을 위해 불가피한 경우에는 예외를 허용할 수 있다.
주석 규칙
다음 조건에 해당하는 함수는 반드시 주석으로 설명해야 한다.
- 로직이 직관적이지 않은 함수
- 컴파일러 내부 동작과 밀접하게 연관된 함수
- 한 번에 이해하기 어려운 알고리즘을 포함한 함수
주석은 반드시 영어로 작성해야 한다.