본문 바로가기
Programming

LLVM

by 드로니뚜벅이 2022. 4. 11.

LLVM(이전 이름: Low Level Virtual Machine)은 컴파일러의 기반구조이다. 프로그램을 컴파일 타임, 링크 타임, 런타임 상황에서 프로그램의 작성 언어에 상관없이 최적화를 쉽게 구현할 수 있도록 구성되어 있습니다.

LLVM은 원래는 저급 가상 기계(low-level virtual machine)의 약자를 가리켰지만, LLVM이 성장하고 다양한 목적을 가지게 되면서 현재는 그 이름을 약자로서 사용하는 것이 아니라 그냥 프로젝트의 이름으로서 사용하고 있습니다.

LLVM의 핵심 코드는 'LLVM 라이선스'로 배포되며, 이것은 BSD 라이선스와 비슷한 속성을 가집니다. 즉, LLVM을 사용한 프로그램을 배포하였을 때 해당 소스 코드를 공개/배포해야 하는 의무가 없습니다. 단 LLVM의 프론트엔드를 GNU 컴파일러 모음(GCC) 기반으로 사용할 경우 프론트엔드는 GPL로 배포한다. LLVM 프로젝트에서는 LLVM 라이선스를 가지는 프론트엔드를 위해, Clang이라는 프로젝트를 진행하고 있습니다.

 

LLVM으로 언어에 가상 기계를 생성, 가상 기계가 언어에 독립적인 최적화를 실행합니다. LLVM은 언어와 구조로부터 독립적이며, 언어 모듈과 시스템을 위한 코드 생성 부의 사이에 위치합니다. LLVM은 컴파일 과정 동안 최적화와 함께 JIT을 정적 컴파일러로 사용, 개발의 각종 단계에서 사용할 수 있는 많은 부분을 가지고 있습니다. LLVM은 전통적인 GCC 시스템에서 그랬듯이 코드를 정적으로 컴파일할 수도 있고, Java처럼 JIT를 이용하여 기계어(machine code)로 한 번 더 컴파일되는 중간 형식으로 코드를 컴파일할 수도 있습니다. 이말은 자바처럼 플랫폼에 독립적이란 뜻은 아닙니다.

JIT 컴파일러의 경우 런타임에 불필요한 정적 분기를 최적화하는 기능이 있는데, 이 기능은 다양한 런타임 옵션을 제공하면서 특정 환경에서는 사용되지 않는 옵션을 쉽게 식별할 수 있는 프로그램의 경우에 부분 평가(partial evaluation)를 하는데 유용합니다. Mac OS X v10.5에서는 이를 사용하여 하드웨어에서 지원하지 않는 OpenGL 파이프라인을 제공하고 있습니다.

현재 GNU 컴파일러 모음(GCC) 3.4와 4.0.1에서 빼낸 프런트 엔드를 사용하는 C 언어와 C++ 컴파일러를 지원하고 있다.

(출처: Wiki)

https://stackoverflow.com/a/49081640

LLVM 컴파일러 기본 단계

1) 어휘 분석 (Lexical Analysis) : 프로그램 텍스트를 단어와 토큰(단어를 제외한 공백, 세미콜론 등)으로 변환합니다.

2) 파싱 (Parsing) : 어휘 분석의 단어와 토큰을 의미 있는 형식으로 그룹화합니다.

3) 의미 분석기 (Semantic Analyser) : 프로그램의 타입과 로직을 식별합니다.

4) 최적화 (Optimization) : 더 나은 런타임 성능을 위해 코드를 정리하고 메모리 관련 문제를 해결합니다.

5) 코드 생성 (Code Generation) : 코드를 실행 가능한 바이너리 파일로 바꿉니다.

 

LLVM

Low Level Virtual Machine 만 보고 가상 머신 기술로 이해할 수 있습니다만 LLVM 프로젝트는 모듈러와 재사용 가능한 컴파일러 그리고 툴체인 기술의 집합체로 이해하셔야 합니다. 즉, LLVM이라는 이름과는 달리 가상 머신과는 거의 관련이 없다고 보셔야 합니다.

LLVM 이라는 이름 자체는 약어가 아니고 그냥 프로젝트의 전체 이름일 뿐입니다. (The name "LLVM" itself is not an acronym; it is the full name of the project.)

