컴파일러 CH. 4 JVM

Alpha, Orderly·2023년 5월 31일
0

컴파일러

목록 보기
4/5

JVM

  • 스택기반 가상머신
  • 레지스터 대신 변수를 저장하기 위해 스택을 사용한다.
  • 연산은 스택에서 값을 pop / push 하는 과정으로 일어난다.

연산 예시

  • fload_(n)
    • n번 지역변수를 스택에 집어넣는다.
  • bipush (b)
    • 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 이하로 저장된다.

추가 데이터 타입

  • 클래스/인터페이스 이름 : 공백을 - 로 치환
    • class name >> class-name
  • 배열 : 차원의 갯수만큼 앞에 [ 추가
    • int ex[][] >> [[I
  • VOID : v
  • 패키지/클래스 표현 : .을 /로 치환
    • java.lang >> java/lang
  • 레퍼런스 타입 : 앞에 L 붙힘
    • Ljava/lang/String;
  • 함수 표현
    • (패러미터타입)리턴타입
    • (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 해서 저장

profile
만능 컴덕후 겸 번지 팬

0개의 댓글