LLVM
LLVM은 "Low Level Virtual Machine"의 약자로, 다양한 프로그래밍 언어에 대해 고성능 컴파일러와 런타임 환경을 제공하는 오픈 소스 컴파일러 인프라 프로젝트이다. LLVM은 유연하고 확장 가능한 설계로 인해 많은 연구 프로젝트와 상용 소프트웨어에서 활용되고 있으며, 컴파일러 개발과 최적화 기술 연구 분야에서 중요한 역할을 하고 있다.
LLVM을 짧게 요약하자면 컴파일러 툴체인(컴파일러를 만들기 위한 도구 모음)이다!
LLVM의 github 는 아래와 같다.
https://github.com/llvm/llvm-project
LLVM의 시작
미국 일리노이 대학교의 크리스 래트너(Chris Lattner)가 2000년에 쓴 석사 논문에서 출발한 프로젝트이며, 이후 2005년에 애플이 크리스 래트너를 스카웃한 뒤 LLVM 프로젝트를 적극적으로 지원하고 있다. 크리스 래트너는 2010년에 iOS용 프로그래밍 언어 Swift를, 2022년에는 프로그래밍 언어 Mojo를 만들기도 했다.
원래 LLVM은 저레벨 가상머신(Low-Level Virtual Machine)의 약자였다.하지만 프로젝트가 확장되며 이 용어는 더 이상 사용하지 않고 LLVM 자체가 프로젝트의 정식 명칭이 된다.
LLVM에 대해 알아보자
LLVM에 대해 알아보기 전에 컴파일러의 프론트엔드, 백엔드에 대해 조금이나마 공부하고 읽기를 바란다.
웹 개발 분야의 프론트엔드, 백엔드와는 다른 개념이니 혼동하지 말기를 바란다.
1. LLVM 코어 라이브러리
LLVM 코어 라이브러리는 다양한 컴파일러 및 최적화 도구를 생성하는 데 필요한 기본 구성 요소들을 제공한다. 이 라이브러리는 중간 표현(Intermediate Representation, IR)을 중심으로 동작하며, IR은 고수준 언어와 저수준 기계어 사이의 중간 형태로, 컴파일러의 다양한 최적화 및 변환 과정을 지원한다.
2. LLVM IR (Intermediate Representation)
LLVM IR은 LLVM의 중심 개념으로, 프로그램의 소스 코드를 추상화한 중간 표현이다. IR은 하드웨어 독립적이며, 다양한 최적화 기법과 코드 생성에 사용된다. IR은 세 가지 형태로 표현될 수 있다:
- 텍스트 형식: 사람이 읽고 쓸 수 있는 형태의 IR
- 바이너리 형식: 컴퓨터가 효율적으로 처리할 수 있는 형태의 IR
- 메모리 내 형식: 컴파일러가 실행 중에 사용하는 형태의 IR
3. 컴파일러 프론트엔드
LLVM은 다양한 언어의 프론트엔드를 지원한다. 프론트엔드는 소스 코드를 분석하여 LLVM IR로 변환하는 역할을 한다. 대표적인 프론트엔드는 다음과 같다:
- Clang: C, C++, Objective-C와 같은 언어를 지원하는 프론트엔드
- LLVM-GCC: GCC 기반의 프론트엔드
4. 컴파일러 백엔드
LLVM 백엔드는 LLVM IR을 최적화하고, 특정 하드웨어 아키텍처에 맞는 기계어 코드로 변환하는 역할을 한다. LLVM은 다양한 아키텍처를 지원하며, 백엔드는 각 아키텍처에 특화된 코드 생성을 담당한다.
5. 최적화 패스
LLVM은 다양한 최적화 패스를 제공하여 프로그램의 성능을 향상시킨다. 최적화 패스는 LLVM IR을 입력으로 받아 여러 가지 최적화 기법을 적용하여 더 효율적인 IR을 생성한다. 이 과정에서 중복된 코드 제거, 루프 최적화, 메모리 접근 최적화 등이 이루어진다.
6. JIT (Just-In-Time) 컴파일러
LLVM은 JIT 컴파일 기능을 제공하여 프로그램을 실행하는 동안 동적으로 컴파일하고 최적화할 수 있다. JIT 컴파일은 주로 런타임 성능 향상과 인터프리터 기반 언어의 실행 속도를 높이는 데 사용된다.
7. 런타임 라이브러리
LLVM은 다양한 런타임 라이브러리를 포함하여, 실행 중에 필요한 기능들을 지원한다. 예를 들어, 표준 라이브러리 함수, 메모리 관리, 스레딩 등을 지원하는 라이브러리가 있다.
사용 사례
LLVM은 많은 컴파일러와 언어 런타임에서 사용되고 있으며, 대표적인 사용 사례는 다음과 같다:
- Clang: LLVM을 기반으로 하는 C/C++/Objective-C 컴파일러
- Rust 컴파일러: LLVM을 백엔드로 사용하는 Rust 언어 컴파일러
- Swift 컴파일러: 애플의 Swift 언어 컴파일러
- Julia: 고성능 과학 컴퓨팅을 위한 동적 언어로, LLVM을 JIT 컴파일러로 사용
LLVM의 유연성과 확장성 덕분에 컴파일러 개발자와 연구자들에게는 없어서는 안 될 도구가 되었다. 앞으로도 LLVM은 다양한 분야에서 더욱 널리 사용될 것으로 기대된다.
직접 llvm을 이용해 활용하고 싶다면 아래 글을 참고해보길 바란다.
https://www.cs.cornell.edu/~asampson/blog/llvm.html
llvm의 작동원리와 사용법에 대해 간단히 학습할 수 있는 좋은 자료이다.
'C' 카테고리의 다른 글
컴파일 과정 (0) | 2024.03.04 |
---|---|
8.거리와 속력을 입력하면 시간을 계산해주는 프로그램 (0) | 2019.05.16 |
7.아스키 코드(ASCII Table) (0) | 2019.05.16 |
6.나이를 입력하면 시간을 계산해주는 프로그램 (0) | 2019.05.16 |
5. 10진수를 가지고 8진수 16진수를 출력해보자 (0) | 2019.05.16 |