일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 내일배움카드
- DNS
- 메가바이트스쿨
- CoreDNS
- dns forward
- 패스트캠퍼스
- linux dns
- Spring boot
- L2 통작
- Layer 2
- PVC
- MegabyteSchool
- RDB
- linux domain
- ARP
- systemd-resolved
- 개발자취업부트캠프
- 127.0.0.53
- MariaDB
- k8s
- L2 통신
- 국비지원교육
- PV
- reclaim
- ssh tunneling
- Today
- Total
hoonii2
[Java] 02. JVM 컴파일 본문
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 (구문 분석)
: 위 토큰 스트림이 문법 형식에 맞는지 검사 후 형식에 안맞으면 컴파일 에러, 맞다면 파스 트리를 생성한다.
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 아키텍쳐 환경에 맞는 명령어 및 레지스터 등을 이용하여 기계어 생성
'개념 공부 > (개발) 01. Java' 카테고리의 다른 글
[Java] 06. Local Class / Anonymous Class (0) | 2022.12.02 |
---|---|
[Java] 05. Interface (0) | 2022.11.25 |
[Java] 04. Primitive/Reference Data Type, Wrapper Class (0) | 2022.11.18 |
[Java] 03. JVM 메모리 구조 (0) | 2022.10.07 |
[Java] 01. JAVA 기초 (1) | 2022.09.23 |