Zig 빌드가 점점 빨라지고 있다
Andrew Kelley는 유명하게도(혹은 관점에 따라서는 악명 높게도) “컴파일러가 너무 느려서 버그가 생긴다”라고 말한 바 있습니다.1
그 결과 수년간 Zig의 주요 공식 목표 중 하나는 더 빠른 컴파일 시간이었습니다. Zig 팀은 이를 현실로 만들기 위해 극도로 어려운 문제들에 매달려 왔습니다(예컨대 LLVM 걷어내기, 자체 코드 생성 백엔드 작성, 자체 링커 구축, 그리고 전반적인 증분 컴파일을 향한 전진 등입니다).2
수년에 걸친 이 노력의 결실이 마침내 Zig 0.15.1에서 나타나기 시작했습니다. Ghostty 프로젝트가 최근 Zig 0.15.1로의 업그레이드를 마쳤으며, 실제 빌드 시간을 공유하고자 합니다.3
빌드 스크립트 컴파일
- Zig 0.14: 7sec 167ms
- Zig 0.15: 1sec 702ms
이 수치는 build.zig 스크립트 자체를 빌드하는 데 걸리는 시간입니다. 위 시간은 zig build --help를 실행해 측정했습니다.
잘 작성된 빌드 스크립트라면 스스로를 다시 빌드하는 일은 드물어야 합니다. 하지만 캐시가 없는 상태에서 소스로부터 새로 빌드할 때는 누구나 이 비용을 치르게 됩니다(예컨대 프로젝트를 내려받아 소스에서 한 번 빌드하는 사용자). 따라서 이는 사용 가능한 바이너리를 만드는 데 걸리는 시간에 직접적인 영향을 미칩니다.
전체 Ghostty 바이너리 빌드(캐시 없음)
- Zig 0.14: 41sec
- Zig 0.15: 32sec
여기에는 빌드 스크립트 자체를 빌드하는 시간도 포함됩니다. 앞선 결과를 고려하면 Zig 0.15는 그 외 나머지 부분을 약 2초 더 빠르게 빌드하고 있습니다. 하지만 전체 소요 시간(wall time)에서도 이 초기 빌드 시간의 변화를 확인할 수 있습니다.
중요: 이 과정의 대부분은 여전히 LLVM을 사용합니다. Ghostty는 아직 자체 호스팅(self-hosted) x86_64 백엔드로 완전히 빌드하고 링크할 수 없습니다. 해당 백엔드에 여전히 버그가 있기 때문입니다. 따라서 이는 LLVM을 계속 사용하는 상황에서도 Zig 컴파일러 자체가 전반적으로 얼마나 개선되었는지를 보여줍니다.
Ghostty가 자체 호스팅 x86_64 백엔드를 완전히 사용할 수 있게 되면 이 시간은 25초 이하로 급감할 것으로 예상합니다. Zig 0.14에서 걸리던 시간의 절반 수준입니다.
증분 빌드(Ghostty 실행 파일)
- Zig 0.14: 19sec
- Zig 0.15: 16sec
가장 핵심적인 터미널 에뮬레이션 코드에 한 줄을 변경한 뒤(이스케이프 시퀀스 파서에 로그 함수 호출 한 줄을 추가) Ghostty를 다시 빌드하는 데 걸리는 시간입니다.
이 빌드는 빌드 스크립트와 의존성 그래프가 완전히 캐시된 상태이므로 필요한 부분만 다시 빌드합니다. Zig의 증분 컴파일은 아직 제대로 동작하지 않기 때문에 여전히 상당량의 코드를 다시 컴파일합니다. 또한 앞선 경우와 마찬가지로 이 빌드 역시 여전히 LLVM을 사용합니다. LLVM을 제외하기만 해도 이 시간은 LLVM이 코드를 생성하는 데 걸리는 시간만큼 줄어들어 12초 정도로 떨어질 것으로 예상합니다.
더 나아가 Zig가 증분 컴파일을 지원하게 되면 이러한 증분 빌드는 아무리 느려도 밀리초 단위로 측정할 수 있게 될 것으로 기대합니다. 하지만 그게 현실이 될 때까지는 지켜봐야겠습니다.
증분 빌드(libghostty-vt)
- Zig 0.14: 2sec 884ms
- Zig 0.15: 975ms
한 줄을 변경한 뒤 libghostty-vt만 다시 빌드하는 데 걸리는 시간입니다. Ghostty 실행 파일과 달리 libghostty-vt는 자체 호스팅 x86_64 백엔드에서 완전히 동작하므로, 이는 LLVM 없이 빌드할 때 시간이 얼마나 달라지는지를 보여줍니다.
Ghostty 실행 파일의 경우와 마찬가지로 증분 컴파일이 아직 완전히 동작하지 않으므로 libghostty-vt의 전체 Zig 모듈을 다시 빌드합니다. 증분 컴파일이 현실이 되면 이 역시 아무리 느려도 한 자릿수 밀리초로 떨어질 것으로 예상합니다.
그럼에도 불구하고 결코 간단하지 않은 라이브러리를 1초 미만으로 빌드한다는 것은 놀랍습니다. 이 라이브러리는 제가 현재 가장 많은 시간을 들여 작업하고 있는 부분인데, Zig 0.15.1로 업그레이드한 지 며칠 되지 않았음에도 워크플로에서 큰 차이를 체감하고 있습니다. 예전에는 빌드나 테스트가 끝날 때까지 다른 탭으로 넘어가 이메일을 읽곤 했지만, 이제는 너무 빨라 터미널 안에서 흐름을 끊기지 않고 작업을 이어갈 수 있습니다.
이러한 개선은 단기간에 무엇이 다가올지를 가장 잘 보여주는 사례입니다. 자체 호스팅 x86_64 백엔드는 이미 모든 디버그 빌드를 기본으로 빌드할 수 있을 만큼 안정적이며, aarch64 백엔드도 그 수준에 가까워지고 있습니다. 아직 전체 Ghostty 실행 파일을 빌드할 수는 없지만, 몇 달 안에 이 문제도 해결될 것이라 확신합니다.
더 빠른 빌드가 이미 현실이 되었습니다
보시다시피 Zig 0.15.1로 Ghostty를 빌드하면 모든 시나리오에서 더 빠릅니다. Ghostty의 많은 부분이 아직 자체 호스팅 백엔드를 활용조차 할 수 없는데도 말입니다! 게다가 증분 컴파일이 아직 동작하지 않는데도 그렇습니다!
저는 Ghostty에 Zig를 선택한 것을 정말 잘했다고 생각하며, Zig 팀이 컴파일 시간에 집중하고 있다는 점이 마음에 듭니다. 이러한 개선은 실제로 이루어졌고, 지금 바로 체감할 수 있습니다. 그리고 앞으로 2년 정도 지나면 오늘 공유한 결과가 오히려 굉장히 느리게 느껴질 것 같습니다. 😜
각주
타임스탬프 링크: https://youtu.be/5eL_LcxwwHg?t=565 ↩
여기에는 Zig 컴파일러의 모든 측면을 더 빠르고 더 병렬화되도록 만드는 데 들어간 천문학적인 수준의 작업은 포함하지 않았습니다. ↩
모든 측정은 동일한 x86_64 Linux 머신에서 수행되었습니다. ↩
글을 무작위로 읽기