🍎 iOS/😢 ꢁ금증

[iOS] Swift의 컴파일러 _ LLVM

MINT09 2024. 3. 12. 22:57

❀️ 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