[java] 컴파일 및 실행 방법, 바이트코드 외

jomminii·2022년 9월 10일
1

whiteship-java-study

목록 보기
2/2

백기준님 라이브 스터디 따라하기
1주차 JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가
자바 소스 파일(.java)을 JVM으로 실행하는 과정 이해하기.


컴파일 및 실행 하는 방법

자바 프로그램은 JVM 이 읽을 수 있는 .class 파일로 컴파일을 해줘야합니다. 자바 언어로 된 코드를 바이트 코드로 변환해주는 과정인데요, 과정은 어렵지 않습니다.

javac [options] [sourcefiles]

예를 들어 test.java 라는 자바 파일이 있고, 이걸 컴파일 하고자 한다면

public class test {

    public static void main(String[] args) {
        System.out.println("hi");
    }
}

아래처럼 javac 명령어로 해당 자바 파일을 컴파일해주면 됩니다.

javac test.java

javac 명령어 뒤에 옵션을 넣을 수도 있는데 -encoding 등의 옵션을 넣어 인코딩을 설정할 수도 있습니다. 보다 자세한 옵션들은 문서에서 확인해봅시다.


컴파일 후 확인해보면 동일한 이름의 .class 파일이 생성되어 있습니다. 컴파일이 성공한거죠!

➜  java ls
test.class test.java

컴파일된 파일이 정상적으로 실행되는지 확인하려면 java 명령어를 사용하면 됩니다. 참고로 javac 와는 다르게 java 뒤의 source file name 에는 .class를 붙이면 실행하지 못합니다.

java command 문서

➜  java java test 
hi
➜  java java test.class
오류: 기본 클래스 test.class을() 찾거나 로드할 수 없습니다.
원인: java.lang.ClassNotFoundException: test.class

java command 는 자바 프로그램을 실행하고, JRE(Java Runtime Environment 를 통해 클래스를 로딩하면서 클래스의 main() 메서드를 호출합니다. main() 메서드는 반드시 public, static 으로 선언되어야하고 반환 값은 없어야합니다.

참고

oracle - javac
자바 프로그래밍 - TCP School


바이트코드(Bytecode)란

바이트코드는 고급 언어로 작성된 코드를 JVM 같은 가상머신이 이해할 수 있는 중간 코드로 컴파일한 것을 말합니다. 그리고 가상머신은 바이트코드를 각각의 OS 아키텍처에 맞는 기계어로 다시 컴파일 합니다.

처음에는 바이트라고 하길래 바이트..? 01로 이루어진 코드..? 인가 라고 생각했는데 아니더라고요. 사실 0과 1로 이루어진 코드는 바이너리코드이니 아예 착각을 했던거였죠. 컴파일러에 의해 변환되는 코드의 명령어 크기가 1바이트라서 바이트 코드라고 부른다고 합니다.

바이트코드는 중간에 JVM 같은 가상머신이 있으면 대체로 함께 존재한다고 보면 되는데 JVM 이 효율적으로 읽어올 수 있는 형식이 필요하기 때문에 사용된다고 합니다.

바이트코드라는 명칭은 Java, JVM 에서 대표적으로 사용되기는 하는데 다른 곳에서도 바이트코드라 지칭하는 경우가 있으므로 혼동을 피하기 위해 Java 바이트코드 라고 명시하는 경우가 많다고 합니다.

그리고 컴파일된 바이트코드는 인터프리터 방식으로 해석되는 인터프리터 언어라고 볼 수 있습니다. 바이트코드는 JIT를 통해 바이너리코드로 변환되어 컴퓨터가 읽을 수 있게 되는데요, 이번에는 JIT 컴파일러가 뭔지 알아보겠습니다.

참고

바이트코드 - 나무위키


JIT 컴파일러란

JIT 컴파일(Just-in-time- compilation) 은 컴파일된 바이트코드를 기계어로 컴파일 해주는 친구인데요, JVM 의 실행엔진에 속해있으면서 런타임 시 실시간으로 바이트코드를 기계어로 변환해주는 역할을 합니다.

인터프러터 방식의 특성상 실시간으로 컴파일을 해야하기 때문에 정적 컴파일 방식보다 느릴 수 있는데 JIT 컴파일러는 반복되는 컴파일은 캐시에 저장해놓고 재사용 시 불러와 사용함으로써 실행 속도를 개선했습니다.

복잡한 최적화 과정은 이미 .class 로 컴파일 될 때 바이트코드 컴파일러가 대신 해줬고, 바이트코드 자체가 빠른 기계어 번역을 위해 설계되어 기존 인터프리터 언어들보다 빠르게 실행될 수 있습니다.

[이미지 출처 : understanding jit compiler - aboullaite]

참고

JIT 컴파일 - 위키백과
understanding jit compiler - aboullaite


JDK와 JRE의 차이

JRE(Java Runtime Environment)

JRE는 자바의 런타임 환경에서 필요한 소프트웨어 묶음 입니다. 우리가 구현하지는 않았지만 사용할 수 있는 List.class 같은 것들을 사용할 수 있게 해줍니다. 자바 라이브러리들과 클래스로더, JVM 을 세트로 묶어서 다운받을 수 있습니다. 어떤 컴퓨터든 JRE 만 깔리면 자바 프로그램을 실행할 수 있습니다.

  • Java libraries(prewritten code)
  • Java Class Loader(load into JVM)
  • Java Virtual Machine(JVM)

JDK(Java Development Kit)

JDK에는 JRE 를 포함하고 자바 개발을 위해 필요한 프로그램들도 포함하고 있습니다. javac, jar 등을 제공하고 있습니다. jdk-wiki 에 더 많은 내용이 있습니다. 참고해주세요!

  • JRE included
  • Java Compiler

참고

jdk-wiki
JRE vs JDK - IBM technology
JVM, JRE, JDK가 뭔가요 - 얄팍한 코딩사전

profile
고민은 격렬하게, 행동은 단순하게

0개의 댓글