[์ž๋ฐ” ์Šคํ„ฐ๋””] 1์ฃผ์ฐจ ์ •๋ฆฌ

January 9, 2023์— ์ž‘์„ฑ
study halle image

์ž๋ฐ”๋ฅผ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  'ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๋Š” ์ž๋ฐ”'๋ผ๋Š” ์ฑ…์„ ์‚ฌ์„œ ์ฝ์–ด๋ดค์—ˆ๋Š”๋ฐ, ๊ธฐ์ดˆ ์ฑ…์ด๋‹ค๋ณด๋‹ˆ ์–•๊ฒŒ ๋ฐฐ์šฐ๊ณ  ๋๋‚œ ๊ฒƒ ๊ฐ™์•„ ์ข€ ๋” ์ž์„ธํ•˜๊ฒŒ(JVM ์ž‘๋™ ์›๋ฆฌ๋ผ๋˜์ง€)์•Œ๊ณ  ์‹ถ์€ ๋งˆ์Œ์ด ์žˆ์—ˆ๋‹ค.

์ด์ „ ํฌ์ŠคํŒ…์— JVM ์ž‘๋™ ๋ฐฉ์‹์„ ๋”ฐ๋กœ ์ฐพ์•„์„œ ์ •๋ฆฌํ•œ ๊ฒƒ ์ฒ˜๋Ÿผ ์ฃผ๋กœ ๊ถ๊ธˆํ•œ ๊ฒŒ ์ƒ๊ธฐ๋ฉด ๊ทธ๋•Œ ์ฐพ์•„๋ณด๋Š” ์‹์ด์—ˆ๋Š”๋ฐ, ์šฐ์—ฐํžˆ ๊ดœ์ฐฎ์€ ์œ ํŠœ๋ธŒ ์Šคํ„ฐ๋””๋ฅผ ๋ฐœ๊ฒฌํ•ด์„œ ์ญ‰ ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.


๋ชฉํ‘œ

์ž๋ฐ” ์†Œ์Šค ํŒŒ์ผ(.java)์„ JVM์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ • ์ดํ•ดํ•˜๊ธฐ.

ํ•™์Šตํ•  ๊ฒƒ

  • JVM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€
  • ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€
  • JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€
  • JVM ๊ตฌ์„ฑ ์š”์†Œ
  • JDK์™€ JRE์˜ ์ฐจ์ด

JVM์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์ž๋ฐ”๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ. JVM์€ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ๋•Œ, Java๋ฅผ Java bytecode(.class ํŒŒ์ผ)๋กœ ์ปดํŒŒ์ผ(๋ช…๋ น์–ด๋Š” javac) ํ•œ ํ›„ ์‹คํ–‰ํ•˜๋ฉฐ, ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” java <arguments> <program name> ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•œ๋‹ค. JVM์€ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋Ÿฐํƒ€์ž„์— instruction(= machine code)์œผ๋กœ ํ•ด์„ํ•˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉฐ JIT ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ด์šฉํ•ด์„œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋Œ€์‹ ์— ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ์— machine code๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ตœ์ ํ™”ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

JVM์˜ ์„ค๊ณ„ ๋ชฉํ‘œ์ด์ž ํŠน์ง•

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๊ฐ€ ๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์—ญํ• 
    • jvm + bytecode interpreter
  • C/C++๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ์•ˆ์ „ํ•œ(๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋“ฑ) ์‹คํ–‰ํ™˜๊ฒฝ ์ œ๊ณต
    • ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, bytecode verification์„ ์ œ๊ณตํ•œ๋‹ค.
  • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ.
  • ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์‹คํ–‰ ํ™˜๊ฒฝ ์ œ๊ณต (Write Once Run Anywhere)
    • class ํŒŒ์ผ๋กœ ๋ณ€ํ™˜๋œ ํŒŒ์ผ์€ ์–ด๋–ค OS(macOS, windows, linux โ€ฆ)์ด๋“  ์‹คํ–‰๊ฐ€๋Šฅ

JIT Compiler

