hoonii2

[Java] 02. JVM 컴파일 본문

개념 공부/(개발) 01. Java

[Java] 02. JVM 컴파일

hoonii2 2022. 9. 30. 15:20

1. 개요

OS 마다 System Call 인터페이스 가 다름 ( https://www.tutorialspoint.com/system-calls-in-unix-and-windows )

CPU 아키텍처마다 instruction set architecture 이 다름 ( https://www.felixcloutier.com/x86/ )

 

때문에 CPU 아키텍처나 OS 가 컴파일한 환경과 타겟 환경이 다르다면 실행이 안된다.

그래서 타겟 환경에 맞춰 컴파일 하는 것이 크로스 컴파일이다.

 

JVM 은 Javac 컴파일을 통해 java bytecode 를 만들고 이는 JVM 이 설치된 환경에서 문제없이 돌아간다. ( 타겟 환경에 맞게 맞춰주는 것을 JVM 이 수행 )

 

2. 컴파일 과정 (Compier Fronted)

Compiler Frontend (Analysis) = Java Compiler (javac)

 

2-1) Lexical Analysis (Lexer or Tokenizer)

  : 소스 코드에서 문자 단위로 읽어 어휘소 (Lexeme) 를 식별하고 어휘소를 설명하는 토큰 스트림을 생성한다.

  - 어휘소는 식별 가능한 문자 시퀀스

    = 키워드 (keywords) : public , class , main , for 등

    = 리터럴 (literals) : 1L , 2.3f , "Hello" 등

    = 식별자 (identifiers) : 변수 이름 , 상수 이름 , 함수 이름 등

    = 연산자 (operators) : + , - 등

    = 구분 문자 (punctuation characters) : , , [] , {} , () 등

  - 토큰은 타입 (키워드, 리터럴, 식별자 등) 과 값 (public, 1L , main 등) 으로 구성되며 어휘소를 설명하는 객체이다.

  - 식별자 토큰은 어휘 분석 단계에서 심볼 테이블에 저장되고 이후 단계에서 계속 사용된다.

 

2-2) Syntax Analysis (구문 분석)

  : 위 토큰 스트림이 문법 형식에 맞는지 검사 후 형식에 안맞으면 컴파일 에러, 맞다면 파스 트리를 생성한다.

https://en.wikipedia.org/wiki/Compiler#Front_end

2-3) Symantic Analysis (의미 분석)

  : 타입이 올바르게 되어있는지, 자동 타입 변환 등의 작업이 수행된다. 맞지 않는 형태로 작성된 코드는 구문 분석 단계에서 통과되지만 의미 분석 단계에서 에러가 발생한다. ( ex, int a = "test"; )

 

2-4) Intermediate Code Generation (중간 코드 생성)

  : 위 단계를 통과한 파스 트리를 통해 기계어로 변환하기 좋게 중간 언어로 된 중간 코드 (바이트 코드) 를 생성한다.

 

3. 컴파일 과정 (Compier Backend)

Compiler Backend (Synthesis) = JVM

 

3-1. Code Optimization (중간 코드 최적화)

  : 중간코드가 기계어로 변환될 때 다양한 최적화 기법이 있다.

  - 핍홀 최적화

  - 지역 최적화

  - 루프 최적화

  - 전역 최적화

  [ 자세한건 찾아봐야 겠다 ]

 

3-2. Target Code Generate

  : Intermediate Code (바이트 코드) 로부터 Target Code (기계어) 생성

  - 각 OS 및 CPU 아키텍쳐 환경에 맞는 명령어 및 레지스터 등을 이용하여 기계어 생성

 

 

 

 

 

 

Comments