Science&Enigneering

LLVM이란

##- 2023. 4. 13. 19:53
728x90

LLVM은 Low Level Virtual Machine의 약자입니다. 이는 컴파일러 기술에 관련된 오픈소스 프로젝트로, 코드 생성 및 최적화, 프로그램 언어 변환 및 실행 등을 위한 다양한 도구들을 제공합니다. LLVM의 핵심은 중간 코드 형태인 LLVM IR(Intermediate Representation)입니다. LLVM은 대부분의 주요 CPU 아키텍처와 함께, iOS와 macOS 등 Apple의 운영 체제에서 기본 컴파일러로 사용됩니다. 또한, LLVM은 다양한 언어 및 프레임워크의 컴파일러 및 인터프리터로 사용되며, 다양한 분야에서 널리 사용되고 있습니다.

 

https://blog.gopheracademy.com/advent-2018/llvm-ir-and-go/


LLVM은 다음과 같은 과정을 거쳐서 컴파일됩니다.

 

1. 전처리기(Preprocessor) : C, C++, Objective-C, Swift 등의 소스 코드에서 #include, #define 등과 같은 전처리 지시어를 처리합니다.

2. 파서(Parser) : 소스 코드를 토큰(Token) 단위로 나누고, 이를 파싱하여 AST(Abstract Syntax Tree)를 생성합니다.

3. 코드 생성기(Code generator) : AST를 분석하여 목적 코드(Object code)를 생성합니다.

4. 목적 코드 생성기(Object code generator) : 목적 코드를 생성하고, 이를 오브젝트 파일(Object file)로 저장합니다.

5. 링커(Linker) : 여러 오브젝트 파일을 하나의 실행 파일(Executable file)로 링크합니다.

LLVM의 특징 중 하나는 LLVM IR(Intermediate Representation)을 중간 코드 형태로 사용한다는 것입니다. 이를 통해 여러 컴파일러 및 도구들이 LLVM IR을 입력으로 사용하여 최적화 및 변환을 수행할 수 있습니다. 또한, LLVM은 다양한 CPU 아키텍처에 대한 목적 코드 생성기를 포함하고 있어서, 특정 아키텍처에 종속되지 않는 이식성 높은 코드 생성을 지원합니다.

 

https://blog.gopheracademy.com/advent-2018/llvm-ir-and-go/ 의 예제 프로그램

C 코드

int f(int a, int b) {
    return a + 2*b;
}

int main() {
    return f(10, 20);
}

Clang을 이용하여 LLVM IR 로 변환

define i32 @f(i32 %a, i32 %b) {
; <label>:0
    %1 = mul i32 2, %b
    %2 = add i32 %a, %1
    ret i32 %2
}

define i32 @main() {
; <label>:0
    %1 = call i32 @f(i32 10, i32 20)
    ret i32 %1
}

 

300x250