LLVM은 C와 C++과 같은 native language를 컴파일하는 단계에서
컴파일 중간에 코드의 일부를 변경하거나 읽어내는 Pass를 적용하는 컴파일러이다.
즉, 특정 코드들에 대해 일관되게 어떠한 처리를 하고 싶을 때 LLVM을 쓸 수 있다.
LLVM의 구조는 크게 프론트엔드(Front-end)-LLVM Optimizer-백엔드(Back-end)로 나뉜다.
LLVM이 프론트엔드에서 LLVM Optimizer로 넘어갈 때 중간 단계 표현(IR, Intermediate Representation)을 사용하는데,
이것을 줄여서 IR 코드라고 부른다.
먼저 프론트엔드에서 Native Language를 IR 코드로 번역하면,
여러개의 Pass가 이 IR 코드에 여러가지 사항을 적용하면서 최종적으로 Machine Code를 만들어낸다.
즉, Pass를 수정해 컴파일 단계에서 코드의 기작을 수정하거나, 분석할 수 있다.
C++의 경우 Clang, Go의 경우 Gollvm, 그리고 Rust의 경우 rustc가 프론트엔드에서 언어를 컴파일 한다고 한다.
우리 랩은 C/C++을 사용하기 때문에 Clang을 사용한다.
사실 LLVM은 IR이라는 새로운 언어를 사용하는 것처럼 보이지만, Clang을 Front-end로 사용하는 IR의 경우 LLVM과 관련된 구조체나 클래스들을 사용하는 C++이다. 따라서 C++을 알고 있다면 도큐먼트를 보면서 LLVM에서 어떤 클래스를 사용해야 원하는 것을 구현할 수 있을지 찾아보면서 배우면 된다.
여러번의 구글링을 통해 확인해본 결과 LLVM과 관련된 한국어 자료는 없다고 말해도 무방할 정도로 적다는 것을 확인할 수 있었다.
공대는 영어와 어쩔 수 없이 친해져야 하는 것 같다...
'LLVM' 카테고리의 다른 글
IR코드의 구성요소(Module, Function, Block, Instruction) (0) | 2021.01.26 |
---|---|
LLVM 시작 (0) | 2021.01.26 |
댓글