์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
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, though it does provide helpful libraries that can be used to build them. The name "LLVM" itself is not an acronym; it is the full name of the project.

LLVM ํ”„๋กœ์ ํŠธ๋Š” ๋ชจ๋“ˆ์‹์˜ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ํˆด์ฒด์ธ์˜ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. ์ด ์ด๋ฆ„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  LLVM์€ ๊ธฐ์กด์˜ ๊ฐ€์ƒ๋จธ์‹ ๊ณผ๋Š” ๊ทธ๊ฒƒ์„ ๋งŒ๋“œ๋Š”๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ๋นผ๊ณ ๋Š” ๊ฑฐ์˜ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. "LLVM"์ด๋ผ๋Š” ์ด๋ฆ„์€ ์•ฝ์ž๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๊ทธ๊ฒƒ์ด ํ”„๋กœ์ ํŠธ์˜ ํ’€ ๋„ค์ž„์ž…๋‹ˆ๋‹ค.
1. ๊ฐœ์š”2. ๊ตฌ์กฐ3. LLVM ํ”„๋กœ์ ํŠธ
3.1. LLVM Core3.2. Clang
3.2.1. Swift-Clang3.2.2. Flang3.2.3. Kotlin/Native3.2.4. ๊ทธ ์™ธ
3.3. LLDB

1. ๊ฐœ์š”[ํŽธ์ง‘]



์˜คํ”ˆ ์†Œ์Šค ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋กœ์ ํŠธ ๋˜๋Š” ํˆด์ฒด์ธ[1]์˜ ์ด๋ฆ„.

๋ฏธ๊ตญ ์ผ๋ฆฌ๋…ธ์ด ๋Œ€ํ•™๊ต์˜ ํฌ๋ฆฌ์Šค ๋ž˜ํŠธ๋„ˆ(Chris Lattner)๊ฐ€ 2000๋…„์— ์“ด ์„์‚ฌ ๋…ผ๋ฌธ์—์„œ ์ถœ๋ฐœํ•œ ํ”„๋กœ์ ํŠธ์ด๋ฉฐ, ์ดํ›„ 2005๋…„์— ์• ํ”Œ์ด ํฌ๋ฆฌ์Šค ๋ž˜ํŠธ๋„ˆ๋ฅผ ์Šค์นด์›ƒํ•œ ๋’ค LLVM ํ”„๋กœ์ ํŠธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. ํฌ๋ฆฌ์Šค ๋ž˜ํŠธ๋„ˆ๋Š” 2010๋…„์— iOS์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด Swift๋ฅผ ๋งŒ๋“ค๊ธฐ๋„ ํ–ˆ๋‹ค.

์›๋ž˜ LLVM์€ ์ €๋ ˆ๋ฒจ ๊ฐ€์ƒ๋จธ์‹ (Low-Level Virtual Machine)์˜ ์•ฝ์ž์˜€์ง€๋งŒ, ํ”„๋กœ์ ํŠธ๊ฐ€ ํ™•์žฅ๋˜๋ฉฐ ์ด ์šฉ์–ด๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  LLVM ์ž์ฒด๊ฐ€ ํ”„๋กœ์ ํŠธ์˜ ์ •์‹ ๋ช…์นญ์ด ๋œ๋‹ค.

2. ๊ตฌ์กฐ[ํŽธ์ง‘]

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ”„๋ก ํŠธ์—”๋“œ-๋ฏธ๋“ค์—”๋“œ-๋ฐฑ์—”๋“œ์˜ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ๋ณดํ†ต ์ด ์„ธ ๋‹จ๊ณ„๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋˜๋Š”๋ฐ, ์ด๋Ÿด ๊ฒฝ์šฐ '์–ธ์–ด์˜ ์ข…๋ฅ˜ x ์•„ํ‚คํ…์ฒ˜์˜ ์ข…๋ฅ˜'๋งŒํผ ๋ณต์ˆ˜์˜ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค. ๋‹ค์–‘ํ•œ ์–ธ์–ด์™€ ๋‹ค์–‘ํ•œ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์‹์„ฑ์ด ์ค‘์š”ํ•œ ์š”์ฆ˜ ์ด๋Ÿฌํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌ์กฐ๋Š” ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฐ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ ์ด๊ฒƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๊ตฌ์กฐ๊ฐ€ LLVM์ด๋‹ค.

