JAVA는 플랫폼에 종속적이지 않고 이식성이 뛰어나다.
이번에는 javac와 자바 바이트 코드에 대해서 알아보겠습니다.
The javac tool reads class and interface definitions, written in the Java programming language, and compiles them into bytecode class files. It can also process annotations in Java source files and classes.
javac는 JDK에 포함되는 자바 컴파일러로 자바 언어로 작성된 프로그램을 바이트 코드파일로 변화해주는 역할을 합니다. 관련 명령어는 오라클 문서에서 확인할 수 있습니다.
c언어로 작성된 소스파일은 다음과 같은 컴파일과 링킹 과정을 통해 실행파일(.exe, .out)이 나온다. 이 실행파일은 특정 운영체제 전용이기 때문에 .out 실행파일은 Windows에서 실행할 수 없다.
javac의 컴파일 결과물은 바이트코드이다. JVM(Java Virtual Machine)이 이해할 수 있는 명령어이며 JVM에 의해서 기계어로 변환되게 된다. 이 자바 바이트코드가 자바 코드를 배포하는 가장 작은 단위이다.
hex editor로 본 바이트 코드는 다음과 같다. 이게 바이트 코드의 실체이다.
각 명령어는 1바이트의 OpCode와 2 바이트의 Operands로 구성된다.
한 바이트에는 256개의 값이 있듯이 바이트코드에는 256개가량의 opcode들이 존재합니다. 각각의 명령어들은 넓게 다음과 같이 분류할 수 있습니다.
많은 명령어는 피연산자(operand)의 타입을 나타내는 접두사(prefix) 또는 접미사(suffix)를 가지고 있습니다. 아래는 각 접두사/접미사가 나타내는 피연산자 타입입니다.
접두사/접미사 피연산자 타입
(e.g dload = 24 , load double from local variable)
(e.g aload = 25 , load reference from local variable)
더 자세한 명령어의 정의와 spec은 Oracle Java Bytecode Instruction Sec Docs에서 확인 가능합니다.
바이트 코드는 이진 코드이기 때문에 사람이 이를 보고 이해하기는 쉽지 않다. 이 점을 보완하기 위해 javap라는 역어셈블러를 제공한다. 흔히 javap를 이용한 결과물을 흔히 자바 어셈블리라고 한다.
다음과 같은 결과를 볼 수 있습니다.
출처
https://docs.oracle.com/javase/specs/jvms/se7/html/index.html
https://d2.naver.com/helloworld/1230
http://arhipov.blogspot.com/2011/01/java-bytecode-fundamentals.html
자바 컴파일에서 실행까지