---
# System prepended metadata

title: LLMV 조사 진행 시켜!
tags: [조사]

---

# LLVM 조사 진행 시켜!

#### LLVM은 다양한 프로그래밍 언어를 대상으로 하는 `컴파일러` 개발 및 코드 최적화를 위한 공통 인프라를 제공하며, Swift 그리고 다른 언어(C, C++, Rust)에 대한 컴파일러와 관련된 도구를 개발하는 데 사용됩니다.
- 2000년 일리노이 대학교에서 `크리스 래트너` 외 몇명이 만들기 시작했다.
- LLVM은 중간코드(`intermediate`) / 이진(`binary`) 기계 코드를 구성, 최적화 및 생성하는데 사용되는 라이브러리.
- 프로그래머는 사람이 읽을 수 있는 프로그래밍 언어로 코드를 작성 하지만 기계는 이 언어를 이해하지 못한다 이때 컴파일러가 기계가 코드를 실행(읽을수)있게 변환 해준다.
- `intermediate` 또는 `binary machine` 코드로 내 코드를 컴파일 하는데 사용 되는 라이브러리 이다.
- 프론트 엔드 -> objectve-C, Swift, Ruby 와 같이 앱을 만들기 위해 사용하는 것

#### 프론트 엔드에 대해서 알아보자 (왜? 지금 내가 쓰는 언어가 속하니깐!)
- 프론트 엔드는 C++. C, Objc, Swift, Python, Ruby 와 같은 고-급 언어로 읽고 파싱한다.
- 파싱이 되면 이 언어들은 IR(Intermdediate Represntation)이 된다.

참조 
Clang(씨랭(개발자는이렇게말한다고한다? 정답xㅋ),클랭(처음보면이렇게말한다고한다.) 씨댕x)은 C, C++, Obective-C, 를 IR로 만드는 컴파일러이다.
Swift는 Swift-Clang

#### LLVM 의 장점 (GCC가 있는데 왜 나타났냐?)
- (모듈성) LLVM 프로젝트는 모듈성과 확장성을 강조하고 있으며 새로운 기능 추가 및 확장이 쉽다.
- (중간 표현)LLVM은 중간 표현(IR)을 사용하여 컴파일러 기능을 수행하므로,최적화하기가 훨씬 용이합니다. LLVM 기반의 컴파일러는 새로운 언어의 지원이나 최적화 기능 추가가 더 간단하고 유연하다.
- (속도)LLVM 컴파일러는 코드 최적화 및 컴파일 속도 면에서 일반적으로 GCC보다 뛰어납니다. LLVM은 최적화 기술을 적용하여 더 효율적인 기계 코드를 생성한다
-  GCC는 단일 모노리식 컴파일러로 구성되어 있어 확장이 어렵다.  

참조
중간 표현(IR, Intermediate Representation)은 컴파일러나 코드 최적화 도구에서 사용되는 추상적인 프로그램 표현입니다.

#### 애플이 왜 LLVM을 선택 했는가???
- LLVM은 모듈화된 아키텍처를 가지고 있기에, 개별적으로 개발하고 테스트할 수 있게 한다. 이렇기에 애플이 원하는대로 개발하며 최적화 하는데 유용하다.
-  LLVM은 애플의 목표와 요구 사항에 부합하는 더 좋은 선택으로 여겨졌습니다. 애플은 LLVM을 사용하여 자체 소프트웨어 스택을 개발하고 확장할 수 있어서다?.
-  애플은 회사이며, 돈을 벌기 위해서?? (자세히는 모르겠지만 추후 추가해야함.)
#### 애플이 왜 선택했는지 대해서 조금더 자세히 알고 계시다면.. 조언 좀 부탁드립니다.

참조
`GPL`과 같은 `동일 공유` 라이선스의 제한을 피할 수 있었습니다. 이렇게 해서 애플은 LLVM을 통해 자체 소프트웨어 스택을 개발하고 유지할 수 있게 되었습니다.

