Skip to content

Latest commit

 

History

History
89 lines (50 loc) · 5.07 KB

231129-LLVM.md

File metadata and controls

89 lines (50 loc) · 5.07 KB

The LLVM Compiler Infrastructure 🤿

LLVM 프로젝트는 모듈식이고 재사용이 가능한 컴파일러 및 툴체인 기술의 모음입니다. 이름과 달리, LLVM은 전통적인 가상 머신과는 거의 관련이 없습니다. "LLVM"이라는 이름 자체는 약어가 아니라 프로젝트 전체 이름입니다.

LLVM은 일리노이 대학교에서 연구 프로젝트로 시작되었으며, 정적 및 동적으로 다양한 프로그래밍 언어를 컴파일 할 수 있는 현대적인, SSA(Static Single Assignment)-기반 컴파일 전략을 제공하는 것을 목표로 했습니다.

이후 LLVM은 상용 및 오픈 소스 프로젝트뿐만 아니라 학술 연구에서도 널리 사용되는 여러 하위 프로젝트를 포함하는 산하 프로젝트(umbrella project)로 성장했습니다.

LLVM 프로젝트의 코드는 "Apache 2.0 라이선스에 LLVM 예외 사항이 적용된" 라이선스로 제공됩니다.

LLVM의 주요 하위 프로젝트는 다음과 같습니다.

1️⃣ LLVM의 주요 하위 프로젝트

1. LLVM Core 라이브러리.

현대적인 소스 및 대상 독립 최적화기를 제공하며, 많은 인기가 있는 CPU(그리고 일부 덜 흔한 것들!)에 대한 코드 생성 지원을 제공합니다.

이 라이브러리는 LLVM 중간 표현("LLVM IR")으로 잘 정의된 코드 표현을 중심으로 구축되어 있습니다.

LLVM Core 라이브러리는 잘 문서화되어 있으며, LLVM을 최적화기 및 코드 생성기로 사용하여 자체 언어를 발면라거나 기존 컴파일러를 이식하기가 특히 쉽습니다.

2. Clang.

"LLVM 네이티브" C, C++, Objective-C 컴파일러로, 놀라울 정도로 빠른 컴파일, 매우 유용한 오류 및 경고 메시지 제공, 그리고 훌륭한 소스 레벨 도구 구축 플랫폼을 목표로 합니다.

Clang Static Analyzer와 clang-tidy는 코드에서 자동으로 버그를 찾는 도구로, Clang 프론트엔드를 사용하여 C,C++ 코드를 구문 분석하는 라이브러리로 만들 수 있는 도구의 훌륭한 예입니다.

3. LLDB 프로젝트.

LLVM 및 Clang에서 제공하는 라이브러리를 기반으로 훌륭한 네이티브 디버거를 구축합니다. Clang AST 및 표현식 파서, LLVM JIT, LLVM 디스어셈블러 등을 사용하여 "그냥 작동하는" 경험을 제공합니다. 또한 GDB보다 훨씬 빠르고 심불을 로드하는 데 메모리 효율성이 더 높습니다.

4. libc++ 및 libc++ ABI 프로젝트.

C++ 11 및 C++ 14 에 대한 전체 지원을 포함하여 C++ 표준 라이브러리의 표준 준수 및 고성능 구현을 제공합니다.

5. compiler-rt 프로젝트.

"fixunsdfdi"와 같은 저수준 코드 생성기 지원 루틴의 고도로 튜닝된 구현을 제공합니다. 또한 AddressSanitizer, ThreadSanitizer, MemorySanitizer, DataFlowSanitizer 와 같은 동적 테스팅 도구를 위한 런타임 라이브러리의 구현도 제공합니다.

6. MLIR 하위 프로젝트.

재사용 가능하고 확장 가능한 컴파일러 인프라를 구축하기 위한 새로운 접근 방식입니다. MLIR은 소프트웨어 단편화 해결, 이질적인 하드웨어 컴파일 개선, 특정 도메인 컴파일러 구축 비용 대폭 감소, 기존 컴파일러 연결 지원을 목표로 합니다.

7. OpenMP 하위 프로젝트.

Clang의 OpenMP 구현과 함꼐 사용할 OpenMP 런타임을 제공합니다.

8. polly 프로젝트.

다차원 모델을 사용하여 캐시-지역성 최적화뿐만 아니라 자동 병렬화 및 백터화를 구현합니다.

9. libclc 프로젝트.

OpenCL 표준 라이브러리를 구현하려고 합니다.

10. klee 프로젝트.

이론 증명기를 사용하여 프로그램의 모든 동적 경로를 평가하려고 시도하는 "기호 가상 머신"을 구현합니다. 버그를 찾고 함수의 속성을 증명하는 데 목적이 있습니다. klee의 주요 기능 중 하나는 버그를 감지하면 테스트케이스를 생성할 수 있다는 것입니다.

11. LLD 프로젝트.

새로운 링커로, 시스템 링커를 대체할 수 있으며 훨씬 더 빠르게 실행됩니다.

12. BOLT 프로젝트.

포스트-링크 최적화기로, 샘플링 프로파일러에 의해 수집된 실행 프로파일을 기반으로 애플리케이션의 코드 레이아웃을 최적화하여 개선을 달성합니다.


LLVM의 공식 하위 프로젝트 외에도 LLVM의 구성 요소를 다양한 작업에 사용하는 여러 다른 프로젝트가 있습니다. 이러한 외부 프로젝트를 통해 Ruby, Python, Haskell, Rust, D, PHP, Pure, Lua, Julia 등 다양한 언어를 LLVM을 사용하여 컴파일할 수 있습니다.

LLVM의 주요 강점은 그 다양성, 유연성 및 재사용성으로, Lua의 경량 JIT 컴파일부터 대규모 슈퍼컴퓨터용 Fortran 코드 컴파일에 이르기까지 다양한 작업에 사용되고 있습니다.


참고 자료 📚