티스토리 뷰
안녕하세요 :) 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(!!!!!)
그 외 여러가지..
# 그럼 정확히 LLVM이 어떤일을 하는가?
LLVM은 중간(intermediate) / 이진(binary) 기계 코드를 구성, 최적화 및 생성하는데 사용되는 라이브러리.
App Thinning. 그리고 Bitcode 여기에도 썼는데..
프로그래머는 사람이 "읽을 수 있는" 프로그래밍 언어로 코드를 작성. 하지만 기계는 이 언어를 이해못함.
이때 컴파일러가 기계가 실행 할 수 있는 코드로 변환해줌.
LLVM은 intermediate 또는 binary machine 코드로 내 코드를 컴파일 하는데 사용되는 라이브러리이다.
LLVM에는 두 부분이 있는데,
먼저 Objective-C, Swift, Python 또는 Ruby와 같이 앱을 만들기 위해 사용하는 "프론트 엔드"
해당 앱을 컴퓨터 코드로 컴파일하는 "백엔드".
(중간을 미들엔드라고 부르기도 하나봄)
가 있다.
- 프론트 엔드
프론트엔드는 C++, C, Objc, Swift, Python, Ruby와 같은 고-급 언어를 읽고 파싱한다.
파싱이 되면 이 언어들은 IR(Intermdediate Reperesntation)이 된다.
(대충 LLVM이 고급 언어들을 파싱하여 IR로 만든다는 뜻)
- 백엔드
백엔드는 이 IR을 가지고 최적화를 하고 최종적으로 타겟머신에 맞는 기계어로 만든다.
참고로 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에 있는 공식 문서를 보면 된다.
전체과정은 이렇게 되는 것 같다.
# LLVM IR
이렇게 생겼다고 하는 것 같다.
# 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에 대해 봤는데..각잡고 정리하니까 확실히 어떤 느낌의 친구인지 알겠어요.
혹시나 틀린 내용을 발견하셨다면.. 댓글로 알려주시면 정말 감사하겠습니다.
참고 :
stackoverflow.com/questions/2354725/what-exactly-is-llvm
'공부' 카테고리의 다른 글
Github Projects 사용해보기 (1) (1) | 2021.01.04 |
---|---|
왜 UIImagePickerControllerDelegate와 UINavigationControllerDelegate를 같이 써줘야할까? (1) | 2020.12.15 |
Code Coverage (2) | 2020.10.07 |
⚠️ Compiler Protocol Init Violation: The initializers declared in compiler protocol ExpressibleByArrayLiteral shouldn't be called directly. (0) | 2020.10.06 |
Dart 톺아보기 (0) | 2020.09.03 |
- Git
- IOS
- swift tutorial
- swift sort
- swift delegate
- swift3
- 회고
- Accessibility
- 스위프트 문법
- 제이슨 파싱
- np-complete
- ios 13
- Xcode
- WidgetKit
- Combine
- 피아노
- WKWebView
- np-hard
- UIBezierPath
- Swift
- SwiftUI
- iOS delegate
- fastlane
- WWDC
- swift array
- FLUTTER
- actor
- swift 공부
- 스위프트
- github
- Total
- Today
- Yesterday