- Cranelift는 Apache-2.0 라이선스의 코드 생성 백엔드로, WebAssembly를 위한 Wasmtime 런타임의 일부로 개발됨
- 2023년 10월, Rust 프로젝트는 Cranelift를 nightly 툴체인의 선택적 컴포넌트로 제공하기 시작
- 사용자들은 이제 Cranelift를 Rust로 작성된 프로젝트의 디버그 빌드를 위한 코드 생성 백엔드로 사용할 수 있음
- Cranelift는 기존 컴파일러와 경쟁하며, 중요한 최적화만을 우선시하는 간소화된 설계로 더 빠르게 코드를 생성함
컴파일 시간의 중요성
- 프로그래밍 언어 사용자들은 빠른 컴파일 시간을 원함
- Rust는 LLVM을 사용하는 다른 언어들과 마찬가지로 컴파일 시간에 대한 불만이 있었음
- 충분히 빠르게 코드를 생성하는 컴파일러는 인터프리터를 사용하는 것보다 유리할 수 있음
- 컴파일 속도에 중점을 둔 컴파일러는 가치가 있을 수 있음
Cranelift의 최적화
- Cranelift는 코드 생성 시 여러 방식으로 최적화를 수행함
- 최적화 파이프라인은 E-graphs를 기반으로 하며, 이는 중간 표현들의 집합을 효율적으로 나타내는 데이터 구조임
- 전통적인 컴파일러에서 최적화 순서는 생성된 코드의 품질에 큰 영향을 미침
- Cranelift는 E-graph를 사용하여 최적화 순서가 결과에 영향을 미치지 않도록 함
- E-graph에서 최종 표현을 추출하는 것은 NP-complete 문제이지만, Cranelift는 휴리스틱을 사용하여 충분히 좋은 표현을 빠르게 추출함
Rust를 위한 Cranelift
- Cranelift를 Rust 백엔드로 사용하기 위한 노력이 상당했음
- Rust 컴파일러는 mid-level IR을 사용하여 타입 체크된 프로그램을 표현함
- Cranelift를 사용하기 위해서는 mid-level IR을 CLIF로 변환하는 라이브러리가 필요했음
- 이 라이브러리는 Rust 컴파일러 팀 멤버인 "bjorn3"에 의해 주로 작성됨
- 사용자들은 rustup과 cargo를 사용하여 Cranelift 백엔드를 시험할 수 있음.
GN⁺의 의견
- Cranelift의 도입은 Rust 커뮤니티에서 컴파일 시간 단축에 대한 지속적인 요구에 대한 응답으로 볼 수 있음. 이는 개발자들의 생산성 향상에 기여할 수 있음.
- Cranelift가 E-graphs를 사용하여 최적화 순서 문제를 해결하는 접근 방식은 컴파일러 설계에 있어 새로운 패러다임을 제시함. 이는 컴파일러 연구 및 개발에 새로운 방향을 제시할 수 있음.
- 비판적인 관점에서 볼 때, Cranelift가 LLVM에 비해 얼마나 안정적이고 효율적인지는 아직 더 많은 실제 사용 사례를 통해 검증될 필요가 있음.
- Cranelift와 유사한 기능을 제공하는 다른 컴파일러 백엔드로는 GCC의 libgccjit 등이 있으며, 이러한 대안들과의 비교를 통해 Cranelift의 장단점을 더 명확히 파악할 수 있음.
- Cranelift를 도입하는 개발자들은 기존의 LLVM 기반 인프라와의 호환성 및 전환 비용을 고려해야 하며, Cranelift의 성능과 안정성을 면밀히 평가해야 함.