Iongraph는 컴파일러 개발자에게 여러 가지 강력한 이점을 제공합니다.
Iongraph의 주요 이점
-
안정적인 레이아웃: 노드 추가 또는 삭제 시에도 그래프의 전체적인 구조가 극단적으로 변하지 않아 시각적 일관성을 유지합니다.
-
대화형 기능: 클릭 가능한 피연산자, 스크롤 가능한 그래프, 화살표 키를 이용한 노드 간 탐색 등 다양한 상호작용 옵션을 지원합니다.
-
메서드 수준 최적화 검사: 작은 선택기를 통해 컴파일된 여러 메서드 간을 전환하며 메서드별 최적화 영향을 한 화면에서 검사할 수 있습니다.
-
최적화 단계별 시각화: 최적화 패스가 적용된 후 제어 흐름 그래프가 어떻게 변화하는지 단계별로 확인할 수 있습니다.
구현 과정에서의 기술적 도전과 해결
Iongraph 통합은 다음과 같은 주요 기술적 과제를 수반했습니다.
- JSON 라이브러리 직접 구현:
- ZJIT 프로젝트는 Rust 툴링(Cargo)에 엄격하게 의존하지 않으므로,
serde_json과 같은 외부 라이브러리를 직접 추가하기 어려웠습니다. - 라이선스 문제 및 불필요한 기능 포함 가능성을 고려하여, RFC 8259를 준수하는 경량 JSON 직렬화 라이브러리를 직접 구현하기로 결정했습니다.
- 컴파일러의 핵심 경로에 있지 않으므로, 초기에는 원시 성능보다는 가독성과 사용성을 우선시했으며, 향후 성능 개선의 여지를 남겨두었습니다.
- ZJIT 프로젝트는 Rust 툴링(Cargo)에 엄격하게 의존하지 않으므로,
- 제어 흐름 그래프 속성 계산:
- Iongraph는 명시적인 선행/후행 노드 관계, 루프 헤더, 백 엣지 소스 등 ZJIT가 컴파일 단계에서 일반적으로 계산하지 않는 그래프 메타데이터를 요구합니다.
- 선행/후행 노드 계산: 각 블록 내의 점프 명령(조건부 또는 무조건부) 대상을 식별하여 후행 노드 집합을 구성하고, 이를 바탕으로 각 노드의 선행 노드 집합을 업데이트했습니다.
- 도미네이터 계산: 루프 헤더와 백 엣지 소스를 찾기 위해 블록 간의 도미네이터 관계를 계산해야 했습니다. 성능과 구현 복잡성을 고려하여, Cooper, Harvey, Kennedy의 논문에서 언급된 간단한 반복 알고리즘을 채택했습니다. 이 알고리즘은 블록 수가 적은 제어 흐름 그래프에서 충분히 효율적입니다.
- 루프 헤더 및 백 엣지: 백 엣지(블록이 자신의 선행 블록을 지배하는 경우)를 감지하여 자연 루프를 식별합니다. 백 엣지의 대상 블록은 루프 헤더가 되며, 백 엣지의 소스 블록은 해당 루프의 일부로 간주됩니다. 이를 통해 각 블록의 루프 깊이를 증가시킵니다.
이러한 추가 계산은 Iongraph 레이아웃 엔진이 그래프 내에서 블록의 수직 위치를 결정하거나 선을 라우팅하고, 루프 헤더 및 백 엣지 소스를 명확하게 표시하는 데 활용됩니다.