IT Dictionary

์ž๋ฐ” ์ปดํŒŒ์ผ ๊ณผ์ •(Java Compile Process)

Jaebins 2023. 4. 28. 14:02
๋ฐ˜์‘ํ˜•

๐Ÿ˜ž ์„œ๋ก 

๋‚ด๊ฐ€ ์ฝ”๋”ฉ์— ์ฒซ ๊ฑธ์Œ๋งˆ๋ฅผ ์˜ฎ๊ฒผ์„ ๋•Œ, ๋‚ด๊ฐ€ ๊ฐ€์žฅ ๋ฐฐ์šฐ๊ณ  ์‹ถ์—ˆ๋˜ ์–ธ์–ด๋Š” ์ž๋ฐ”์˜€๋‹ค. ์ดˆ๋“ฑํ•™์ƒ๋•Œ ์œ ์ผํ•˜๊ฒŒ ์•Œ๊ณ ์žˆ๋˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜€๋Š”๋ฐ, ๋‹น์—ฐํžˆ ๊ทธ ์ด์œ ๋Š” ๋งˆ์ธํฌ๋ž˜ํ”„ํŠธ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋•Œ๋„ ๊ทธ๋ ‡๊ณ , ์ง€๊ธˆ๋„ ๊ทธ๋ ‡๊ณ  ์—ฌ์ „ํžˆ ๋‚˜์—๊ฒŒ๋Š” ํ™˜์ƒ์ด ๊นŠ์€ ์–ธ์–ด๋กœ ๋‚จ์•„์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ํ•ด๋‹น ์ž๋ฐ”์— ๋Œ€ํ•ด์„œ ํƒ๊ตฌ ํ•ด๋ณผ๋ ค๊ณ  ํ•œ๋‹ค.

 

โ›ณ ์ž๋ฐ”(Java)

์ž๋ฐ”๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋‹ค๋ฅด๊ฒŒ JVM(Java Virtual Machine)์—์„œ์˜ ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ด์šฉํ•ด ์ปดํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์šด์˜์ฒด์ œ์—์„œ ์ž๋ฐ” ํŒŒ์ผ์„ ์‹คํ–‰ ์‹œํ‚ฌ๋ ค๊ณ  ํ•  ๋•Œ, ๋ณ„๋„๋กœ ๋‹ค์‹œ ์ปดํŒŒ์ผ์„ ํ•ด์„œ ์‹คํ–‰ ํŒŒ์ผ์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์ž๋ฐ”์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋จผ์ €, JVM ์œ„์—์„œ ์ž‘๋™ํ•˜๋Š” ์ž๋ฐ”์˜ ์ปดํŒŒ์ผ ๊ณผ์ •์„ ํ•œ๋ฒˆ ์•Œ์•„๋ณผ๋ ค๊ณ  ํ•œ๋‹ค.

 

 

โ›ณ First

์ œ์ผ ๋จผ์ €, Java ์–ธ์–ด๋กœ ์งœ์—ฌ์ง„ ํŒŒ์ผ(*.java) ํŒŒ์ผ์„ ์ปดํŒŒ์ผ์„ ํ•˜๋ฉด ๋ช…๋ น์ฝ”๋“œ(Opcode)์™€ ์ถ”๊ฐ€ ํ”ผ์—ฐ์‚ฐ์ž(Operand)๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐ”์ดํŠธ์ฝ”๋“œ(Byte Code)๋กœ ๋ณ€ํ™˜ ์‹œํ‚จ๋‹ค.(*.class)

 

๐Ÿ’ฆ ๋ฐ”์ดํŠธ์ฝ”๋“œ : 

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

 

โ›ณ Second

์ด๋ ‡๊ฒŒ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ *.class ํŒŒ์ผ์€ ํด๋ž˜์Šค ๋กœ๋”(Class Loader)๋กœ ์ „๋‹ฌ์ด ๋œ๋‹ค. ํด๋ž˜์Šค ๋กœ๋”๋Š” JVM ์œ„์—์„œ ๋™์ž‘ํ•˜๊ณ , ํ•„์š”ํ•œ ํด๋ž˜์Šค๋งŒ ๋กœ๋”ฉํ•˜๋Š” ๋™์  ๋กœ๋”ฉ(Dynamic Loading)์„ ์ด์šฉํ•ด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค ํŒŒ์ผ๋“ค์„ ๋งํฌํ•˜๊ณ , JVM ์œ„์— ์ ์žฌ์‹œํ‚จ๋‹ค.

 