์œ„์˜ ์‚ฌ์ง„์—์„œ ๋ณด์ด๋“ฏ, LLVM์€ ์•„ํ‚คํ…์ฒ˜๋ณ„๋กœ ๋ถ„๋ฆฌ๋œ ๋ชจ๋“ˆ์‹ ๋ฏธ๋“ค์—”๋“œ-๋ฐฑ์—”๋“œ๋ฅผ ์ค‘์ ์œผ๋กœ ํ•˜๊ณ  ์žˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋“ค์„ ์ค‘๊ฐ„ ํ‘œํ˜„ ์ฝ”๋“œ๋กœ ๋ฒˆ์—ญํ•˜๊ณ , LLVM์€ ๊ทธ ์ค‘๊ฐ„ ํ‘œํ˜„ ์ฝ”๋“œ๋ฅผ ๊ฐ๊ฐ์˜ ์•„ํ‚คํ…์ฒ˜์— ๋งž๊ฒŒ ์ตœ์ ํ™”ํ•˜์—ฌ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฒ˜์Œ์—๋Š” GCC๋ฅผ ํ”„๋ก ํŠธ์—”๋“œ๋กœ ํ•˜๊ณ  LLVM์€ ๋ฏธ๋“ค์—”๋“œ-๋ฐฑ์—”๋“œ๋กœ ์‚ฌ์šฉํ•˜๋Š” LLVM-GCC ํ”„๋กœ์ ํŠธ(DragonEgg)๊ฐ€ ์žˆ์—ˆ์œผ๋‚˜, LLVM์˜ ์ž์ฒด ํ”„๋ก ํŠธ์—”๋“œ์ธ Clang์ด ๋“ฑ์žฅํ•œ ์ดํ›„ ์ปดํŒŒ์ผ์˜ ์ „ ๊ณผ์ •์„ LLVM ํˆด์ฒด์ธ์œผ๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฏธ๋“ค์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋Š” LLVM Core๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ๊ฐ๊ฐ์˜ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ LLVM Core๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘๊ฐ„ ์ฝ”๋“œ LLVM IR(LLVM Intermediate Representation)๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค. LLVM IR์€ .ll ํ˜•์‹์„ ๊ฐ€์ง„ LLVM ์–ด์…ˆ๋ธ”๋ฆฌ(LLVM Assembly)[2]์™€ .bc ํ˜•์‹์„ ๊ฐ€์ง„ LLVM ๋น„ํŠธ์ฝ”๋“œ(LLVM Bitcode), ๊ทธ๋ฆฌ๊ณ  .o ํ˜•์‹์„ ๊ฐ€์ง„ C++ ๋ชฉ์  ์ฝ”๋“œ(C++ Object Code)๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค.

