자바로 작성한 파일을 실행하기 위해서는 두 단계를 거쳐야만 한다.
◾️ .java 파일을 .class 파일로 변환하는 컴파일 단계 (컴파일 타임 환경)
◾️ .class 파일을 실행시키는 실행 단계 (런타임 환경)
자바를 설치하면 실행 파일 형태(javac.exe)로 설치된다.
작성한 소스 코드를 자바 가상 머신이 이해할 수 있는 자바 바이트 코드로 변환한다.
javac : Java compiler의 약어
컴파일 : 소스코드를 컴퓨터가 이해할 수 있는 기계어로 바꾸는 행위
자바 가상 머신이 이해할 수 있는 언어로 컴파일(변환)한 자바 소스 코드이다.
컴파일한 코드가 각각 1바이트로 구성되어 있어 자바 바이트 코드라 부른다.
바이트 코드 파일은 운영체제에서 바로 실행할 수 없다.
자바 가상 기계(JVM)가 운영체제를 위한 완전한 기계어로 번역하고 실행한다.
자바 가상 머신만 설치되어 있으면, 어떤 운영체제에서라도 실행될 수 있다.
자바 바이트 코드를 실행시키기 위한 가상의 기계이다.
자바 프로그램을 실행하려면 자바 가상 머신이 설치되어 있어야 한다.
자바로 작성된 모든 프로그램은 자바 가상 머신에서만 실행될 수 있다.
동일한 자바 프로그램을 다양한 운영체제(윈도우, 리눅스 등)에서 실행할 때
운영체제에 맞는 자바 가상 머신만 설치되어 있다면, 별도의 추가적인 작업 없이도 잘 동작한다.
c, c++
◾️ 컴파일 된 실행 파일을 모든 운영체제에서 동일하게 사용할 수 없다.
◾️ 실행 시 중간 단계(JVM)를 거치치 않으므로 실행 속도가 빠르다.
◾️ 단, 운영체제마다 별도의 실행파일을 작성해야 한다.
운영체제에 종속적이므로, 각 운영체제에 맞는 자바 가상 머신을 설치해야 한다.
◾️ 윈도우 : 자바 명령어 실행 → 윈도우용 JVM 구동
◾️ 리눅스 : 자바 명령어 실행 → 리눅스용 JVM 구동
자바 프로그램은 실행 시 자바 가상 머신을 거쳐야 하므로, 일반 프로그램보다는 상대적으로 실행 속도가 느리다.
자바 언어는 지속적으로 발전(JIT의 도입등)해왔고, 하드웨어를 직접 제어하는 경우가 아니라면 c, c++언어의 실행속도와 거의 근접하다.
◾️ 자바 인터프리터(interpreter)
자바 컴파일러에 의해 변환된 자바 바이트 코드를 읽고 해석한다.
◾️ 클래스 로더(class loader)
자바는 동적으로 클래스를 읽어오므로,
프로그램이 실행 중인 런타임에서야 모든 코드가 자바 가상 머신과 연결된다.
동적으로 클래스를 로딩해준다.
◾️ JIT 컴파일러(Just-In-Time compiler)
자바 컴파일러가 생성한 자바 바이트 코드를 프로그램이 실행 중인 런타임 시점에 실제 기계어로 변환하는 컴파일러이다.
동적 번역(dynamic translation)이라고도 불린다.
프로그램의 실행 속도를 향상시키기 위해 개발되었다.
◾️ 가비지 컬렉터(garbage collector)
자바 가상 머신은 가비지 컬렉터(GC, Garbage Collector)를 이용하여
더는 사용하지 않는 메모리를 자동으로 회수한다.
C언어와는 달리, 개발자가 따로 메모리를 관리하지 않아도 된다는 이점이 있다.
◾️ 소스 코드를 작성한다. (.java)
◾️ 소스 코드를 저장 (javac 명령어 실행 : 자바 컴파일러가 바이트 코드로 변환)
◾️ 바이트 코드 파일 생성 (.class) (완벽한 기계어가 아님)
◾️ 프로그램 실행 (java 명령어 실행 : JVM은 바이트 코드 파일을 기계어로 변역)
◾️ 실행 결과가 컴퓨터에 반영된다.
javac : 컴파일러
java : 자바 가상 머신(JVM, Java Virtual Machine)