Profile

생각정리..

Lunight

[Apple] LLVM(Low Level Virtual Machine)





LLVM(Low Level Virtual Machine) - 가상기계 bitcode를 만들어내기 때문에 붙여진 이름


간단히 설명하자면 컨파일러 모듈로써 2003년 첫 릴리즈가 되었다.


컴파일러는 보통 소스코드 -> 컴파일 -> 기계어로 구성

더 자세히 본다면



Frontend : 어휘분석 , 구문분석 , 의미분석 , 중간코드 생성

* 소스코드 파싱 , 에러체크 , 언어에 맞는 Abstract Syntax Tree(AST)생성


Optimizer : 런타임시 성능향상을 위한 중복코드를 제거해주고 기타 여라가지 변환을 실행


Backend : 각 코드를 타겟 아키텍처에 맞는 인스트럭션 셋으로 매핑해 실행코드를 생성



3가지 요소를 나눠실행하지 않고 단일 바이너리에 의해 한번에 실행한다. 


비효율성의 개선 , 아키텍처 개수 N * 소스 언어 개수 M  N*M의 컴파일러가 필요하게 되는데 이런 부분을 개선하기 위해 LLVM을 사용한다. 



LLVM은 기존의 컴파일러의 3가지 구성요소 (Frontend - optimizer - backend)를 분리해서 각각의 부분들을 조합할수 있도록 디자인하였다. 

그외에 비트코드(bitcode)라는 중간코드를 생성한다. Frontend에서 bitcode를 생성하여 Backend에서 이코드를 받아서 타겟에 맞게 바이너리를 생성한다. 


즉 ?언어를 지원하려할 때 LLVM을 사용하여 Front부분만 개발하면 여러 아키텍처를 타겟으로 빌드할 수 있다. 

(clang이 LLVM에서 C,C++,Objective-C같은 C언어 계열의 Frontend이다.)


GCC(GNU Compiler Collection)와 비교했을때, 컴파일 속도가 2배 빨라지고 빌드된 실행파일의 크기도 2~30% 감소하게 되었다. 

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

Xcode의 다양한 Instruments 기능과 Xcode IDE연동 또한 LLVM때문.


비트코드로 앱스오어에 전송된 앱(Xcode build settings - Enabled Bitcode = YES)은 사용자가 앱스토어에서 해당 앱을 다운로드 받을 때 사용자의 플랫폼에 맞게 빌드되어 전송이 가능하다. 

iOS9부터 bitcode 제출이 기본설정되어있고 Watch앱의 경우 의무이다.



'Apple' 카테고리의 다른 글

[X-code] 네비게이터 source control tag  (0) 2018.10.05