LLVM은 미국 일리노이 대학교의 크리스 래트너(Chris Lattner)가 2000년에 쓴 석사 논문에서 출발한 프로젝트이며, 이후 2005년에 애플이 크리스 래트너를 스카웃한 뒤 LLVM 프로젝트를 적극적으로 지원하고 있습니다. 크리스 래트너는 2010년에 iOS프로그래밍 언어 Swift를 만들기도 했습니다.

 

LLVM 프로젝트에는 다음 프로젝트를 포함합니다.

1) LLVM Core

source 나 target 이라는 독립한 현대적인 옵티마이저와 많은 일반적인 CPU(일반적이 아닌 것도 있다)의 코드 생성을 지원합니다. 이들 라이브러리는 LLVM intermediate representation(LLVM IR)라고 알려진 잘 정의된 코드 표현을 중심으로 구성됩니다. LLVM Core 라이브러리는 잘 문서화되어 있으므로 당신 자신이 언어를 작성(또는 기존의 컴파일러를 가져와서), 옵티마이저, 코드 생성기로 LLVM을 사용하는 것은 특히 간단합니다.

2) Clang

LLVM 네이티브인 C/C++/Objective-C 컴파일러로 놀라울 만큼 빠른 컴파일을 제공하는 것을 목적으로 하고 있습니다.

3) LLDB

LLVM과 Clang에 의해서 제공된 라이브러리 상에서 네이티브한 디버거를 제공합니다.

4) ibc++ and libc++ ABI projects

C++ 표준 라이브러리의 표준 준수와 고성능한 구현을 제공합니다.

5) 기타

 

LLVM은 오픈소스 컴파일러 개발용 종합 패키지?

GCC 등과 같은 기존 컴파일러들은 컴파일 과정에서 코드의 파싱, 파스트리, 기계어 생성, 코드 최적화 등이 명확한 구분 없이 모놀리틱하게 설계되어있어 유지보수가 어렵습니다.

LLVM은 기존 컴파일러의 고질적인 문제들을 해결하기 위해서 탄생했습니다.
LLVM은 C++로 작성되어 유지보수가 보다 편리하고, 컴파일 과정들을 각각 독립적인 모듈로 제공합니다.
그래서 이전에는 컴파일러를 제작하려면 각각의 플랫폼에 맞는 기계어로 치환하도록 일일이 손을 댔어야 했는데 LLVM은 기계어 생성이나 코드 최적화 등의 작업을 알아서 잘 처리해준다고 보시면 될 듯 합니다.

이런 까닭에 근래에 개발된 러스트(Rust)나 스위프트(Swift)와 같은 컴파일러 대부분은 이 LLVM으로 제작되었습니다.
LLVM으로 작성된 C/C++ 컴파일러인 Clang은 GCC와 동등하거나, 때로는 앞서는 실행/컴파일 성능을 보여준다고 합니다. Rust의 컴파일러도 대체로 C/C++와 동등한 성능을 보입니다.

LLVM 기능

LLVM은 중간(intermediate) / 이진(binary) 기계 코드를 구성, 최적화 및 생성하는데 사용되는 라이브러리입니다.

 

LLVM Compiler Infrastructure

Front Ends

프론트엔드는 C++, C, Object C, Swift, Python, Ruby와 같은 고급언어를 읽고 파싱합니다.

파싱이 되면 이 언어들은 IR(Intermediate Representation)이 됩니다.

 

Back Ends

백엔드는 이 IR을 가지고 최적화를 하고 최종적으로 타겟 머신에 맞는 기계어로 만듭니다.

Clang은 C, C++, Object C/C++를 IR로 만드는 컴파일러입니다.

 

 

참고 사이트

https://github.com/llvm/llvm-project

 

'Programming' 카테고리의 다른 글

Julia 프로그래밍 언어 소개  (0) 2023.06.16
프로그래밍 언어 순위  (0) 2023.06.02
Lua 기본 문법 익히기 (1)  (0) 2022.11.29
YAML & yaml-cpp 라이브러리 설치  (0) 2022.09.05
protobuf 사용하기  (0) 2022.05.09