중간 표현

중간 표현(Intermediate Representation, IR)은 컴파일러가 프로그램의 구조와 의미를 분석·변환하기 위해 사용하는 내부 또는 교환용 자료 형식이다. 소스 코드에 등장하는 문장·타입·함수·연산을 추상화한 표현으로, 언어의 구문을 가까이 보존한 AST부터 제어 흐름·데...

영어 명칭Intermediate Representation
약칭IR
분류컴파일러 및 프로그램 분석의 내부 자료 표현
주요 목적소스 언어와 대상 코드 사이의 의미·흐름 표현
형식AST·HIR·MIR·SSA·CFG·RTL 등
핵심 정보연산·타입·제어 흐름·데이터 흐름
변환 과정Lowering·최적화·코드 생성
대상기계어·바이트코드·다른 소스 코드 등
관련 체계LLVM, MLIR, GCC GIMPLE 등
예시 기술LLVM Language Reference
다단계 모델MLIR Dialects

중간 표현(Intermediate Representation, IR)은 컴파일러가 프로그램의 구조와 의미를 분석·변환하기 위해 사용하는 내부 또는 교환용 자료 형식이다. 소스 코드에 등장하는 문장·타입·함수·연산을 추상화한 표현으로, 언어의 구문을 가까이 보존한 AST부터 제어 흐름·데이터 흐름을 명시한 저수준 IR까지 여러 형태가 존재한다. IR은 반드시 네이티브 기계어만 생성하는 단계가 아니며, 바이트코드·다른 소스 언어·검증이나 계측 결과를 출력하는 데에도 이용된다.[1]

초기의 프런트엔드는 토큰·구문 분석과 의미 검사를 수행한 후 타입 및 변수 참조가 연결된 표현을 만든다. 고수준 IR은 배열·예외·클로저·객체 또는 비동기 함수와 같은 언어별 개념을 유지할 수 있고, 하위 IR은 메모리 접근·조건 분기와 기계 명령에 가까운 연산으로 변환한다. 추상화를 점진적으로 낮추는 변환을 lowering이라고 하며 한 번의 컴파일에 여러 계층을 거칠 수 있다.

제어 흐름 그래프(CFG)는 기본 블록과 분기 관계를 표현하고, 정적 단일 할당(SSA) 방식은 값마다 하나의 정의를 갖게 하여 데이터 흐름 분석을 단순화한다. LLVM IR에는 SSA 값과 타입·메모리 모델에 관한 규칙이 있으며, GCC의 GIMPLE·RTL이나 MLIR의 dialect는 다른 수준과 추상화를 제공한다. 따라서 특정 프로젝트의 IR을 모든 컴파일러가 그대로 이해하는 범용 바이너리 포맷이라고 볼 수 없다.[2]

IR을 기반으로 상수 전파·인라이닝·죽은 코드 제거, 별칭·도달 가능성 분석과 자동 벡터화 등을 수행할 수 있다. 이후 대상 ABI와 명령어 집합에 맞춰 명령어 선택·레지스터 할당·코드 배치를 진행한다. 어떤 정보가 IR에 보존되는지에 따라 최적화의 정확성·가능 범위가 달라지므로 원래의 소스 위치와 언어 의미·부동소수점 및 정수 연산 규칙을 유지하는 일이 중요하다.

IR은 디버그 정보와 분석 자료의 교환 형식으로도 쓰이지만 실행 환경이 약속한 JVM 바이트코드나 WebAssembly 모듈과는 목적을 구분해야 한다. 컴파일러 내부 IR을 다른 VM으로 내보내기 위해서는 그 VM의 명령 집합·검증 규칙과 런타임 의미를 충족하는 백엔드가 필요하다. LLVM IR이 런타임에서 실행될 수 있는 방식이 존재해도 LLVM IR 전체가 표준 JVM 클래스 파일이라는 뜻은 아니다.

역사

개발 배경과 설계

주요 구성 요소

프로그램 분석과 중간 표현

명령어·코드 생성

지원 플랫폼과 언어

빌드·개발 도구

라이선스와 공동체

장점과 한계

영향

관련 문서

  1. LLVM Language Reference ↩
  2. MLIR: Dialect and Conversion ↩