์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
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. ๊ฐ์[ํธ์ง]
์คํ ์์ค ์ปดํ์ผ๋ฌ ํ๋ก์ ํธ ๋๋ ํด์ฒด์ธ[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์ด ์ฝ์๊ฐ ์๋ ํ๋ก์ ํธ์ ์ ์ฒด ์ด๋ฆ์ด๋ผ๊ณ ๊ฐ์กฐํ ๊ฒ๋ ์ด๋ฌํ ํผ๋์ ๋ฐฉ์งํ๊ธฐ ์ํจ์ธ ๋ฏํ๋ค.
์์ ์ฌ์ง์์ ๋ณด์ด๋ฏ, 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++ ์์ค ์ฝ๋์ ์คํ์ผ์ ์ผ๊ด์ ์ผ๋ก ์ ๋ฆฌํ๊ณ ์ ์งํ ์ ์๊ฒ ํด์ค๋ค.
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๋ฅผ ๋ฐ๋ฅธ๋ค.
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. ๊ทธ ์ธ[ํธ์ง]
3.3. LLDB[ํธ์ง]
LLVM ํ๋ก ํธ์๋์ ๋์ํ๋ ๋๋ฒ๊ฑฐ์ด๋ค. GCC์ GDB์ ๋์ผํ ํฌ์ง์
์ ๊ฐ๊ณ ์์ผ๋ฉฐ, ์ ํ Xcode 5.0 ์ด์์ ๋ฒ์ ์์ ๊ธฐ๋ณธ ๋๋ฒ๊ฑฐ๋ก ์ฌ์ฉ๋๊ณ ์๋ค. GDB๋ณด๋ค ์๋ฌ ๋ฉ์์ง๊ฐ ํจ์ฌ ๊ฐ๊ฒฐํ๋ฉด์๋ ๋ช
ํํ๋ค๋ ๊ฒ์ด ์ฅ์ . ์๋์ฐ ๋ฒ์ ์ ์์ง ๊ฐ๋ฐ ์ค์ด์ง๋ง, WSL ํ๊ฒฝ์ ์ด์ฉํ๋ฉด ๋ฆฌ๋
์ค์ฉ LLDB๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ๋๋ MSYS2 ํฐ๋ฏธ๋์์ pacman -S mingw-w64-x86_64-lldb ์ค์น๋ฅผ ํตํด MinGW ํ๊ฒฝ์์ ์ฌ์ฉํ ์๋ ์๋ค.
GDB์ ๋ฌ๋ฆฌ ํฌํธ๋ ์ฝ๋์ ๋๋ฒ๊น ์ ์ง์ํ์ง ์๋๋ค.
GDB์ ๋ฌ๋ฆฌ ํฌํธ๋ ์ฝ๋์ ๋๋ฒ๊น ์ ์ง์ํ์ง ์๋๋ค.
[1] Toolchain. ์ฐ์์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋๊ตฌ๋ค์ ์งํฉ์ ๋งํ๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ์ ํ๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋ฌผ์ธ ์ด์
๋ธ๋ฆฌ์ด ํ์ผ์ ์ด์
๋ธ๋ฌ๊ฐ ๊ธฐ๊ณ์ด๋ก ๋ฒ์ญํ๊ณ , ๋ง์ปค๊ฐ ๊ทธ๋ ๊ฒ ๋ฒ์ญ๋ ํ์ผ๋ค์ ์ฐ๊ฒฐํ๋ฏ๋ก ์ปดํ์ผ๋ฌ-์ด์
๋ธ๋ฌ-๋ง์ปค๋ ํ๋์ ํด์ฒด์ธ์ด๋ผ๊ณ ํ ์ ์๋ค.
[3] MIT ๋ผ์ด์ ์ค์ BSD ๋ผ์ด์ ์ค๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ๋ฐ ์์ ํฉ์น ํํ์ด๋ค. GPL๊ณผ๋ ํธํ์ด ๊ฐ๋ฅํ๋ค.