LLVM
LLVM은 여러 프로그래밍 언어의 분석·최적화와 네이티브 코드 생성을 지원하는 오픈 소스 컴파일러 인프라 프로젝트다. 2000년경 대학 연구 프로젝트에서 시작했으며 현재는 Clang 프런트엔드, lld 링커, LLDB 디버거와 여러 컴파일러 런타임·도구를 포함하는 생태계로 발전했다. 원...
| 정식 프로젝트명 | LLVM Project |
|---|---|
| 분류 | 컴파일러 인프라·중간 표현·최적화 및 코드 생성 도구 |
| 초기 개발 | Chris Lattner, Vikram Adve 등 |
| 개발 시작 | 2000년경 University of Illinois |
| 주요 프로젝트 | LLVM Core, Clang, lld, compiler-rt, LLDB 등 |
| 대표 IR | LLVM IR(SSA 기반) |
| 코드 생성 | 다중 대상 아키텍처, JIT·AOT |
| 라이브러리 | 분석·최적화·백엔드·오브젝트 생성 |
| 실행기 | LLVM 라이브러리는 단일 언어 컴파일러와 별개 |
| 소스 라이선스 | Apache License 2.0 with LLVM Exceptions |
| 공식 사이트 | llvm.org |
| IR 문서 | LLVM Language Reference |
| 소스 | llvm-project |
LLVM은 여러 프로그래밍 언어의 분석·최적화와 네이티브 코드 생성을 지원하는 오픈 소스 컴파일러 인프라 프로젝트다. 2000년경 대학 연구 프로젝트에서 시작했으며 현재는 Clang 프런트엔드, lld 링커, LLDB 디버거와 여러 컴파일러 런타임·도구를 포함하는 생태계로 발전했다. 원래의 LLVM은 정적 단일 할당(SSA)에 기반한 LLVM IR과 이를 변환·최적화·코드 생성하는 라이브러리를 중심으로 설명할 수 있으며, LLVM이 곧 C·C++ 컴파일러인 것은 아니다.[1]
LLVM IR은 레지스터에 가까운 무한 가상 SSA 값과 명시적 기본 블록·분기, 타입·명령어로 프로그램을 표현한다. 입력 소스의 AST에서 더 낮은 형태로 변환된 뒤 최적화 패스가 제어·데이터 흐름을 분석하고 대상 백엔드가 기계 코드를 출력한다. IR은 사람이 읽는 텍스트·프로세스 내 자료 구조·비트코드 형태로 이용될 수 있으며, LLVM IR 자체가 JVM이나 WebAssembly의 표준 실행용 바이트코드와 동일한 것은 아니다.[2]
최적화·코드 생성은 함수·모듈 단위 패스와 대상 아키텍처별 명령 선택, 레지스터 할당·스케줄링·오브젝트 생성 등의 처리로 이루어진다. 사용자는 LLVM 라이브러리로 자체 언어 프런트엔드를 구축하거나 기존 코드를 분석·계측할 수 있다. JIT 시스템은 실행 중 코드를 생성할 수도 있고 AOT 도구는 오브젝트와 네이티브 실행 파일 제작에 참여한다.
LLVM 프로젝트는 Clang뿐 아니라 lld·LLDB·compiler-rt 등 개발 도구를 제공한다. C++ API와 C API, MLIR 등 관련 프로젝트를 통해 여러 수준의 프로그램 표현을 교환할 수 있지만 프로젝트마다 API와 명령줄 도구의 역할이 다르다. 특정 컴파일러가 LLVM 백엔드를 사용한다고 해서 프런트엔드·언어 사양과 전체 도구 체인이 LLVM과 같은 제품이 되는 것은 아니다.[3]
소스 코드는 LLVM Exceptions가 포함된 Apache License 2.0 기반으로 배포된다. LLVM은 언어 독립적인 컴파일러 최적화와 대상별 코드 생성 기술을 공유하는 구조로, 시스템 소프트웨어·모바일·GPU·브라우저 및 여러 프로그래밍 언어 구현체에 폭넓게 사용된다.