์ด ์ค‘์—์„œ LLVM ์–ด์…ˆ๋ธ”๋ฆฌ์™€ LLVM ๋น„ํŠธ์ฝ”๋“œ๋Š” ๋‘˜ ๋‹ค ํ•˜๋“œ์›จ์–ด ๋…๋ฆฝ์ ์ด๊ณ  ์–ด์…ˆ๋ธ”๋ฆฌ์–ด์— ๊ฐ€๊นŒ์šด ํ˜•ํƒœ๋ฅผ ์ทจํ•˜๊ณ  ์žˆ๋‹ค. ๋‹ค๋งŒ LLVM ์–ด์…ˆ๋ธ”๋ฆฌ๋Š” ์‚ฌ๋žŒ์ด ๋น„๊ต์  ์ฝ๊ธฐ ์‰ฌ์šด ์›์‹œ ์ฝ”๋“œ์™€ ์œ ์‚ฌํ•œ ๋ฐ˜๋ฉด LLVM ๋น„ํŠธ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ’์˜ ๋‚˜์—ด๋กœ ๊ตฌ์„ฑ๋œ, ์ข€ ๋” ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง„ ํ˜•ํƒœ์˜ ์ฝ”๋“œ์ด๋‹ค. ์ด๋Ÿฌํ•œ LLVM ์–ด์…ˆ๋ธ”๋ฆฌ/๋น„ํŠธ์ฝ”๋“œ๋Š” ๋ฏธ๋“ค์—”๋“œ์—์„œ ์ตœ์ ํ™”๊ฐ€ ํ•œ ๋ฒˆ ๋” ์ง„ํ–‰๋œ ํ›„ ๋ฐฑ์—”๋“œ์—์„œ ์‹ค์ œ ๊ธฐ๊ณ„์–ด๋กœ ๋ฐ”๋€Œ์–ด ์‹คํ–‰๋˜๋Š”๋ฐ, ๊ทธ ๋ฒˆ์—ญ ๋ฐฉ์‹์—๋Š” ๊ธฐ๊ณ„์–ด ์ธํ„ฐํ”„๋ฆฌํŠธ์™€ ์‹คํ–‰์ด ํ•จ๊ป˜ ์ด๋ฃจ์–ด์ง€๋Š” JIT ์ปดํŒŒ์ผ ๋ฐฉ์‹๊ณผ ๋ฏธ๋ฆฌ ๊ธฐ๊ณ„์–ด๋กœ ๋‹ค ๋ฒˆ์—ญํ•ด ๋†“๊ณ  ์‹คํ–‰ํ•˜๋Š” AOT ์ปดํŒŒ์ผ ๋ฐฉ์‹์ด ๋ชจ๋‘ ์กด์žฌํ•œ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ฐ๊ฐ์˜ ๊ธฐ๋Šฅ๋“ค์ด ๋ถ„๋ฆฌ๋˜๋ฉด ์ปค๋‹ค๋ž€ ์žฅ์ ์ด ์ƒ๊ธด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด C++ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ x86-64์™€ ARM์„ ๋Œ€์ƒ์œผ๋กœ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ๊ธฐ์กด์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๋ฉด ๊ฐ ์•„ํ‚คํ…์ฒ˜์— ๋งž๋Š” ํ”„๋ก ํŠธ์—”๋“œ-๋ฏธ๋“ค์—”๋“œ-๋ฐฑ์—”๋“œ ์ธํ”„๋ผ๋ฅผ ์ „๋ถ€ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‹ˆ ์ด 2๊ฐœ์˜ ํˆด์ฒด์ธ์ด ํ•„์š”ํ•˜์ง€๋งŒ, LLVM ํˆด์ฒด์ธ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ Clang์œผ๋กœ ์ปดํŒŒ์ผ๋งŒ ํ•˜๋ฉด ๋ชจ๋“  ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง€๋ฏ€๋กœ ์ƒ๋‹นํ•œ ํŽธ๋ฆฌํ•จ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋‹ค. ์œˆ๋„์šฐ ํ™˜๊ฒฝ์„ ์ •์‹์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” GCC๋‚˜, ์œ ๋‹‰์Šค ๊ณ„์—ด ์šด์˜ ์ฒด์ œ๋ฅผ ์ •์‹์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” VC++์™€ ๋‹ฌ๋ฆฌ ๋‘ OS๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•˜๋Š” ํฌ๋กœ์Šคํ”Œ๋žซํผ ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๋Š” ๊ฒƒ๋„ ์žฅ์ ์ด๋‹ค.

