더 많은 언어가 배워야 할 OxCaml의 무할당 함수 검사
3 days ago
14
- Jane Street의 OCaml 상위 집합인 OxCaml은 [@zero_alloc]으로 함수 호출 트리 전체의 힙 할당 금지를 컴파일러에 선언할 수 있게 함
- 선언된 호출 경로에서 할당이 생기면 컴파일 실패로 바로 드러나며, 프로파일러로 나중에 찾는 방식보다 회귀를 빠르게 막을 수 있음
- C, C++, Java, Go, C#, Rust, Zig, OCaml 등에서는 보통 핫 패스의 할당을 프로파일러로 찾아 줄이는 접근이 중심임
- 핫 패스 코드는 작은 수정만으로도 다시 할당을 만들 수 있어, 기존 최적화 맥락을 잊으면 같은 조사를 반복하게 됨
- Zig나 최신 Rust 일부의 allocator 전달 관례도 도움이 되지만, 관례보다 컴파일러 검사가 더 직접적인 안전장치가 됨
[@zero_alloc]이 바꾸는 할당 관리
- OxCaml은 Jane Street의 OCaml 상위 집합이며, 함수가 힙에 할당하지 않는다는 단언을 지원함
- 함수에 [@zero_alloc]을 붙이면 해당 함수뿐 아니라 그 아래 호출 트리까지 힙 할당 여부를 컴파일러가 확인함
- 호출 트리 안에서 할당이 발생하면 빌드가 실패하고, 컴파일러가 할당 발생을 알려줌
- 정적 분석으로 비슷한 검사를 만들 가능성은 있지만, 생성된 요약 기준으로는 이런 기능을 컴파일러 자체에 넣은 주류 언어는 드묾
프로파일러 중심 접근과의 차이
- 다른 언어들에서는 보통 프로파일러로 할당을 찾아낸 뒤, 특히 수백만 번 실행되는 루프 안의 할당을 제거하거나 줄임
- C, C++, Java, Go, C#, Rust, Zig, OCaml 등이 프로파일러 중심 접근의 예로 나열됨
- 핫 패스의 한 줄만 바꿔도 다시 할당이 들어갈 수 있고, 그 원인을 찾기 위해 프로파일러로 되돌아가야 함
- Zig나 최신 Rust 일부에서는 allocator를 함수에 전달하지 않는 방식으로 회귀를 줄일 수 있지만, 이는 관례에 의존함
- [@zero_alloc]의 차이는 사후 분석이나 팀 규칙이 아니라, 빌드 시점에 컴파일러가 할당 회귀를 차단한다는 데 있음
-
Homepage
-
Tech blog
- 더 많은 언어가 배워야 할 OxCaml의 무할당 함수 검사