[참고링크](https://www.quora.com/Why-did-Apple-choose-LLVM-and-not-GCC)

### 예상질문??
- 컴파일 타임이 무엇인가요?
    - 소스코드 -> 기계어 코드로 변환 하는 과정(컴파일) 이다
- 그럼 Swift의 컴파일러는 무엇인가?
    - LLVM 입니다.
    - `크리스 래트너` 가 만들었습니다.
- 그럼 기존에 GCC가 있었는데 왜 LLVM 이 생겼을까요?
    - LLVM은 모듈화된 디자인을 갖고 있어 컴파일러 개발과 최적화를 더 용이했고 GCC는 단일 모노리식 컴파일러로 구성되어 있어 확장이 어려웠기에 선택한거 같습니다..
    - 흠.... 추가적으로 애플이 선택한 이유?
    - GCC는 GPL 라이센스를 사용하므로, 일부 경우에는 호환성 사항이 발생할 수 있습니다.(오픈의문제) 반면 LLVM은 까다롭지 않은 BSD 스타일 라이선스를 사용하므로 라이선스 제한이 덜합니다.(이부분은 애플이 원하는대로 할 수있기 때문에 브랜드화?)

---
### 여기는 추가로 진행
### 그렇다 이걸 배웠다... 야곰 기수들은.. 그치만.. 넘어갔었다.
- 와... 정말 찐면접이였다면 들어가서 1분만에 탈락이였다..
- 그래서 LLVM, LLDB 같이 하라는거였네.

| 설명.. |
|:--:|
|<img src="https://hackmd.io/_uploads/SyD1IRHJa.png" width="600"/>|


### LLDB 명령어 간단하게 추가 작성
| LLDB에서 제공하는 Command가 궁금하다면 |
|:--:|
|<img src="https://hackmd.io/_uploads/Hk6g26ry6.png" width="500"/>|

| br list 브레이크 포인트 목록 전체 출력 |
|:--:|
|<img src="https://hackmd.io/_uploads/B17uaaSkT.png" width="600"/>|

| br list -b 브레이크 포인트 목록 간단히 출력 |
|:--:|
|<img src="https://hackmd.io/_uploads/SkhhTTBya.png" width="600"/>|

| br list 1 브레이크 포인트 순서 출력 |
|:--:|
|<img src="https://hackmd.io/_uploads/SJW0paSJa.png" width="600"/>|

```swift
 breakpoint 전체 삭제
  (lldb) breakpoint delete
  (lldb) br de
  특정 breakpoint 삭제
  (lldb) br de 1
  breakpoint 전체 비할성화
  (lldb) breakpoint disable
  (lldb) br di
```

| 브레이크 포인트 화면 |
|:--:|
|<img src="https://hackmd.io/_uploads/BkAh06H16.png" width="800"/>|
프로그램에서 문제가 되는 지점을 찾아 멈추고, 여러가지 조건을 바꿔보며 테스트하기 위해서는 Breakpoint가 필수입니다.
- 1. 브레이크 포인트 숫자에 걸게 되면 그곳이 실행될때 일시정지 되어 구간 확인을 할 수있는곳.

- 2. 여기서 브레이크 포인트가 걸렸습니다?
    - 브레이크 포인트 걸리면서 현상황을 전달해주는?

- 3. Continue program execution ((lldb) continue)
    - 정지된 프로그램을 다음 실행으로 넘김 (lldb) c으로 사용 가능합니다.

- 4. Step-Over
    -  현재 Break 걸려있는 지점에서 바로 다음 Statement로 Step Over 할 수 있습니다. 줄여서 (lldb) n으로 사용 가능합니다.

- 5. Step-In
    -  Stepping In 은 다음 Statement가 Function Call 인경우 Debugger를 해당 함수 내부에 위치한 시작 지점으로 이동하게 해줍니다.(lldb) step Command를 이용해 실행 할 수 있습니다. 줄여서 (lldb) s으로 사용 가능합니다.

- 6.Step-Out
    -  현재 진행중인 function이 return 될때까지 프로그램을 진행한 후 프로그램 Break걸어주는 Stepping Action을 Stepping Out 이라고 합니다. (lldb) finish Command로 실행해볼 수 있습니다. Stack Memory 관점에서 Stepping Out은 Stack Frame을 Pop하는 것과 동일합니다.

| po 사용 |
|:--:|
|<img src="https://hackmd.io/_uploads/HyMoUCB1T.png" width="600"/>|

- 객체에 대한 다양한 정보를 Console에 출력하여 확인 할 수 있기 때문입니다. (lldb) help po를 통해 확인할 수 있다.

[LLDB 링크](https://lldb.llvm.org/use/map.html)