본문 바로가기
iOS/궁금증

[iOS] Swift의 컴파일러 _ LLVM

by MINT09 2024. 3. 12.

❤️ Swift Compiler _ LLVM

LLVM은 2000년 일리노이 대학에서 Chris Lattner 외 몇 명으로 구성된 연구 팀에서 프로그래밍 언어의 정적 및 동적 컴파일을 모두 지원할 수 있는 현대적인 컴파일 전략을 제공하기 위한 연구 프로젝트로 시작되었다. intermediate / binary 기계 코드를 구성, 최적화, 생성하는 데 사용되는 라이브러리로 프로그래머가 작성한 코드를 컴퓨터가 읽을 수 있는 intermediate, binary 코드로 컴파일 하는데 사용된다.

📒 컴퓨터의 하드웨어는 Binary Code만 읽을 수 있다. 때문에 우리가 작성한 코드들을 하드웨어가 읽을 수 있게 바꿔주는 작업을 거쳐야 하는데 이때 Intermediate Representation, 즉 중간표현을 사용할 수 있다. 이 코드는 소스 코드를 표현하기 위해 거치는, 컴파일러나 코드 최적화 도구에 의해 내부적으로 사용되는 데이터 구조 혹은 코드이다. 최적화, 변환 등 추가적인 처리를 위해 설계되어 있으며, 정확도(정보의 소실 유무)와 독립성을 중요시한다. 추상적인 프로그램 표현이다.

중간 표현

 

중간 표현 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 중간 표현(intermediate representation, IR)은 소스 코드를 표현하기 위해 컴파일러나 가상 머신에 의해 내부적으로 사용되는 데이터 구조 또는 코드이다. 중간 표현은

ko.wikipedia.org

🟠 이미 존재하던 컴파일러, GCC

기존에 GCC라는 컴파일러가 이미 존재하고 있었다. 그러나 이 GCC는 단일 모놀리식(내부 요소간 의존성이 강한, 구조적인 결합이 강력한) 컴파일러로 구성되어 있어 확장이 어렵다는 단점이 있었다.

https://gcc.gnu.org/

 

GCC, the GNU Compiler Collection - GNU Project

GCC, the GNU Compiler Collection The GNU Compiler Collection includes front ends for C, C++, Objective-C, Fortran, Ada, Go, and D, as well as libraries for these languages (libstdc++,...). GCC was originally written as the compiler for the GNU operating sy

gcc.gnu.org

🟠 LLVM의 장점

확장 (모듈성)

LLVM은 각 컴포넌트들의 재사용성을 중요시해서 모듈화가 잘 되어 있다. 이를 통해 GCC의 확장이 어렵다는 단점을 해결할 수 있다.

최적화

  • Intermediate Representation을 사용하여 컴파일러 기능을 수행하기에 최적화가 용이해진다. LLVM 기반의 컴파일러는 새로운 언어의 지원이나 최적화 기능 추가가 더 간단하고 유연하다.
  • LLVM 컴파일러는 코드 최적화 및 컴파일 속도 면에서 일반적으로 GCC보다 빠르다.

The LLVM Compiler Infrastructure Project

 

The LLVM Compiler Infrastructure Project

LLVM Overview The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name "LLVM" itself is not an acronym; it is the full name of the proj

llvm.org

 

❤️ LLDB _ Low Level Debugger

  • Xcode IDE에 내장되어 있는 Command-Line Debug 환경

앞서 LLVM에서 모듈화 되어 있는 컴포넌트들을 이용해 진행된 주요 서브 프로젝트 중 하나가 바로 이 LLDB라는 Debugger이다. 기계어에 가까운 영역까지 디버깅이 가능하다는 장점이 있다.

🟠 Debuger

디버거를 사용하면 코드를 수정하지 않고도 런타임 시 프로그램이 어떻게 동작하는지 이해할 수 있기에 불필요한 빌드 시간을 줄일 수 있다. 디버거에는 실행 흐름 제어상태 접근이라는 두 가지 기본 기능이 있다. 주로 코드의 여러 위치에 Breakpoint를 설정하여 프로그램 실행을 제어한다. breakpoint에 프로그램이 도달할 때마다 디버거는 프로그램 실행을 일시적으로 중지하고, 다양한 변수의 현재 상태를 검사 또는 수정하고, 다음 statement로 넘어가거나 들어가거나 혹은 실행을 계속하는 등의 작업을 수행한다.

🟠 Stepping

  • Over
    • 현재 Break 걸려 있는 지점에서 바로 다음 Statement로 Step Over
    • (lldb) next
    • (lldb) n
  • In
    • 다음 Statement가 Function Call인 경우 Debugger를 해당 함수 내부에 위치한 시작 지점으로 이동
    • (lldb) step
    • (lldb) s
  • Out
    • 현재 진행중인 function이 return 될 때까지 프로그램을 진행한 후 Break
    • (lldb) finish

🟠 po

  • description 출력
  • NSObject의 debugDescription 출력
  • 복잡한 내용의 description 보기 쉽게 출력

About LLDB and Debugging

 

About LLDB and Debugging

About LLDB and Debugging Debugging refers to creating and using an analytical framework to isolate causal pathways and test hypotheses. The most important tool of debugging is the debugger, which helps you understand how your program behaves at runtime, wi

developer.apple.com

LLDB 정복 - 야곰닷넷

 

LLDB 정복 - 야곰닷넷

po 를 알고계신가요? 몰라도 상관없습니다. LLDB Debugging 배우러 갑시다! ?

yagom.net