Compiler, Interpreter and JIT/AOT
Types and roles of compilers
1. Role of the Compiler ๐ฉโ๐ป
1. Low-level/High-level Language
์ฐ๋ฆฌ๋ ์์ด๋ผ๋ ์ธ์ด๋ก ์ฝ๋๋ฅผ ์์ฑํ์ง๋ง ์ปดํจํฐ๋ 0๊ณผ 1๋ฐ์ ์ธ์ํ์ง ๋ชป ํ๋ค. ๋ฐ๋ผ์ ์ฌ๋์ด ์ฝ๊ณ ์ฐ๊ธฐ ์ฝ๊ฒ ์์ฑ๋ ํํ์ ์ธ์ด๋ฅผ
High-level Language
๋ผ ๋ถ๋ฅด๋ฉฐ, ์ปดํจํฐ๊ฐ ์ดํดํ๊ธฐ ์ฌ์ด ์์ค์ ์ธ์ด๋ฅผ Low-level Language
๋ผ ๋ถ๋ฅธ๋ค.
- High-level Language: C, C++, JavaScript, Swift, Python, Haskell ๊ณผ ๊ฐ์ ์ธ๊ฐ ์นํ์ ์ธ์ด๋ฅผ ์๋ฏธํ๋ค.
- Low-level Language: Machine Language, Assembly Language ์ ๊ฐ์ ์ปดํจํฐ ์นํ์ ์ธ ์ธ์ด๋ฅผ ์๋ฏธํ๋ค.
Low-level Language ๋ ์ฝ๊ธฐ ์ด๋ ค์ธ ๋ฟ ์๋๋ผ ํ๋์จ์ด๋ฅผ ์ง์ ์กฐ์ํ๊ธฐ ๋๋ฌธ์ ํ๋์จ์ด์ ์ข
์์ ์ด๋ค. ๋ฐ๋ผ์ Low-level Language ๋ก
์ง์ ๊ฐ๋ฐํ๋ ๊ฒ์ ์์ฐ์ฑ๋ ๋ฎ์ ๋ถ ์๋๋ผ ์ ์ง๋ณด์ํ๊ธฐ๋ ์ด๋ ต๋ค. ๋ฐ๋ผ์ High-level Language ๋ก ๊ฐ๋ฐํ๊ณ ์ด๋ฅผ Low-level Language ๋ก
๋ณํํ๋ ์์
์ ๊ฑฐ์น๋๋ฐ ์ด ์์
์ Compiler
๊ฐ ํ๋ค.
2. Machine Language
์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ๊ฐ์ฅ ๋ฎ์ ๋ ๋ฒจ์ ์ธ์ด๋ค. ๊ธฐ๊ณ์ด๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ์ด์ง์๋ก ํํ๋๋ฉฐ, ์ด๋ฅผ CPU ์ ์ง์ ์ ๋ฌํ๋ค. ๋ฐ๋ผ์ CPU ์ ์ง์ ์ํธ์์ฉ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋น ๋ฅธ ์๋๋ฅผ ๊ฐ๋๋ค.
3. Assembly Language
์ด์ ๋ธ๋ฆฌ์ด๋ ๊ธฐ๊ณ์ด๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ณํํ ์ธ์ด๋ค. CPU ์ ๋ช ๋ น์ ์ ๋ฌํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ, ๊ธฐ๊ณ์ด์ 1:1 ๋์๋๋ค. ๋จ, ์ฝ๊ธฐ ์ฝ๊ฒ ๋ณํํ๋ค๋ ์๋ฏธ๋ ๊ทธ์ 0101 ์ด๋ฐ์์ ์ด์ง์๋ฅผ ABCD ๋ฅผ ์ด์ฉํ ์ฝ๋๋ก ๋งคํํด๋์ ๊ฒ์ ๋ถ๊ณผํ ๋ฟ์ด๋ค. ๋ฐ๋ผ์ CPU ๊ฐ ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ์ด์ ๋ธ๋ฆฌ์ด๋ ๋ณ๊ฒฝ๋๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋ฐํ ๋ ์ฌ์ฉํ๋ High-level Language ์๋ ํ์ฐํ ๋ค๋ฅธ ์ธ์ด์ด๋ค.
4. Bytecode
Java ๋ .NET ๊ณผ ๊ฐ์ Virtual Machine ์ ์ฌ์ฉํ๋ ์ธ์ด์์ ์ฌ์ฉ๋๋ ์ค๊ฐ ์ธ์ด๋ค. ์์ ํ High-level Language ๋ ์๋๊ณ , ๊ทธ๋ ๋ค๊ณ ์ปดํจํฐ๊ฐ ์ดํดํ ์ ์๋ ์์ค์ Low-level Language ๋ ์๋๋ค. ์ ์ฌ์ฉํ๋๊ฑธ๊น?
๋ฐฐํฌํ ์ฝ๋๊ฐ ํ๋ซํผ์ ์ข ์๋์ง ์๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๋ค. JIT Compile ์ ํ๊ฑฐ๋ Interpreter ๋ฅผ ์ด์ฉํด ์ฝ๋๋ฅผ ์ฝ์ด ๋ด๋ ค๊ฐ๋ฉฐ ์คํํ๋ ๊ฒ์ด๋ค. Interpreter ๋ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ ๋นํ ์๋๋ฅผ ํ๋ณดํ๋ฉด์๋, ํ๋ซํผ์ ์ข ์๋์ง ์๊ฒ ํ๊ธฐ ์ํด Java ๋ JVM(Java Virtual Machine) ์์ ์๋์ด ๊ฐ๋ฅํ Bytecode ๋ก compile ํ๊ณ , .NET ์ CLR(Common Language Runtime) ์ญ์ Bytecode ์ ์ ์ฌํ ํํ์ CIL(Common Intermediate Language) ๋ผ๋ ์ค๊ฐ ์ธ์ด๋ก ๋ณํํ๋ค.
์ดํ ๋ฐฐํฌ๋ ํ๋ซํผ์์ Virtual Machine ์ด ํด๋น ํ๋ซํผ์ ๋ง๊ฒ JIT Compile ์ ํ๋ฉฐ ์๋ํ๋ค.
๊ตณ์ด ๋ ๋ฒ์ compile ์ ํ๋ ์ด์ ๋ High-level Language ๋ฅผ ๋ฐ๋ก JIT Compile ํ๋ ๊ฒ๋ณด๋ค Machine Language ๋ก ๋ฐ๊พธ๊ธฐ ์ข๊ฒ ์ต์ ํ ์์ ์ ๋ฏธ๋ฆฌ ํด๋์ด ํ์ํ ๋ JIT Compile ์ ๋ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํจ์ด๋ค. ํ์ง๋ง ์ฌ์ ํ Machine Language ๋ณด๋ค๋ ๋๋ฆฌ๋ฉฐ, Virtual Machine ์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐ CPU ์์์ ์๋น ๋ถ๋ถ ์ ์ ํ๋ ์ค๋ฒํค๋๊ฐ ์กด์ฌํ๋ ๊ฒ์ ๋จ์ ์ด๋ค.
2. Script Language
ํ๋ ์ธ์ด ์ค ๋ง์ ์ธ์ด๊ฐ Script Language ์ ํด๋นํ๋ค. ์ด์ ๋ ์ค๊ณํ๊ณ ์คํํ๊ธฐ ์ฝ๊ธฐ ๋๋ฌธ์ด๋ค. JavaScript ๋ ๋ฌผ๋ก ์ด๊ณ Python, SQL, PHP ์ ๊ฐ์ ๋ง์ ์ธ์ด๊ฐ Script Language ์ ํด๋นํ๋ค. High-level Language ์ค์์๋ Script Language ๋ ๊ธฐ์กด์ C, C++ ๊ณผ ๊ฐ์ ์ธ์ด๋ค๊ณผ๋ ๋ค๋ฅธ ํน์ฑ์ ๊ฐ๋๋ค.
Script Language ๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค. Interpreter ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ Compiler ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
1. Interpreter
์ฝ๋๋ฅผ ์ฝ์ด ๋ด๋ ค๊ฐ๋ฉฐ ์ค์๊ฐ์ผ๋ก Machine Language ๋ก ๋ฒ์ญํด ์คํํ๋ค. ๋ฐ๋ผ์ Compiler ๋ฅผ ์ฌ์ฉํ๋ ์ธ์ด์ ๋ค๋ฅด๊ฒ ์๋๊ฐ ๋งค์ฐ ๋๋ฆฌ๋ค. ๋์ Interpreter ์ธ์ด๊ฐ ๊ฐ๋ ์ฅ์ ์ ์์ ์ด ์ฝ๋ค๋ ๊ฒ์ด๋ค. Compile Language ๋ ์กฐ๊ธ๋ง ์์ ํด๋ ์ ์ฒด ํ๋ก๊ทธ๋จ์ ๋ค์ compile ํด์ผํ๋ค. ํ์ง๋ง ์ด๋ฐ ๊ณผ์ ์ด ์๋ Interpreter Language ๋ ์คํ ์์ ์ ์ฝ์ผ๋ฉด์ ์คํํ๊ธฐ ๋๋ฌธ์ ์ฆ์ ๋ฐ์์ด ๋๋ค.
2. JIT Compile
Interpreter ๊ฐ ๋๋ฌด ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋์จ ๋์์ด๋ค. Script Language ์ ์ฅ์ ์ ์ด๋ฆฌ๋, ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ์คํ ์์ ์ ํ์ํ ๋ถ๋ถ๋ง
๋น ๋ฅด๊ฒ compile ํ๋ค. ์ด๊ฒ์ JavaScript ์ ๊ฐ์ High-level Language ๋ฅผ ๋ฐ๋ก JIT Compile ํ๋ ๊ฒฝ์ฐ๋ ์์ง๋ง, Java ์ ๊ฐ์ด
JIT Compile ์ ๋ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด Intermediate Language ๋ก ๋ณํ ํ JIT Compile ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ๋ํ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋
compiler ์ธ LLVM
์ญ์ JIT Compile ์ ํ๋๋ก ๋ง๋ค ์ ์๋ค(LLVM ์ AOT Compile ์ญ์ ์ง์ํ๋ค).
3. AOT Compile
JIT Compile ์ญ์ Intermediate Language ๋ฅผ ์คํ ์์ ์ compile ํ๋ ๊ฒ์๋ ๋ณํจ ์๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ์กด์ฌํ๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ ๋ฐ์๋๋ ์๋๋ฅผ ๊ฐ์ ํ๊ณ ์ ๋์จ ๋ฐฉ๋ฒ์ด AOT Compile ์ด๋ค.
JavaScript ์ค์์๋ Angular ๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ AOT Compile ์ด ๊ฐ๋ฅํ๋ค. ๋ํ JIT Compile ์ ์ฌ์ฉํ๋ React Native ๋๋น
AOT Compile ์ ํ๋ Flutter ๊ฐ ์ฑ๋ฅ์ฑ ๋ ์ ๋ฆฌํ ์ ์ ๊ฐ๋๋ค. ๋ค๋ง JavaScript ๋ผ๋ ์ธ์ด์ ํ์ ํด๋ณด๋ฉด Angular ๊ฐ AOT Compile ์
์ฌ์ฉํจ์๋ ๋ถ๊ตฌํ๊ณ JIT Compile ์ ์ฌ์ฉํ๋ React ๋ Vue.js ๋์ ์ฑ๋ฅ์ ์ด์ ์ด ์๋ค. ๋ํ React Native ๊ฐ Flutter ๋๋น ๋๋ฆฐ ๊ฒ์
Flutter ๊ฐ ๊ฐ๋ Skia Ui Engine
์ด Browser ์ DOM
์ ์กฐ์๋ณด๋ค ์๋ฑํ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ฉด, AOT Compile ์ LLVM
๋ JVM
, CLR
์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ JIT Compile ๋๋น ๋์ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ค. ๋์ Machine Language ๊น์ง
๋ฏธ๋ฆฌ ๋ฒ์ญ์ ํด๋๊ธฐ ๋๋ฌธ์ ๋ค์ ํ๋ซํผ์ ์ข
์์ ์ด๊ฒ ๋๊ณ , ์ด๋ ๋ค๋ฅธ ํ๋ซํผ์ ๋ฐฐํฌํ ๊ฒฝ์ฐ Compile ์ ์๋กญ๊ฒ ํด์ผํ๋ค๋ ๋จ์ ์ ๊ฐ๋๋ค.
Transpile ๊ณผ Compile ์ ๋ฐ๋์ ๊ตฌ๋ถํด์ผํ๋ค. TypeScript ๋๋ SCSS ๋ ์ด๊ฒ์ JavaScript ๋๋ CSS ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ Transpiler ์ ํด๋นํ๋ค. TypeScript ์
tsc
๊ฐ TypeScript compiler ์ ์ฝ์ด์ฌ์ compiler ๋ก ์ดํดํ๋ ๊ฒฝ์ฐ๋ฅผ ์ข ์ข ๋ณผ ์ ์๋๋ฐ, ์ด๊ฒ์ ์๋ฐํ ๋งํ๋ฉด High-level Language ๋ฅผ ๋ค๋ฅธ High-level Language ๋ก ๋ฐ๊ฟ์ฃผ๋ transpiler ๋ค. Babel ์ด ESNext ์ฝ๋๋ฅผ ES5 ์ฝ๋๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ค.
3. LLVM
1. LLVM Compiler
Apple ์์ ๊ฐ๋ฐํ๊ณ ํ์ฌ๋ LLVM Group ์ผ๋ก์จ Apache 2.0 License ๋ก ์ด์์ค์ธ ๋ฌด๋ฃ Compiler ๋ค. LLVM(Low-Level Virtual Machine)์ ์ฝ์๋ก JVM ์ด๋ CLR ์ฒ๋ผ Virtual Machine ์ผ ๊ฒ ๊ฐ์ง๋ง ์ ํํ๋ Virtual Machine ์ ์๋์ง๋ง ์ด์ ์ ์ฌํ๊ฒ ์๋ํ ์ ์์ด Virtual Machine ์์ด๋ ์ฌ๋ฌ ํ๋ซํผ์ ์ง์ํ๋ค.
LLVM Compiler ๋ Frontend
, Middle-end
, Backend
๋ผ๋ 3๋จ๊ณ์ compile ๋จ๊ณ๋ก ๊ตฌ์ฑ๋๋ค. ์ด ์ค LLVM Core
๊ฐ
Middle-end/Backend ๋ฅผ ๋ด๋นํ๋ฉฐ, ๊ฐ ์ธ์ด๋ณ๋ก Frontend
๋ฅผ ๊ฐ๋๋ค. ๋ฐ๋ผ์ Virtual Machine ์์ด๋ ์ฌ๋ฌ ์ธ์ด์ ์ฌ๋ฌ ํ๋ซํผ์
์ง์ํ ๋ฟ ์๋๋ผ JIT Compile, AOT Compile ๋ชจ๋๋ฅผ ์ง์ํ ์ ์๋ ๊ฒ์ด ํน์ง์ด๋ค.
LLVM ์ Frontend ๋ C, C++, Objective-C ๋ฅผ compile ํ๋ Clang
, Swift ๋ฅผ compile ํ๋ Swift-Clang
,
Fortran ์ compile ํ๋ Flang
, Kotlin ์ JVM ์์ด ์๋ํ๊ธฐ ์ํด LLVM ์ compiler ๋ก ์ฌ์ฉํ๋ Kotlin/Native
๋ฑ์ด
์กด์ฌํ๋ค.
์ด ์ธ์๋ Python, Ruby, Scala, Haskell, Go, Rust, Mojo ์ ๊ฐ์ ์ธ์ด๋ค ์ญ์ LLVM Middle-end/Backend ๋ฅผ compiler ๋ก ์ฌ์ฉํ ์ ์๋ค.
2. LLDB Debugger
LLVM ์ Frontend ์ ๋์ํ๋ Debugger ๋ค. Xcode ๋ก ๋๋ฒ๊น
ํ ๋ ์ฝ์ ์ฐฝ์ ์ง์ ๋๋ฒ๊น
ํ๋ฉฐ ์ฌ์ฉํ๋ ๋ฐ๋ก ๊ทธ ๋
์์ด๋ค.
GCC ์ GDB ์ ๋์ํ๋ ๊ฒ์ด LLDB ์ด๋ฉฐ, ํ์ฌ๋ ์ ๋์ค๊ณ๋ ๋ฆฌ๋
์ค ์์คํ
์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์๋์ฐ์์๋ WSL ์ ์ฌ์ฉํด ๋ฆฌ๋
์ค ํ๊ฒฝ์์
์ฌ์ฉํ ์ ์๋ค.
Reference
- โ์ปดํ์ผ๋ฌ.โ Wikipedia. Feb. 24, 2023, Wikipedia - ์ปดํ์ผ๋ฌ.
- โJIT ์ปดํ์ผ.โ Wikipedia. Mar. 14, 2023, Wikipedia - JIT ์ปดํ์ผ.
- โAOT ์ปดํ์ผ.โ Wikipedia. Feb. 27, 2022, Wikipedia - AOT ์ปดํ์ผ.
- โLLVM.โ Wikipedia. Dec. 13, 2022, Wikipedia - LLVM.
- โLLVM.โ ๋๋ฌด์ํค. May. 21, 2023, ๋๋ฌด์ํค - LLVM.