LLVM์€ ์ปดํŒŒ์ผ๋Ÿฌ ๊ฐœ๋ฐœ์ž์—๊ฒŒ๋„ ๋งŽ์€ ์žฅ์ ์ด ์žˆ๋Š”๋ฐ, ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ๋“œ๋Š” ์ชฝ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ๋ถ€ํ„ฐ ๋ฐฑ์—”๋“œ๊นŒ์ง€ ๋ชจ๋“  ๊ฑธ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋˜ ์˜ˆ์ „๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ํ”„๋ก ํŠธ์—”๋“œ ๋ฐ LLVM๊ณผ์˜ ์—ฐ๊ฒฐ๋ถ€๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด LLVM์ด ์ฝ”๋“œ ์ตœ์ ํ™”์™€ ๊ธฐ๊ณ„์–ด ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋•๋ถ„์— ํ˜„์žฌ ๋‹ค์–‘ํ•œ ์–ธ์–ด์— ๋Œ€์‘ํ•˜๋Š” ์—ฌ๋Ÿฌ LLVM ํ”„๋ก ํŠธ์—”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์ด ๋งŒ๋“ค์–ด์ง€๊ณ  ์žˆ๋‹ค.

์ด๋ฆ„์— Virtual Machine์ด ๋“ค์–ด๊ฐ€๊ธฐ๋Š” ํ•˜์ง€๋งŒ, ๊ฐ€์ƒ๋จธ์‹ ์€ ์•„๋‹ˆ๋‹ค. LLVM Core๋Š” JVM์ด๋‚˜ .NET CLR์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ•ธ๋“ค๋ง, ๋Ÿฐํƒ€์ž„ ํ™˜๊ฒฝ ๊ตฌ์ถ•, ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ ๋“ฑ์˜ ํ™”๋ คํ•œ ๊ธฐ๋Šฅ๋“ค์€ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ง€ LLVM IR์ด๋ผ๋Š” ์ค‘๊ฐ„ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ชจ๋“ˆํ™”๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ƒ์„ฑ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๊ฐ€์ƒ๋จธ์‹ ๊ณผ ์œ ์‚ฌํ•  ๋ฟ์ด๋ฉฐ, ์ด์— ๋”ฐ๋ผ LLVM์—๋Š” ๊ฐ€์ƒ๋จธ์‹ ์œผ๋กœ ์ธํ•ด ์œ ๋ฐœ๋˜๋Š” ์†๋„ ์ €ํ•˜ ์ด์Šˆ๋„ ์—†๋‹ค. ์œ„์—์„œ LLVM์ด ์•ฝ์ž๊ฐ€ ์•„๋‹Œ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒด ์ด๋ฆ„์ด๋ผ๊ณ  ๊ฐ•์กฐํ•œ ๊ฒƒ๋„ ์ด๋Ÿฌํ•œ ํ˜ผ๋™์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ธ ๋“ฏํ•˜๋‹ค.

3. LLVM ํ”„๋กœ์ ํŠธ[ํŽธ์ง‘]

3.1. LLVM Core[ํŽธ์ง‘]

LLVM ๋ฏธ๋“ค์—”๋“œ/๋ฐฑ์—”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. LLVM IR์€ ํŠน์ • ์•„ํ‚คํ…์ฒ˜๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ด๋ฉฐ, ์–ด๋–ค ์•„ํ‚คํ…์ฒ˜์— ์„ค์น˜๋œ LLVM Core๋กœ ๋นŒ๋“œํ–ˆ๋А๋ƒ์— ๋”ฐ๋ผ ํƒ€๊ฒŸ ํ”Œ๋žซํผ์ด ๊ฒฐ์ •๋œ๋‹ค. LLVM Core์—๋Š” LLVM ๋น„ํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” JIT ์ปดํŒŒ์ผ๋Ÿฌ๋„ ํฌํ•จ๋˜์–ด ์žˆ์–ด์„œ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ JIT ์ปดํŒŒ์ผ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๋งŽ์ด ์“ฐ์ธ๋‹ค.

