몬그로이

컴파일러를 두 번이나 거쳐서 얻는 것? 본문

Dev 언어 정리 & Self QnA/Java

컴파일러를 두 번이나 거쳐서 얻는 것?

Mon Groy 2024. 4. 23. 18:00

컴퓨터에 말을 걸기 위한 언어 Java

 

사람이 작성을 하면 Java 소스코드로 입력하게 되는데 (확장자: .Java)

컴퓨터는 이를 바로 읽을 수 없어 컴파일러라는 것이 번역을 해줘야 한다

더보기

.Java 파일은 일반적으로 텍스트 형식으로 작성되며, 

Java 프로그램의 소스 코드는 사람이 읽고 이해할 수 있는 형태이

 

컴파일러를 총 두 번 거치게 되는데,

처음 컴파일러는 .Java를 바이트코드로 번역하여 확장자가 .Class인 클래스 파일에 저장한다

이 때의 바이트 코드를 중간언어라고 부른다

후에 이 중간언어를 마저 번역해주는 두 번째 컴파일러를 거치게 된다

더보기

첫번째 컴파일러를 통해 바이트코드로 변환될 때,

모든 소스코드가 바이트코드로 변환되는 것이 아니므로

두 번째 컴파일러가 필요하다

 

바이트코드로 변환되지 않은 소스코드는

추상 메서드로 남아있거나 변경 또는 생략되기도 한다

 

클래스 파일은 클래스 로더가 옮겨서 JVM( Java Virtual Machine )으로 넣어주고

JVM은 클래스 파일을 분석해 실행하게 만든다

 

JVM은 크게 번역부와 실행부로 나뉘는데

번역부에는 Java Interpreter와 JIT(Just-In-Time) compiler가 존재한다

 

Java Interpreter가 바이트코드를 해석할 때

필요한 경우 JIT compiler가 (Just-In-Time이라는 이름에 걸맞게)

실시간으로 바이트코드를 컴파일해 도움을 준다

이 변환된 언어를 기계어라고 부른다

더보기

Java에서 소스코드를 컴파일 하면 바이트 코드로 변환되는데

바이트코드를 기계가 이해할 수 없기에 직접 실행할 수가  없다

하지만 JVM에서는 컴파일러를 통하여 실행될 수 있다

 

그런데 굳이 컴파일러를 두 번 거쳐서 이용하는 이점은 뭐가 있을까?

 

1. 편리성 & 범용성 & 유연성

바이트 코드는 JVM에서 실행되는데, 이는 특정 플랫폼에 의존하지 않아도 됨을 뜻한다

Java가 한 번 작성되면 여러 운영체제와 하드웨어에서 실행될 수 있으므로

개발자가 각 플랫폼 하나하나에 맞춰 재작성할 필요가 없어짐을 뜻한다

또한, 기존 시스템에 손쉽게 통합되거나 재사용이 가능하다

 

2. 보안 & 유연성

또한 바이트 코드는 고수준 언어로 작성된 코드의 중간 언어이므로,

일부 정보를 제거하여 원래 소스 코드의 논리를 숨기고 보호할 수 있다

 

이는 모두 JVM 덕분이라 할 수 있다

 

JVM은 바이트 코드를 실행하는 데 필요한 기능들을 제공하는데

메모리 관리, 스레드 관리, 예외 처리, 클래스 로딩 및 동적 링크 등을 포함한다

또한, JIT 컴파일러를 통한 실행 속도 향상도 한 몫 한다