๋Ÿฐํƒ€์ž„์— ๋” ์ž์ฃผ ์‹คํ–‰๋˜๋Š” ๋ถ€๋ถ„(hot spot)์„ ์ฐพ์•„์„œ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ. ๋งค๋ฒˆ bytecode๋ฅผ machine code๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๊ณ , ํ•ด์„ํ•ด๋‘” ์ฝ”๋“œ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ฝ”๋“œ ์ž์ฒด๋ฅผ ์ตœ์ ํ™”ํ•œ๋‹ค.

๋ฐ”์ดํŠธ์ฝ”๋“œ

javac ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ java๋ฅผ ์ปดํŒŒ์ผํ•ด์„œ ๋‚ด๋†“๋Š” ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฌผ. .classํŒŒ์ผ์ด๋ฉฐ JVM์ด ์ด ํŒŒ์ผ์„ ๋Ÿฐํƒ€์ž„์— ํ•ด์„ํ•˜๋ฉด์„œ ์‹คํ–‰ํ•œ๋‹ค. ๋ช…๋ น์–ด ์ข…๋ฅ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” opcode๊ฐ€ 1๋ฐ”์ดํŠธ๋ผ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ผ ๋ถ€๋ฅธ๋‹ค. ๋Œ€๋žต 200๊ฐœ ์ •๋„ ์‚ฌ์šฉ ์ค‘. Bytecode๋Š” ํ”Œ๋žซํผ(or ๋จธ์‹ )์— ์ข…์†์ ์ด์ง€ ์•Š์œผ๋ฉฐ ํ•ญ์ƒ ๋™์ผํ•œ ํฌ๋งท์ด๋‹ค. Endian์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ๋ฐ, ์–ด๋–ค ํ”Œ๋žซํผ์—์„œ ์ƒ์„ฑ๋˜์—ˆ๋˜ ๊ฐ„์—, Big Endian(0x1234์˜ ๊ฒฝ์šฐ 12 34 ๋กœ ์ €์žฅํ•˜๋Š” ์‹. Little endian์€ 34 12 ์ด๋‹ค.)์„ ๋”ฐ๋ฅธ๋‹ค.

์ปดํŒŒ์ผ/์‹คํ–‰ ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ปดํŒŒ์ผ

java ์ปดํŒŒ์ผ๋Ÿฌ๋Š” JDK(Java Development Kit)์— ๋“ค์–ด์žˆ๋‹ค.

javac ๋ช…๋ น์–ด๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๊ณ , ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋Š” .class ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋œ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ ํŒŒ์ผ์ด๋‹ค. ์ปดํŒŒ์ผํ•  ์ž๋ฐ” ๋ฒ„์ „์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

$ javac [-source <์ปดํŒŒ์ผํ•  ์†Œ์Šค ์ฝ”๋“œ์˜ ์ž๋ฐ” ๋ฒ„์ „>] [-target <์ปดํŒŒ์ผ๋  ์ฝ”๋“œ์˜ ์ž๋ฐ” ์ง€์› ๋ฒ„์ „>] ...

์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” javap -c <๋ฐ”์ดํŠธ์ฝ”๋“œ ํŒŒ์ผ๊ฒฝ๋กœ>๋ช…๋ น์–ด๋กœ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์‹คํ–‰

java ๋ช…๋ น์–ด๋กœ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

JDK(Java Development Kit) vs JRE(Java Runtime Environment)

JRE๋Š” ๋ง๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒƒ๋“ค๋งŒ ๋ถ„๋ฆฌํ•ด๋‘” ๊ฒƒ์ด๋ผ JRE๊ฐ€ JDK์•ˆ์— ์†ํ•ด์žˆ๋‹ค. JDK์—๋Š” JRE๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ, ๋””๋ฒ„๊ฑฐ ๋“ฑ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋„๊ตฌ๋“ค์ด ํฌํ•จ๋˜์–ด์žˆ๋‹ค. Java 9 ๋ฒ„์ „ ๋ถ€ํ„ฐ๋Š” JRE๋ฅผ ๋”ฐ๋กœ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค

JVM ๊ตฌ์„ฑ ์š”์†Œ

JVM ์ •๋ฆฌ

์ฐธ๊ณ