3.2. Clang[ํŽธ์ง‘]

Clang์€ libclang๊ณผ ๊ทธ ํ”„๋ก ํŠธ์—”๋“œ๋กœ ๊ตฌ์„ฑ๋œ C, C++, Objective-C์šฉ ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค. 'ํด๋žญ'์ด๋ผ๊ณ  ์ฝ์œผ๋ฉฐ, 2007๋…„์— ์ฒซ ๋“ฑ์žฅํ•˜์˜€๋‹ค. LLVM ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”์ธ ํ”„๋ก ํŠธ์—”๋“œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ LLVM IR๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค.

GCC๊ฐ€ GPLv3๋ฅผ ์ ์šฉํ•œ ์ดํ›„ ์†Œ์Šค ์ฝ”๋“œ ๊ณต๊ฐœ๋ฅผ ๊บผ๋ฆฌ๋Š” ๊ธฐ์—…๋“ค์ด ํ•˜๋‚˜๋‘˜์”ฉ LLVM/Clang์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. LLVM๊ณผ Clang์€ University of Illinois/NCSA Open Source License(UIUC License)๋ผ๋Š” ๊ณต๊ฐœ ๋ผ์ด์„ ์Šค๋ฅผ ๋”ฐ๋ฅด๋ฉฐ, ์ด ๋ผ์ด์„ ์Šค๋Š” ์†Œ์Šค ์ฝ”๋“œ ๊ณต๊ฐœ์˜ ์˜๋ฌด๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.[3] FreeBSD๋Š” ๋ฒ„์ „ 10์—์„œ GCC๋ฅผ ๋ฐ€์–ด๋‚ด๊ณ  LLVM/Clang์ด ๋””ํดํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ, ์• ํ”Œ์€ OS X ๋งค๋ฒ„๋ฆญ์Šค์—์„œ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ๋‚จ์•„์žˆ๋˜ LLVM-GCC๋ฅผ ์ œ๊ฑฐํ•œ ํ›„ macOS์˜ ๊ธฐ๋ณธ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ Clang์œผ๋กœ ์™„์ „ํžˆ ๊ต์ฒดํ•˜์˜€๋‹ค.

์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ๋กœ MSVS์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๊ฒฝ์šฐ LLVM ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ Pre-Built Binaries: Clang for Windows๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์„ค์น˜ํ•˜๊ณ , clang-cl ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. clang-cl์€ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ Clang์œผ๋กœ, ๋ฏธ๋“ค์—”๋“œ-๋ฐฑ์—”๋“œ๋ฅผ MSVC Build Tool๋กœ ํ™œ์šฉํ•˜๋Š” ์œˆ๋„์šฐ์šฉ Clang ๊ตฌํ˜„์ฒด์ด๋‹ค. ๋‘๋ฒˆ์งธ๋กœ๋Š” MinGW๋ฅผ ํ†ตํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. MSYS2 mingw-w64์—์„œ pacman -S mingw-w64-x86_64-clang ์„ค์น˜ ํ›„ mingw64์˜ bin์„ PATH์— ๋„ฃ๊ณ  ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ MSYS Bash๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

์ฒซ๋ฒˆ์งธ์˜ ๊ฒฝ์šฐ ๋Ÿฐํƒ€์ž„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” MSVC ๋Ÿฐํƒ€์ž„์ธ msvcp๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉฐ, ํ›„์ž์˜ ๊ฒฝ์šฐ libstdc++ ๋˜๋Š” ๋ง์ปค ์˜ต์…˜์„ ํ†ตํ•ด libc++๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

