티스토리 뷰

공부

LLVM이란

Zedd0202 2020. 12. 3. 22:50
반응형

 

안녕하세요 :) Zedd입니다.

오늘은 LLVM에 대해서 공부해보겠습니다!

제 수준에 맞춰서..차근차근 공부해볼 예정입니다.

 

# 컴파일러

특정 프로그래밍 언어로 작성된 코드를 다른 프로그래밍 언어로 옮기는 프로그램. 

좁은 의미의 컴파일러는 주로 고수준 언어로 쓰인 소스 코드를 저수준 언어(어셈블리어, 기계어 등)로 번역하는 프로그램을 가리킨다.

 

# LLVM의 로고

용의 일종인 와이번. 

1977년쯤에 영향력 있는 컴파일러 서적은 표지에 용이 있었다고 한다.

뭐..이게 옛날 책들인지는 모르겠지만 컴파일러쪽에서는 용이 RxSwift의 뱀장어 느낌인 것 같다..? 

로고는 그냥 재미로 넣은건데,

WWDC발표자료에서도 이런식으로 쓰이곤 하니..알아두면 좋을 것 같다.

LLVM의 로고다.

 

# LLVM

- Low Level Virtual Machine  → 해석하면 "저수준 가상 머신". 

이것만 보고 LLVM이 특정 하나의 큰 기술...? 아무튼 하나의 가상 머신이다! 이런식으로 생각하면 안됨.

"LLVM 프로젝트"는 modular / 재사용 가능한 컴파일러(reusable compiler) / 툴체인 기술의 집합체.

LLVM이라는 이름에도 불구하고 가상 머신과 거의 관련이 없음.

⚠️LLVM이라는 이름 자체는 약어가 아님. 그냥 프로젝트의 full name일 뿐.⚠️

(The name "LLVM" itself is not an acronym; it is the full name of the project.)

 

LLVM을 보면서 Low Level Virtual Machine이라고 생각 안하면 될 것 같다.

그냥 "LLVM"인거.

 

# LLVM 프로젝트의 시작

2000년 일리노이 대학교에서 크리스 래트너(Swift만든 사람..) 외 몇명이 시작.

 

# LLVM 프로젝트

"LLVM 프로젝트"는 modular / 재사용 가능한 컴파일러(reusable compiler) / 툴체인 기술의 집합체임. 

컴파일러이자 toolkit이라고 하면 이해가 빠를듯.

LLVM 프로젝트의 서브 프로젝트로는

LLVM Core

Clang(!!)

LLDB(!!!!!)

그 외 여러가지..

github.com/llvm/llvm-project

 

llvm/llvm-project

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Note: the repository does not accept github pull requests at this moment. Please submit your patches at...

github.com

 

# 그럼 정확히 LLVM이 어떤일을 하는가?

LLVM은 중간(intermediate) / 이진(binary) 기계 코드를 구성, 최적화 및 생성하는데 사용되는 라이브러리.

App Thinning. 그리고 Bitcode 여기에도 썼는데..

 

프로그래머는 사람이 "읽을 수 있는" 프로그래밍 언어로 코드를 작성. 하지만 기계는 이 언어를 이해못함.

이때 컴파일러가 기계가 실행 할 수 있는 코드로 변환해줌. 

LLVM은 intermediate 또는 binary machine 코드로 내 코드를 컴파일 하는데 사용되는 라이브러리이다. 

LLVM에는 두 부분이 있는데,

먼저 Objective-C, Swift, Python 또는 Ruby와 같이 앱을 만들기 위해 사용하는 "프론트 엔드"

해당 앱을 컴퓨터 코드로 컴파일하는 "백엔드".

(중간을 미들엔드라고 부르기도 하나봄)

가 있다. 

https://stackoverflow.com/a/49081640

- 프론트 엔드

프론트엔드는 C++, C, Objc, Swift, Python, Ruby와 같은 고-급 언어를 읽고 파싱한다.

파싱이 되면 이 언어들은 IR(Intermdediate Reperesntation)이 된다. 

(대충 LLVM이 고급 언어들을 파싱하여 IR로 만든다는 뜻)

 

- 백엔드

백엔드는 이 IR을 가지고 최적화를 하고 최종적으로 타겟머신에 맞는 기계어로 만든다. 

https://www.omnisci.com/technical-glossary/llvm

참고로 Clang(클랭)은 C, C++, Objective-C, Objective-C++를 IR로 만드는 컴파일러이다.

Swift는 위에서 볼 수 있다시피 swiftc라고 적혀있는데 이는 Swift-Clang을 말하는 것 같다. 

기본적인 구조는 Clang과 유사하다. Swift-Clang을 거치고 나면

Swift IL(Intermediate Language)이라는 중간 언어가 또 만들어진다. (IR아니라 IL맞음)

Swift는 파싱 후 AST(Abstract Syntax Tree 추상적인 문법 트리..) 생성 후

Swift-Clang을 거쳐 SIL이 만들어진 뒤, 또 이것저것 하여 LLVM IR이 만들어지는 것이다.

Swift는 총 2번 최적화된다고 볼 수 있다.

 

일어나는 일들이 궁금하다면,

swift.org/swift-compiler/#compiler-architecture

swift.org에 있는 공식 문서를 보면 된다.

출처 : https://nshipster.com/swiftsyntax/

전체과정은 이렇게 되는 것 같다.

 

# LLVM IR

https://ko.wikipedia.org/wiki/LLVM

이렇게 생겼다고 하는 것 같다. 

 

# bitcode?

LLVM을 공부하고, App Thinning. 그리고 Bitcode 이 글을 읽으면 이러한 궁금증이 생길 수 있다. 

bitcode는 아직 기계코드도 아니고 내가 이해 할 수 있는 코드도 아닌 중간단계의 코드입니다.

라고 했는데..즉 IR이라는 거다.

그럼 LLVM IR과 bitcode의 차이점이 무엇일까?

찾아보니

LLVM IR은

  • .ll 형식을 가진 LLVM 어셈블리(LLVM Assembly)
  • .bc 형식을 가진 LLVM 비트코드(LLVM Bitcode)
  • .o 형식을 가진 C++ 목적 코드(C++ Object Code)

로 분류된다고 한다.

 

Bitcode를 on하면, 

LLVM어셈블러인 llvm-as가 LLVM IR을 LLVM bitcode로 바꿔준다.

ex. test.ll → llvm-as → test.bc

 

 

이정도...LLVM에 대해 봤는데..각잡고 정리하니까 확실히 어떤 느낌의 친구인지 알겠어요.

혹시나 틀린 내용을 발견하셨다면.. 댓글로 알려주시면 정말 감사하겠습니다.

 

참고 :

llvm.org

ko.wikipedia.org/wiki/컴파일러

stackoverflow.com/questions/2354725/what-exactly-is-llvm

namu.wiki/w/LLVM

swift.org/swift-compiler/#compiler-architecture

www.omnisci.com/technical-glossary/llvm

반응형