본문 바로가기

TOOL/Common

LLVM / clang

Complier


Compiler는 보통 Frontend, Optimzer, Backend의 3가지 구성요소를 가지고 있다.


일반적인 Compiler 구조


Frontend


Lexical(어휘분석), syntax analysis(구문분석), Semantic analysis(의미분석), Immediate code generation(중간코드 생성)

source code parsing, error check, Language에 맞는 Abstract Syntax Tree(AST)작성


Optimizer


runtime시 성능 향상을 위해 중복계산 제거 및 기타 여러 변환 실행


Backend


각 code를 target architecture에 맞는 instruction set으로 매핑해 실행code 생성



하지만 일반적인 compiler에서 이 3가지 구성요소는 나눠져서 실행되지 않고 단일 바이너리에 의해 한번에 실행된다.


즉 compiler가 다양한 language로 작성된 source code를 다양한 architecture를 target으로 compile하고자 한다면

Number of Architecture(N) * Number of Langauge(M), 즉 N * M개의 compiler가 필요하게 된다.


이러한 비효율성을 개선하여 interface와 library의 재사용성을 위해 나온것이 LLVM이다.





LLVM(Low Level Virtual Machine)


LLVM은 기존의 compiler의 3가지 주요 구성요소를 분리해서 각각의 부분들을 조합할 수 있게 디자인 하였다.


Frontend, Optimizer, Backend를 분리한 LLVM의 디자인


LLVM이 기존의 compiler의 3가지 구성요소를 분리했다는 것 외에 가장 다른 점은 바로 bitcode라는 IR(Intermediate Representation, 중간코드)를 생성한다는 것 이다.

그래서 Frontend에서는 bitcode를 생성하고 Backend에서는 이 code를 받아서 target에 맏는 결과물을 생성한다.

이 bitcode를 사용함으로서 얻는 장점은 효율성과 확장성이다.


만약 일반적인 compiler가 새로운 language를 지원한다고 가정하고 해당 language를 K라고 할때 K언어를 x86 architecture,

PowerPC, ARM등 각기 다른 architecture의 기계어를 생성하려면 3개의 compiler를 작성해야하고 compiler 각각의

Frontend, Optimiser, Backend를 구현해주어야 한다.


하지만 LLVM을 사용하면 K언어의 Frontend부분만 개발하면 여러 architecture를 target으로 build할 수 있다.


또한 LLVM덕분에 GCC(GNU Compiler Collection)와 비교했을때 compile속도는 2배 빨라지고

build된 실행파일의 크기도 줄일 수 있었고 실행속도 또한 파일의 크기가 줄어든것과 비례해 빨라졌다.


또한 LLVM이 있기때문에 Block을 지원하고 GCD(Grand Central Dispatch)가 가능해졌다.

Xcode의 다양한 Instruments기능과 Xcode IDE와의 연동 역시 LLVM 덕분이다.





IDE에서의 실시간 문법체크도 LLVM을 사용하기에 가능하다.


Bitcode로 appstore에 전송된 app은 user가 appstore에서 해당 app을 download할때 user가 사용하고 있는 platform에 맞게

build되어서 전송될 수 있다.






clang


clang은 LLVM에서 C, C++, Objective-C와 같은 C언어 계열의 frontend이다.








참고

http://kyejusung.com/2015/11/llvm%EC%9D%B4%EB%9E%80-clang-%EB%B9%84%ED%8A%B8%EC%BD%94%EB%93%9C-%ED%8F%AC%ED%95%A8/