LLVM/Clang์€ C++์˜ ์ƒˆ๋กœ์šด ํ‘œ์ค€์ธ C++11์„ ๊ฐ€์žฅ ๋จผ์ € ์ง€์›ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค. C++14๊ฐ€ ๋‚˜์™”์„ ๋•Œ๋„ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์˜ MSVC ์ปดํŒŒ์ผ๋Ÿฌ๋Š” C++11์กฐ์ฐจ ์ œ๋Œ€๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋“ฑ ์ƒ๋Œ€์ ์œผ๋กœ ๊ตผ๋œฌ ๋ชจ์Šต์„ ๋ณด์˜€๋˜ ๋ฐ ๋น„ํ•ด, Clang์€ ๋น ๋ฅด๊ฒŒ C++14์— ๋Œ€ํ•œ Feature Complete๋ฅผ ๋‹ฌ์„ฑํ–ˆ๊ณ  C++17์˜ ๊ธฐ๋ณธ์ ์ธ ์š”์†Œ๊นŒ์ง€ ์ ์šฉํ–ˆ๋‹ค.

Clang์˜ ์ผ๋ถ€์ธ clang-format์€ ์ค‘๊ด„ํ˜ธ๋‚˜ ํƒญ๊ณผ ๊ฐ™์€ C++ ์†Œ์Šค ์ฝ”๋“œ์˜ ์Šคํƒ€์ผ์„ ์ผ๊ด„์ ์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ  ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

3.2.1. Swift-Clang[ํŽธ์ง‘]

์• ํ”Œ์˜ iOS์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์–ธ์–ด Swift์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ. ์• ํ”Œ์ด ๊ธฐ์กด์˜ LLVM์„ ํฌํฌํ•ด์„œ ๋งŒ๋“  Swift-LLVM๊ณผ ๊ฒฐํ•ฉ๋˜์–ด ๋Œ์•„๊ฐ„๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋Š” Clang๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์Šค์œ„ํ”„ํŠธ ์†Œ์Šค ์ฝ”๋“œ์™€ LLVM IR ์‚ฌ์ด์— SIL(Swift Intermediate Language)์ด๋ผ๋Š” ๋˜๋‹ค๋ฅธ ์ค‘๊ฐ„ ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜ ๋” ์žˆ๋‹ค. ์ฆ‰ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์Šค์œ„ํ”„ํŠธ ์ฝ”๋“œ๋Š” SIL๋กœ ์ปดํŒŒ์ผ๋  ๋•Œ ํ•œ ๋ฒˆ, LLVM IR๋กœ ์ปดํŒŒ์ผ๋  ๋•Œ ํ•œ ๋ฒˆ ํ•ด์„œ ์ด ๋‘ ๋ฒˆ ์ตœ์ ํ™”๋˜๋Š” ๊ฒƒ์ด๋‹ค.

LLVM/Clang๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ UIUC License๋ฅผ ๋”ฐ๋ฅธ๋‹ค.

3.2.2. Flang[ํŽธ์ง‘]

Fortran์— ๋Œ€์‘ํ•˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ์ด๋‹ค. Clang์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ ์—”๋น„๋””์•„์—์„œ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. GCC์˜ Fortran ์ปดํŒŒ์ผ๋Ÿฌ์™€ LLVM์„ ๊ฒฐํ•ฉํ•˜๋Š” DragonEgg ํ”„๋กœ์ ํŠธ๊ฐ€ ์‚ฌ์‹ค์ƒ ์ค‘๋‹จ๋˜์–ด Fortran ์‚ฌ์šฉ์ž๋“ค์€ Flang์œผ๋กœ ๋„˜์–ด๊ฐ€๊ณ  ์žˆ๋‹ค.

3.2.3. Kotlin/Native[ํŽธ์ง‘]

