# 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)