Clang/LLVM은 컴파일러 도구 체인을 구성하는 기술 묶음이다.
- LLVM: 컴파일러를 만들기 위한 공통 기반 인프라
- Clang: LLVM 위에서 동작하는 C / C++ / Objective-C 컴파일러 프론트엔드
LLVM ?
LLVM은 원래 Low Level Virtual Machine에서 시작했지만, 지금은 의미가 확장되어
컴파일러를 만들기 위한 모듈형 컴파일러 인프라 전체
를 가리킨다.
LLVM의 핵심 아이디어
- 언어에 독립적인 중간 표현(IR, Intermediate Representation) 사용
- 프론트엔드 / 옵티마이저 / 백엔드를 분리
- 다양한 언어와 CPU 아키텍처를 쉽게 지원
LLVM 구조 (개념)

소스 코드
↓
[프론트엔드] ── 언어별
↓
LLVM IR ─ LLVM의 핵심
↓
[옵티마이저] ─ 공통
↓
[백엔드] ─ 아키텍처별 (x86, ARM, RISC-V …)
↓
기계어
LLVM 자체는 컴파일러가 아니라 플랫폼에 가깝다.
Clang ?
Clang은 LLVM 프로젝트에서 제공하는 C 계열 언어용 컴파일러 프론트엔드다.
Clang이 하는 일
- C / C++ / Objective-C 소스 파싱
- AST(Abstract Syntax Tree) 생성
- LLVM IR 생성
- 에러 메시지 생성
즉,
Clang = “C/C++ 언어를 LLVM IR로 바꿔주는 역할”
이다.
Clang vs GCC
자주 비교되는 대상이 GCC다.
구조 차이
| 항목 | Clang/LLVM | GCC |
|---|---|---|
| 구조 | 모듈형 (프론트/백엔드 분리) | 단일 프로젝트 |
| 중간 표현 | LLVM IR | GIMPLE / RTL |
| 에러 메시지 | 매우 친절 | 비교적 딱딱 |
| 컴파일 속도 | 빠른 편 | 느린 편 |
| 툴 연계 | 분석/포맷/정적분석 풍부 | 전통적 |
에러 메시지 예시 느낌
Clang:
error: expected ';' after expression
foo()
^
GCC:
error: expected ';' before '}'
Clang이 “사람이 읽기 쉬운 컴파일러”라는 말이 나오는 이유다.
왜 요즘 Clang/LLVM을 많이 쓰나
1. 커널·시스템 개발에서 중요해짐
- Linux kernel도 Clang 빌드 공식 지원
- sanitizer(KASAN, UBSAN, TSAN 등)와 궁합이 좋음
- BPF / eBPF 생태계와 밀접
2. 분석 도구가 강력함
- clang-tidy
- clang-format
- clang-analyzer
- LLVM sanitizer 계열
3. 다양한 언어가 LLVM 위에 올라감
- Rust
- Swift
- Julia
- Zig
즉,
LLVM = 현대 컴파일러 생태계의 공용 토대
가 되었다고 보면 된다.
정리하면?
- LLVM은 컴파일러를 만들기 위한 공통 인프라
- Clang은 C/C++을 LLVM IR로 변환하는 프론트엔드
- GCC는 전통적 올인원 컴파일러, Clang/LLVM은 모듈형 생태계
- 커널, BSP, 성능 분석, sanitizer 쪽에서는 Clang/LLVM 비중이 계속 커지는 중