๊ตฌ๊ธ€์—์„œ ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ์ฐจ์„ธ๋Œ€ ๊ณต์‹ ์–ธ์–ด๋กœ ์ง€์ •ํ•œ Kotlin์„ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผํ•˜๊ธฐ ์œ„ํ•œ Clang ๊ธฐ๋ฐ˜์˜ ํ”„๋ก ํŠธ์—”๋“œ ์ปดํŒŒ์ผ๋Ÿฌ. ์›๋ž˜ Kotlin์€ JVM ์–ธ์–ด๋กœ์„œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ JVM์— ์˜ํ•ด ์‹คํ–‰๋˜์ง€๋งŒ, LLVM ๋ฏธ๋“ค์—”๋“œ-๋ฐฑ์—”๋“œ ์ธํ”„๋ผ์™€ ๊ฒฐํ•ฉ๋œ Kotlin/Native ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์ƒ๋จธ์‹ ์— ์˜ํ•œ ์„ฑ๋Šฅ ์†์‹ค์„ ์—†์• ๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์ง์ ‘ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

3.2.4. ๊ทธ ์™ธ[ํŽธ์ง‘]

Python, Ruby, Scala, Haskell ๋“ฑ์˜ ์ผ๋ถ€ ์–ธ์–ด๋“ค๋„ LLVM ๊ธฐ๋ฐ˜์œผ๋กœ์˜ ๋ฐ”์ธ๋”ฉ์„ ์ง€์›ํ•œ๋‹ค.

3.3. LLDB[ํŽธ์ง‘]

LLVM ํ”„๋ก ํŠธ์—”๋“œ์— ๋Œ€์‘ํ•˜๋Š” ๋””๋ฒ„๊ฑฐ์ด๋‹ค. GCC์˜ GDB์™€ ๋™์ผํ•œ ํฌ์ง€์…˜์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์• ํ”Œ Xcode 5.0 ์ด์ƒ์˜ ๋ฒ„์ „์—์„œ ๊ธฐ๋ณธ ๋””๋ฒ„๊ฑฐ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. GDB๋ณด๋‹ค ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๋ฉด์„œ๋„ ๋ช…ํ™•ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์žฅ์ . ์œˆ๋„์šฐ ๋ฒ„์ „์€ ์•„์ง ๊ฐœ๋ฐœ ์ค‘์ด์ง€๋งŒ, WSL ํ™˜๊ฒฝ์„ ์ด์šฉํ•˜๋ฉด ๋ฆฌ๋ˆ…์Šค์šฉ LLDB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜๋Š” MSYS2 ํ„ฐ๋ฏธ๋„์—์„œ pacman -S mingw-w64-x86_64-lldb ์„ค์น˜๋ฅผ ํ†ตํ•ด MinGW ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

GDB์™€ ๋‹ฌ๋ฆฌ ํฌํŠธ๋ž€ ์ฝ”๋“œ์˜ ๋””๋ฒ„๊น…์€ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.
[1] Toolchain. ์—ฐ์‡„์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๋„๊ตฌ๋“ค์˜ ์ง‘ํ•ฉ์„ ๋งํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ปดํŒŒ์ผ์„ ํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ธ ์–ด์…ˆ๋ธ”๋ฆฌ์–ด ํŒŒ์ผ์„ ์–ด์…ˆ๋ธ”๋Ÿฌ๊ฐ€ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๊ณ , ๋ง์ปค๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋ฒˆ์—ญ๋œ ํŒŒ์ผ๋“ค์„ ์—ฐ๊ฒฐํ•˜๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ-์–ด์…ˆ๋ธ”๋Ÿฌ-๋ง์ปค๋Š” ํ•˜๋‚˜์˜ ํˆด์ฒด์ธ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
[2] ๊ณต์‹ ๋ ˆํผ๋Ÿฐ์Šค ๋ฌธ์„œ์—์„œ๋Š” Human-Readable Assembly๋ผ๊ณ ๋„ ํ‘œํ˜„ํ•˜๊ณ  ์žˆ๋‹ค. #
[3] MIT ๋ผ์ด์„ ์Šค์™€ BSD ๋ผ์ด์„ ์Šค๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ๋”ฐ ์™€์„œ ํ•ฉ์นœ ํ˜•ํƒœ์ด๋‹ค. GPL๊ณผ๋„ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•˜๋‹ค.