JVM
- 스택기반 가상머신
- 레지스터 대신 변수를 저장하기 위해 스택을 사용한다.
- 연산은 스택에서 값을 pop / push 하는 과정으로 일어난다.
연산 예시
- fload_(n)
- bipush (b)
- i2f
- 스택 최상단의 요소를 float으로 변환한다.
- fmul
- 스택 최상단 두 변수를 pop한뒤 floating multiplication 을 실행하고 다시 스택에 push 한다.
- fadd
- 스택 최상단 두 변수를 pop한뒤 floating addition 을 실행하고 다시 스택에 push 한다.
- fstore_(n)
- 스택 최상단을 pop 한 뒤 n번째 지역 변수에 저장한다.
자바 소스코드가 bytecode 로 변환되어 실행되는 예시
자바 바이트코드 예시
컴파일 / 런타임
컴파일
- java 파일을 class 파일로 컴파일한다.
런타임
- 컴파일된 class 파일들과 precompile된 자바 클래스들을 합쳐 jvm에서 실행한다.
- pre-compiled java class : Java API ( String, Lang )
JNI / Java Native Interface
- 시스템에 의존적인 기능을 사용하거나, 미리 컴파일 된 기계어 코드를 사용하고 싶을때 사용하는 인터페이스
- 이를 사용시, 특정 OS/Platform에 맞춰 컴파일된 코드를 사용하기에 더이상 machine independent 하지 않다.
- 성능개선, 개발용이성, 예산문제 때문에 주로 사용한다.
Native method stack
- JNI 코드를 실행할때 할당됨, C 스택 사용
바이트코드 인터프리트
단어
- IP : Program counter 역할, 실행 시킬 명령어의 위치를 결정한다.
- SP : Stack pointer
- BC : 현재 해석되고 있는 바이트코드
정의
- 인터프리터는 스위치문을 포함한 거대한 loop이다.
- 종료조건은 프로그램의 종료
스택 프레임
- 함수 호출시마다 필요한 정보를 저장하기 위해 생성된다.
구성요소
Local variable
Operand stack
Constant pool reference
JVM의 데이터 타입
Jasmine assembly language
- Decorated AST를 Jasmin assembly language 로 변환하면, 이를 Jasmine assembler를 통해 바이트코드로 변환한다.
- Jasmin assembly와 bytecode는 1대1 대응되는 관계이다.
JVM DATA TYPE
- MiniC 언어의 타입이 Java의 primitive type 과 1대1 맵핑된다.
- 자바의 byte, char, short, boolean 은 int로서 구현되며, 배열에 저장시엔 4byte 이하로 저장된다.
추가 데이터 타입
- 클래스/인터페이스 이름 : 공백을 - 로 치환
- 배열 : 차원의 갯수만큼 앞에 [ 추가
- VOID : v
- 패키지/클래스 표현 : .을 /로 치환
- 레퍼런스 타입 : 앞에 L 붙힘
- 함수 표현
- (패러미터타입)리턴타입
- (II)I >> Int 2개 받고 Int 리턴
Operand stack
- 값을 push 혹은 pop
- 피연산자와 피연산자의 결과를 저장한다.
- 이곳을 통해 메소드 호출시 argument를 전달한다.
- 이곳을 통해 리턴 값이 저장된다.
- 매번 메소드 호출시 생겨남
- 레지스터에 비해 간단하나, top에서 매번 빼와야 해서 속도가 느리다.
Method
Static method
- 클래스에서 직접 호출
- 스택에 객체 레퍼런스 저장할 필요 없음
- 로컬변수 배열의 index가 0부터 시작해 패러미터 받고 지역변수 받음
- 호출시 invokestatic 사용
Instance method
- 객체에서 호출
- 스택에 객체의 레퍼런스를 저장한 뒤 호출해야함
- 로컬변수 배열의 0번 index에 객체 레퍼런스가 들어가고 패러미터 받고 지역변수 받음
- 호출에 invokevirtual 사용
연산자
- fcmpg
- v1 과 v2를 비교
- v1 > v2 일시 스택 최상단에 1을 추가
- v1 == v2 일시 스택 최상단에 0을 추가
- v1 < v2 일시 스택 최상단에 -1을 추가
Staticfield 사용하기
- getstatic 위치 타입 : 특정 타입 / 위치의 static field 가져와 스택에
- putstatic 위치 타입 : 특정 타입 / 위치의 static field 에 stack top을 pop 해서 저장