ํด๋ž˜์Šค ๋กœ๋”๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํฌ๊ฒŒ 3๊ฐ€์ง€์˜ ๊ณผ์ •์„ ํ†ตํ•ด JVM ์œ„์—์„œ ์ž‘๋™์ด ๋œ๋‹ค.

 

ํด๋ž˜์Šค ๋กœ๋”

1. ๋กœ๋”ฉ(Loading)

๋กœ๋”ฉ์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ(*.class)๋ฅผ ์ฝ์–ด์˜ค๊ณ , ์ ์ ˆํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ๋˜ํ•œ ๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ ๊ฐ์ข… ์ •๋ณด๋“ค์„ ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์ €์žฅํ•œ๋‹ค.

2. ๋งํ‚น(Linking)

๊ฒ€์ฆ(Verify) : ์ฝ์€ ํด๋ž˜์Šค์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ํšจํ•œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•œ๋‹ค.
์ค€๋น„(Prepare) : ์ •์  ๋ณ€์ˆ˜์™€ ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ๋ฐ์ดํ„ฐ ๊ฐ™์ด ๊ธฐ๋ณธ๊ฐ’์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ™•๋ณดํ•œ๋‹ค.
๋ถ„์„(Resolving) : ์‹ฌ๋ณผ๋ฆญ ๋ž˜ํผ๋Ÿฐ์Šค๋ฅผ ๋ฉ”์†Œ๋“œ ์˜์—ญ์— ์žˆ๋Š” ์‹ค์ œ ๋ž˜ํผ๋Ÿฐ์Šค๋กœ ๊ต์ฒดํ•˜๊ณ , ์„ ํƒ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •์ด๋‹ค.

3. ์ดˆ๊ธฐํ™”(Initialising)

๋งํ‚น ๊ณผ์ •์—์„œ Prepare ๋‹จ๊ณ„์—์„œ ํ™•๋ณดํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํด๋ž˜์Šค ๋ณ€์ˆ˜๋“ค์„ ์ดˆ๊ธฐํ™” ํ•ด์ค€๋‹ค.

 

โ›ณ Third

JVM์— ์˜ฌ๋ผ์˜ค๊ฒŒ ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ž๋ฐ” ์‹คํ–‰์—”์ง„(Execution Engine)์ด ๋ช…๋ น์–ด ๋‹จ์œ„๋กœ ํ•˜๋‚˜์”ฉ ์ฝ์–ด๊ฐ€๋ฉฐ ์‹คํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์‹คํ–‰ ๋ฐฉ์‹์„ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋ˆ ์งˆ ์ˆ˜ ์žˆ๋‹ค.

 

1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter)

๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฝ์–ด๊ฐ€๋ฉฐ ํ•ด์„ํ•ด ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•˜๋‚˜์”ฉ ์ฝ์–ด๊ฐ€๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

2. JIT(Just In Time) ์ปดํŒŒ์ผ๋Ÿฌ

์ธํ„ฐํ”„๋ฆฌํ„ฐ์— ๋‹จ์ ์„ ๋ณด์™„์‹œ์ผœ์ฃผ๋Š” ์‹คํ–‰ ๋ฐฉ์‹์ด๋‹ค. ์ž์ฃผ ์“ฐ๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ์˜์—ญ์„ ๋Ÿฐํƒ€์ž„ ์ค‘์— ์ปดํŒŒ์ผ ํ•˜์—ฌ ์†๋„ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹ค. ์ด๋ ‡๊ฒŒ ์‹คํ–‰์—”์ง„์œผ๋กœ ๋Ÿฐํƒ€์ž„๋œ ์ž๋ฐ” ์‹คํ–‰ํŒŒ์ผ์€ JVM์„ ํ†ตํ•˜์—ฌ ์šฐ๋ฆฌ์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค.

 

๋ฐ˜์‘ํ˜•