LLVM

YSYD·2021년 3월 6일
0

Study

목록 보기
1/4

LLVM은 무엇인가?

  • LLVM은 약자가아닌 오픈소스 프로젝트명.
  • 2000년 일리노이 대학에서 시작되었다고 한다.
  • 재사용 가능한 컴파일러와 툴체인 모듈의 집합체이다.
  • LLVM 프로젝트는 더 이상 기존 가상 머신에 초점을 맞추지 않기 때문에 VM이라는 범위를 넘어섰다. (VM을 만드는데 도움이 될수있을 뿐)

LLVM은 어떻게 동작할까?

  • 기본적으로 compiler 는 Front End, Middle End, Back End로 구성된다.
  • Front End에서 소스코드로부터 중간코드(IR - Intermediate Representation)를 생성
  • Back End에서는 생성된 IR을 Machine Code 로 변경
  • 기본적으로는 위 Front End, Back End 2-phase design 구성이지만 현재는 Program Optimization 등을 이유로 Middle End가 포함된 3-phase design이 주를 이룬다.

[Front End]

  • 내부적으로 Scanner와 Parser로 구성된다.
  • Scanner는 Source Code를 받아 이를 lexical analysis(어휘분석 프로그램 텍스트를 단어와 토큰으로 변환)하여 Parser에 의해 syntax analysis(구문 분석-의미있는 형식으로 그룹화)및 semantic analysis(의미 분석 - 프로그램의 선언과 진술이 언어 정의에 의미적으로 부합하는지를 검사) 가 진행되어 문법적 검사를 마치고 Parser Tree를 생성한 후 최종적으로 중간코드 생성기에 의해 중간코드(intermediate Representation, IR)을 생성한다.

[Middle End]

  • Front End로부터 생성된 IR을 해석하여 최적화(Code-Optimization)하는 용도로 주로 사용한다.
  • 최적화는 실행시간 및 전력 소모 감소 등을 위한 code 최적화가 주를 이루고 최적화가 이루어지고 IR은 새로 쓰여지게 된다.

[Back End]

  • Front End/Middle End로부터 생성된 IR을 target machine에 적절한 code로 변경한다.

Apple’s LLVM-based C/C++ and Objective-C compile

  • 아래는 LLVM을 기반으로하는 C/C++/ObjectiveC를 컴파일러인 clang을 이용해 x86-64 CPU를 위한 코드를 컴파일하는 과정이다.
  • LLVM에서 기존 GCC Front-end를 사용하는 것보다 LLVM 전용의 Front-end를 두는 것이 더 빠르다고 판단하여 Clang이라고 하는 LLVM 을 위한 C language family(C/C++/Object-C 등) 전용의 Front-end를 만들었다고 한다

https://arstechnica.com/gadgets/2014/10/os-x-10-10/22/

  • 아래는 swiftc를 이용하여 x86-64 CPU를 위한 Swift code를 컴파일하는 과정이다.
  • swift컴파일러는 clang의 경우와 달리 한가지 스텝이 더 있는데, Swift Front End를 거친 후 Intermediate Language (SIL)가 생성되고, 이를 Optimize한 후 IR을 생성한다.

https://arstechnica.com/gadgets/2014/10/os-x-10-10/22/

LLVM의 장점?

위의 설명처럼 각각의 기능들이 분리되면 커다란 장점이 생긴다.

  • 예를 들어 C++ 코드를 이용하여 x86-64와 ARM을 대상으로 바이너리를 만들어야 한다고 가정할 때,
  • 기존의 컴파일러라면 각 아키텍처에 맞는 프론트엔드-미들엔드-백엔드 인프라를 전부 별도로 사용해야 하니 총 2개의 툴체인이 필요하지만, LLVM 툴체인을 사용할 경우 Clang으로 컴파일만 하면 모든 아키텍처에 대한 빌드가 가능해지므로 상당한 편리함을 누릴 수 있다.
profile
YSYD

0개의 댓글