LLVM
1. 개요
1. 개요
LLVM은 모듈식이고 재사용 가능한 컴파일러 및 툴체인 기술의 집합이다. 이 프로젝트는 크리스 래트너와 비크람 애드비에 의해 시작되었으며, 2003년 8월 24일에 최초로 출시되었다. LLVM이라는 이름은 원래 "Low-Level Virtual Machine"의 약자였으나, 프로젝트의 범위가 확장되면서 더 이상 공식적인 약어가 아니며 프로젝트의 정식 명칭이 되었다.
LLVM의 핵심 아이디어는 컴파일 과정을 프론트엔드, 미들엔드, 백엔드로 명확히 분리하는 데 있다. 프론트엔드는 C++나 Swift 같은 특정 프로그래밍 언어의 소스 코드를 LLVM이 정의한 중간 표현인 LLVM IR로 변환한다. 이 중간 표현은 하드웨어 독립적이며, 이후 미들엔드에서 다양한 최적화가 수행되고, 최종적으로 백엔드에서 x86-64나 ARM 같은 특정 하드웨어 아키텍처의 기계어로 변환된다.
이러한 모듈식 설계는 컴파일러 개발과 사용에 있어 큰 장점을 제공한다. 새로운 언어를 지원하려면 해당 언어용 프론트엔드만 개발하면 되며, 새로운 CPU 아키텍처를 지원하려면 해당 백엔드만 추가하면 된다. 이는 기존의 모놀리식 컴파일러에 비해 개발 효율성을 극대화한다. 대표적인 LLVM 기반 프론트엔드로는 C 언어와 C++용 Clang이 있으며, 이는 macOS와 iOS 개발의 표준 컴파일러이다.
LLVM은 C++로 작성되었으며, 리눅스, macOS, BSD, 윈도우 등 다양한 운영체제를 지원하는 크로스플랫폼 도구이다. 라이선스는 버전 9.0.0 이전에는 NCSA 오픈 소스 라이선스를, 그 이후 버전부터는 아파치 라이선스 2.0에 LLVM 예외 조항을 포함한 형태를 사용하고 있다.
2. 구조
2. 구조
LLVM의 핵심 구조는 기존의 단일 통합 컴파일러 설계에서 벗어나, 모듈식과 재사용성을 극대화한 컴파일러 툴체인 아키텍처를 채택한다. 전통적인 컴파일러는 특정 소스 코드 언어를 특정 하드웨어 아키텍처의 기계어로 변환하는 모든 단계(프론트엔드, 미들엔드, 백엔드)를 하나의 프로그램 내에서 처리했다. 이 방식은 새로운 언어나 새로운 CPU 아키텍처를 지원할 때마다 거의 새롭게 컴파일러를 구현해야 하는 비효율성을 초래했다.
LLVM은 이 문제를 중간 표현(IR)이라는 추상화 계층을 도입하여 해결한다. 구조적으로 LLVM 기반 툴체인은 언어별 프론트엔드, 공통 미들엔드 및 백엔드, 그리고 다양한 지원 도구로 구성된다. 프론트엔드(예: Clang)의 역할은 C++나 Swift 같은 고수준 프로그래밍 언어를 하드웨어 독립적인 중간 표현인 LLVM IR로 번역하는 것이다. 이 IR은 이후 LLVM 코어 라이브러리가 담당하는 미들엔드 단계로 전달되어, 아키텍처와 무관한 다양한 최적화가 수행된다. 최종적으로 백엔드 단계에서 이 최적화된 IR은 x86-64, ARM, RISC-V 등 목표 아키텍처의 네이티브 기계어 코드로 변환된다.
이러한 분리된 구조는 엄청난 유연성과 재사용성을 제공한다. 개발자는 새로운 언어를 지원하려면 해당 언어를 LLVM IR로 변환하는 프론트엔드만 구현하면 되며, IR을 최적화하고 다양한 CPU용 코드를 생성하는 복잡한 작업은 검증된 LLVM 코어 인프라가 대신 처리한다. 반대로, 새로운 하드웨어 아키텍처를 지원하려면 해당 아키텍처용 백엔드만 LLVM에 추가하면, 기존의 모든 LLVM 호환 언어(Clang을 통한 C 언어, Flang을 통한 포트란 등)가 즉시 새 플랫폼에서 컴파일될 수 있다.
또한 LLVM IR은 정적 컴파일(AOT 컴파일)뿐만 아니라 JIT 컴파일에도 사용될 수 있어, 인터프리터나 가상머신의 성능을 향상시키는 데 널리 활용된다. 이 모듈식 설계는 GCC와 같은 전통적 툴체인에 비해 크로스플랫폼 지원과 도구 통합을 용이하게 하며, 애플의 Xcode, 구글의 안드로이드 NDK 등 현대적인 소프트웨어 개발 환경의 핵심 기반이 되었다.
3. LLVM 프로젝트
3. LLVM 프로젝트
3.1. LLVM Core
3.1. LLVM Core
LLVM Core는 LLVM 프로젝트의 핵심 구성 요소로, 컴파일러의 미들엔드와 백엔드 기능을 담당하는 라이브러리 집합이다. 이는 다양한 프로그래밍 언어의 프론트엔드가 생성한 중간 표현을 받아, 특정 하드웨어 아키텍처에 맞는 최적화된 기계어 코드로 변환하는 역할을 한다. LLVM Core의 가장 중요한 개념은 LLVM IR이라는 하드웨어 독립적인 중간 표현 형식으로, 이를 통해 하나의 코드베이스로 여러 플랫폼을 대상으로 하는 크로스 컴파일이 가능해진다.
LLVM Core는 모듈식 설계로 구성되어 있어, 컴파일러 개발자는 새로운 언어나 아키텍처를 지원할 때 전체 툴체인을 새로 만들 필요가 없다. 예를 들어, 새로운 프로그래밍 언어를 구현하려는 개발자는 해당 언어의 소스 코드를 LLVM IR로 변환하는 프론트엔드만 작성하면 된다. 이후의 코드 최적화와 타겟 CPU용 네이티브 코드 생성 작업은 LLVM Core 라이브러리가 담당한다. 이는 개발 비용을 크게 절감시키고, Clang이나 Swift 컴파일러와 같은 다양한 고품질 프론트엔드의 등장을 촉진했다.
이 라이브러리 모음에는 정적 컴파일(AOT)뿐만 아니라 JIT 컴파일러도 포함되어 있다. JIT 컴파일러는 프로그램 실행 중에 LLVM IR을 실시간으로 기계어로 변환하여 실행하는데, 이 기능은 가상 머신, 에뮬레이터, 또는 인터프리터의 성능을 향상시키는 데 널리 사용된다. LLVM Core는 macOS, Linux, Windows를 포함한 주요 운영체제를 지원하며, x86-64, ARM, RISC-V 등 다양한 프로세서 아키텍처에 대한 백엔드를 제공한다.
LLVM Core의 성공은 그 유연성과 재사용성에 기인한다. 이는 단순한 실행 엔진이 아닌, 컴파일러 기술을 구축하기 위한 강력한 인프라를 제공한다. 결과적으로 LLVM은 학계와 산업계 모두에서 컴파일러 연구와 개발의 사실상의 표준 플랫폼으로 자리 잡았으며, 애플, 구글, 엔비디아와 같은 주요 기업들에 의해 적극적으로 사용되고 발전되고 있다.
3.2. Clang
3.2. Clang
Clang은 LLVM 프로젝트의 핵심 구성 요소 중 하나로, C, C++, Objective-C, Objective-C++ 등의 언어를 위한 컴파일러 프론트엔드이다. 이는 소스 코드를 LLVM IR이라는 중간 표현으로 변환하는 역할을 담당한다. Clang은 원래 GCC의 라이선스 문제와 아키텍처적 한계를 극복하기 위해 애플의 주도하에 개발되었으며, 빠른 컴파일 속도, 낮은 메모리 사용량, 그리고 명확한 진단 메시지를 주요 목표로 삼았다.
Clang은 단순한 컴파일러를 넘어 포괄적인 툴체인 생태계를 제공한다. 이 툴체인에는 소스 코드 정적 분석 도구인 clang-tidy, 코드 포맷터인 clang-format, 언어 서버 프로토콜을 구현한 clangd 등이 포함되어 있다. 이러한 도구들은 통합 개발 환경과의 긴밀한 통합을 가능하게 하여, 개발자에게 코드 완성, 리팩토링, 실시간 오류 검사 등의 고급 기능을 제공한다.
또한 Clang은 높은 표준 준수와 크로스 플랫폼 지원으로 유명하다. 이는 다양한 C++ 표준을 광범위하게 지원하며, macOS, Linux, Windows 등 주요 운영체제에서 동작한다. 이러한 이식성과 모듈성 덕분에 Clang은 Swift 컴파일러의 기반이 되었으며, Flang과 같은 다른 언어의 프론트엔드를 구축하는 데에도 사용되는 표준 플랫폼으로 자리 잡았다.
3.3. LLDB
3.3. LLDB
LLDB는 LLVM 프로젝트의 공식 디버거이다. GCC 툴체인의 GDB와 동일한 역할을 하며, 주로 Clang 컴파일러와 함께 사용되어 C 및 C++ 프로그램의 디버깅을 지원한다. LLDB는 모듈식 설계와 LLVM의 라이브러리를 활용하여 개발되었으며, 특히 애플의 Xcode 5.0 버전부터 기본 디버거로 채택되어 macOS 및 iOS 애플리케이션 개발에 널리 사용되고 있다.
LLDB의 주요 장점은 직관적이고 강력한 명령어 인터페이스와 함께, GDB에 비해 더 간결하고 명확한 에러 메시지를 제공한다는 점이다. 또한 스크립트 언어인 Python을 내장하여 디버거 기능을 확장하거나 자동화하는 것이 가능하다. LLDB는 리눅스와 BSD 계열 운영체제에서도 정식으로 지원되며, 윈도우 환경에서는 WSL이나 MinGW를 통해 사용할 수 있다.
현재 LLDB는 C, C++, Objective-C, Objective-C++, Swift 언어의 디버깅을 완벽히 지원한다. 다만, GDB와 달리 포트란 코드의 디버깅은 공식적으로 지원하지 않는다. LLDB 프로젝트는 LLVM과 마찬가지로 오픈 소스로 개발되고 있으며, 활발한 커뮤니티를 통해 지속적으로 기능이 개선되고 있다.
3.4. lld
3.4. lld
lld는 LLVM 프로젝트의 공식 링커이다. 이는 플랫폼에 종속되지 않는 통합 링커를 목표로 개발되었으며, ELF, COFF/PE (윈도우), Mach-O (macOS), WebAssembly 등 다양한 실행 파일 포맷을 지원한다. 기존의 GNU 링커인 ld나 gold와 같은 시스템 기본 링커에 비해 속도와 메모리 효율성이 크게 개선된 것이 특징이다. 특히 대규모 프로젝트를 빌드할 때 링크 시간을 단축하는 데 효과적이다.
lld는 Clang과 같은 LLVM 기반 컴파일러와 함께 사용되도록 설계되었다. Clang에서 lld를 사용하려면 -fuse-ld=lld 옵션을 명시적으로 지정해야 한다. 이 링커는 멀티코어 CPU 환경에서 병렬 처리를 적극 활용하여 성능을 극대화한다. 예를 들어, 문자열 병합 과정에서 해시 테이블을 여러 샤드로 분할하여 각 스레드가 잠금 없이 독립적으로 작업할 수 있도록 함으로써 높은 병렬화 효율을 달성한다.
또한 lld는 링크 타임 최적화(LTO)를 내장 지원한다. Clang에서 -flto 옵션을 활성화하면, 컴파일 단계에서 생성된 중간 코드를 링크 시점에 통합하여 전역적으로 최적화할 수 있어, 최종 실행 파일의 성능과 크기를 개선하는 데 기여한다. 이러한 높은 성능과 모듈화된 설계 덕분에 lld는 크로스 컴파일 환경과 통합 개발 도구 체인에서 점차 표준 링커로 자리 잡고 있다.
3.5. MLIR
3.5. MLIR
MLIR은 Multi-Level Intermediate Representation의 약자로, 다양한 추상화 수준에서 코드를 단계적으로 변환하고 최적화하는 컴파일러 인프라이다. 구글이 2019년 개발하여 이후 LLVM의 하위 프로젝트로 통합되었다. MLIR의 핵심 아이디어는 소스 코드를 고수준 표현에서 시작해 점차 저수준 표현으로 낮추면서, 각 단계에서 해당 수준에 맞는 최적화를 적용하는 것이다. 이를 통해 최종적으로는 LLVM IR과 같은 저수준 중간 표현에 도달하게 된다.
MLIR의 가장 큰 특징은 다이얼렉트(Dialect)라는 개념이다. 다이얼렉트는 특정 추상화 수준과 도메인에 속하는 연산 및 자료형을 정의하는 네임스페이스 역할을 한다. 예를 들어, 선형대수 연산을 위한 linalg 다이얼렉트나 텐서 자료형을 위한 tensor 다이얼렉트가 있다. 하나의 코드 내에 여러 다른 다이얼렉트가 공존할 수 있으며, 같은 다이얼렉트 내에서의 변환을 Transform, 하위 수준의 다른 다이얼렉트로 변환하는 과정을 Lowering이라고 한다.
이 프레임워크는 개발자가 자신만의 다이얼렉트와 변환 규칙을 정의할 수 있도록 지원한다. 이는 머신러닝 컴파일러, 고성능 컴퓨팅, 특수 하드웨어 가속기용 컴파일러 등을 설계할 때 특히 유용하다. MLIR은 주로 CPU, GPU 등 다양한 타겟을 위한 코드 생성을 위해 사용되며, 하나의 소스 코드로부터 여러 하드웨어 아키텍처에 최적화된 바이너리를 생성할 수 있는 가능성을 제공한다.
4. LLVM 기반 컴파일러 구현체
4. LLVM 기반 컴파일러 구현체
4.1. Swift-Clang
4.1. Swift-Clang
Swift-Clang은 애플이 개발한 프로그래밍 언어 스위프트를 위한 프론트엔드 컴파일러이다. 이는 LLVM 프로젝트의 핵심 프론트엔드인 Clang을 포크하여 만들어졌으며, 스위프트 컴파일러 툴체인의 일부로 작동한다. Swift-Clang은 스위프트 소스 코드를 LLVM IR로 변환하는 과정에서 사용되며, 애플이 자체적으로 유지보수하는 Swift-LLVM 백엔드와 함께 동작한다.
Swift-Clang의 가장 큰 특징은 Clang과 유사한 구조를 가지면서도 스위프트 고유의 중간 표현인 SIL을 도입했다는 점이다. 컴파일 과정은 스위프트 소스 코드가 먼저 SIL로 변환되고, 이후 SIL이 LLVM IR로 다시 변환되는 두 단계를 거친다. 이로 인해 스위프트 코드는 SIL 단계에서 한 번, LLVM IR 단계에서 한 번, 총 두 번에 걸쳐 최적화를 받게 되어 높은 성능의 네이티브 코드를 생성할 수 있다.
이 컴파일러는 주로 iOS, macOS, watchOS, tvOS 애플리케이션 개발에 사용되며, Xcode 통합 개발 환경에 내장되어 있다. LLVM과 마찬가지로 Swift-Clang도 모듈식 설계를 채택하여 재사용성이 높으며, 애플의 소유 하에 있지만 오픈 소스 라이선스를 따른다.
4.2. Flang
4.2. Flang
Flang은 LLVM 프로젝트의 공식 구성 요소로서, 포트란 프로그래밍 언어를 위한 프론트엔드 컴파일러이다. 이는 Clang을 기반으로 개발되었으며, LLVM의 모듈식 툴체인 구조를 활용하여 포트란 소스 코드를 LLVM IR로 변환하는 역할을 담당한다. Flang의 등장으로 포트란 개발자들은 LLVM의 강력한 최적화 및 다양한 하드웨어 타겟 지원의 이점을 활용할 수 있게 되었다.
Flang의 개발은 주로 엔비디아를 포함한 여러 기관의 지원 하에 이루어지고 있다. 이전에는 GCC의 포트란 컴파일러와 LLVM을 연결하는 DragonEgg 프로젝트가 있었으나, 이는 사실상 중단된 상태이다. 이로 인해 LLVM 생태계에서 포트란을 완전히 지원하는 공식적인 컴파일러로서 Flang의 중요성이 더욱 부각되고 있다.
Flang은 포트란 언어의 현대 표준을 지원하며, 고성능 컴퓨팅 분야에서 널리 사용되는 포트란 코드의 효율적인 컴파일을 목표로 한다. 이를 통해 과학 계산 및 수치 시뮬레이션과 같은 분야의 애플리케이션이 CPU 및 GPU를 포함한 다양한 아키텍처에서 최적의 성능을 발휘할 수 있도록 한다.
4.3. Kotlin/Native
4.3. Kotlin/Native
Kotlin/Native는 JetBrains가 개발한 Kotlin 프로그래밍 언어를 네이티브 코드로 컴파일하기 위한 기술이다. 기존 Kotlin이 JVM 위에서 바이트코드로 실행되는 것과 달리, Kotlin/Native는 LLVM 컴파일러 인프라를 백엔드로 활용하여 소스 코드를 직접 머신 코드로 변환한다. 이를 통해 가상 머신의 오버헤드 없이 다양한 운영체제와 하드웨어 플랫폼에서 고성능의 독립 실행형 애플리케이션을 생성할 수 있다.
Kotlin/Native의 핵심 컴파일러는 Kotlin 소스 코드를 LLVM IR이라는 중간 표현으로 변환하는 프론트엔드 역할을 한다. 이 과정에서 Kotlin 고유의 문법과 기능(예: 널 안전성, 코루틴)이 처리된다. 생성된 LLVM IR은 이후 LLVM의 강력한 최적화 및 코드 생성 도구를 거쳐 대상 플랫폼의 네이티브 바이너리(예: 실행 파일, 정적 라이브러리, 동적 라이브러리)로 컴파일된다. 이 아키텍처는 iOS, macOS, Linux, Windows 그리고 임베디드 시스템을 포함한 광범위한 타겟을 지원하는 기반이 된다.
Kotlin/Native의 주요 활용 분야는 모바일 개발이다. 특히 Android와 iOS를 대상으로 하는 크로스 플랫폼 애플리케이션 개발에서 Kotlin 코드의 상당 부분을 공유할 수 있게 해준다. 또한 서버사이드 개발이나 명령줄 인터페이스 도구와 같이 가상 머신 없이 실행되어야 하는 환경에서도 유용하게 사용된다. Kotlin/Native는 메모리 관리를 위해 가비지 컬렉션 대신 자체 레퍼런스 카운팅 및 메모리 관리자를 구현하여 예측 가능한 성능을 제공한다.
이 기술은 Kotlin의 다중 플랫폼 지원 비전의 핵심 구성 요소로, 개발자가 단일 코드베이스로 여러 플랫폼을 대상으로 할 수 있도록 한다. Kotlin/Native 컴파일러와 런타임은 Kotlin 멀티플랫폼 모바일 프로젝트와 통합되어 있으며, 지속적으로 성능 개선과 새로운 플랫폼 지원이 확대되고 있다.
4.4. 기타
4.4. 기타
LLVM을 백엔드로 활용하는 컴파일러 구현체는 공식 프로젝트인 Clang 외에도 매우 다양하다. D 언어의 LDC 컴파일러, Go 언어의 gollvm 프로젝트, Haskell의 GHC, Julia, Lua의 LuaJIT, PHP의 HipHop Virtual Machine, Python의 Numba 및 LPython, Ruby의 RubyMotion, Rust 컴파일러, Scala의 Scala Native, TypeScript의 AssemblyScript, Zig 컴파일러 등이 대표적이다. 이들은 각 언어의 소스 코드를 LLVM IR로 변환하는 프론트엔드를 구현함으로써, 강력한 LLVM의 최적화 및 코드 생성 인프라를 공유하고 다양한 하드웨어 플랫폼을 지원할 수 있다.
특히 크리스 래트너가 창시한 새로운 언어 Mojo는 LLVM 기반의 MLIR 인프라를 적극 활용하여 고수준의 추상화와 저수준의 성능을 동시에 달성하는 것을 목표로 한다. 이러한 광범위한 채택은 LLVM의 모듈식 설계와 재사용 가능한 컴파일러 라이브러리라는 본래 목적이 성공적으로 실현되고 있음을 보여준다.
이들 구현체는 언어마다 고유한 문법과 의미 체계를 LLVM Core 라이브러리가 이해할 수 있는 중간 표현으로 정확히 매핑하는 프론트엔드를 개발하는 데 주력한다. 일단 LLVM IR이 생성되면, 나머지 최적화와 특정 CPU 아키텍처에 대한 기계어 생성 작업은 검증된 LLVM 백엔드에 위임된다. 이는 컴파일러 개발자에게는 개발 부담을 줄여주고, 최종 사용자에게는 고도로 최적화된 네이티브 코드의 이점을 제공하는 선순환 구조를 만든다.
5. 역사와 개발
5. 역사와 개발
LLVM의 역사는 2000년 미국 일리노이 대학교 어배너-섐페인의 대학원생이었던 크리스 래트너의 석사 논문에서 시작된다. 그의 연구는 기존 컴파일러의 모놀리식 구조를 개선하고, 모듈화된 재사용 가능한 컴파일러 기술을 만드는 것이었다. 이 연구는 2003년 8월 24일 최초로 공개되며 LLVM 프로젝트의 첫 출발을 알렸다. 당시 LLVM은 'Low-Level Virtual Machine'의 약자였으나, 프로젝트가 확장되면서 가상머신과의 직접적 연관성이 줄어들었고, 이후 약어 해석을 버리고 'LLVM' 자체가 프로젝트의 공식 명칭이 되었다.
2005년, 애플은 크리스 래트너를 스카웃하며 LLVM 개발을 적극적으로 후원하기 시작했다. 애플의 지원은 프로젝트 발전에 큰 동력이 되었으며, 이를 바탕으로 LLVM을 백엔드로 사용하는 자체 C/C++ 프론트엔드인 Clang이 개발되었다. Clang의 등장은 기존 GCC에 대한 의존성을 줄이고, 컴파일 전 과정을 LLVM 툴체인으로 완성할 수 있는 기반을 마련했다. 이후 LLDB 디버거, lld 링커 등이 차례로 개발되며 포괄적인 컴파일러 생태계를 구축하게 된다.
라이선스 측면에서도 중요한 변화가 있었다. 초기 LLVM은 NCSA 오픈 소스 라이선스를 사용했으나, 9.0.0 버전(2019년) 이후로는 아파치 라이선스 2.0에 LLVM 예외 조항을 포함한 형태로 변경되었다. 이 라이선스 변경은 LLVM 코드를 상용 제품에 통합하는 데 있어 더 나은 법적 명확성을 제공하기 위한 것이었다.
시간이 지나며 LLVM은 단순한 컴파일러 백엔드를 넘어 다양한 분야로 확장되었다. 2019년 구글이 개발한 고수준 컴파일러 인프라인 MLIR이 LLVM의 하위 프로젝트로 통합된 것은 대표적인 사례이다. 또한 스위프트, 러스트, 코틀린 등 현대적인 프로그래밍 언어들이 LLVM을 주요 백엔드로 채택하며, 그 영향력은 계속해서 확대되고 있다.
6. 라이선스
6. 라이선스
LLVM 프로젝트는 오픈소스 라이선스로 배포된다. 초기 버전부터 9.0.0 이전까지는 일리노이 대학교 어버너-섐페인이 개발한 NCSA 오픈소스 라이선스를 사용했다. 이 라이선스는 MIT 라이선스와 BSD 라이선스의 조합으로 간주될 수 있으며, 사용 조건이 매우 관대한 특징을 가진다.
버전 9.0.0부터는 라이선스가 아파치 라이선스 2.0으로 변경되었다. 이 변경은 더 넓은 기업 친화적 채택과 특허 소송으로부터의 보호 강화를 목표로 했다. 특히, LLVM 프로젝트는 아파치 라이선스 2.0에 'LLVM 예외 조항'을 추가하여 적용한다. 이 예외 조항은 LLVM 프로젝트의 코드를 컴파일러의 백엔드로 사용하여 생성된 출력물(즉, 컴파일된 바이너리)에 대해 라이선스의 저작권 고지 의무가 적용되지 않도록 명시한다. 이는 GCC의 런타임 라이브러리 예외와 유사한 역할을 하여, LLVM으로 컴파일된 프로그램을 자유롭게 배포할 수 있게 보장한다.
라이선스 변경은 하위 호환성을 유지하며 진행되었다. 즉, 이전 NCSA 라이선스로 배포된 코드는 해당 라이선스 하에 계속 사용할 수 있다. LLVM의 핵심 구성 요소인 LLVM Core, Clang, LLDB, lld 등은 모두 동일한 라이선스 정책을 따른다. 이러한 개방적 라이선스 정책은 LLVM이 애플, 구글, 엔비디아 등 다양한 주요 기업의 지원을 받으며 생태계를 빠르게 확장하는 데 기여했다.
7. 여담
7. 여담
LLVM이라는 이름은 원래 저수준 가상머신(Low-Level Virtual Machine)의 약자였다. 하지만 프로젝트의 범위가 확장되고, 실제로는 전통적인 가상머신과는 거의 관련이 없는 컴파일러 인프라로 발전하면서, 이 약어는 더 이상 공식적으로 사용되지 않는다. 현재는 LLVM 자체가 프로젝트의 정식 명칭이다. 이는 이름으로 인한 오해를 방지하기 위한 것으로, LLVM은 JVM이나 .NET CLR과 같은 런타임 환경이나 메모리 관리 기능을 제공하지 않는다.
LLVM의 창시자인 크리스 래트너는 이 프로젝트를 일리노이 대학교에서 석사 논문으로 시작했다. 이후 그는 애플에 스카웃되어 LLVM 개발을 지속했으며, 애플은 이 프로젝트를 적극적으로 지원하게 된다. 흥미롭게도 래트너는 이후 애플의 공식 프로그래밍 언어인 스위프트를 창안하기도 했다.
LLVM의 모듈화된 설계는 컴파일러 개발에 혁신을 가져왔다. 개발자는 새로운 프로그래밍 언어를 위한 프론트엔드만 구현하면, 나머지 복잡한 코드 최적화와 다양한 CPU 아키텍처(x86-64, ARM 등)에 대한 기계어 생성 작업은 LLVM이 담당한다. 이 덕분에 Rust, Zig, 스위프트를 비롯한 수많은 현대적인 언어들이 LLVM을 백엔드로 채택하여 빠르게 개발되고 있다.
