자바는 객체지향 언어로 전 세계에서, 특히 우리나라에서 굉장히 많이 사용되는 프로그래밍 언어입니다. 저도 spring boot 백엔드 개발자가 되기 위해 공부중인데 공부를 할 때 마다 과연 나는 자바의 기능을 최대한 활용하고 있는가, 그에 대한 툴들을 제대로 이해하고 있는가에 대한 의문이 생겼습니다. 자바의 다형성, 멀티쓰레드, JVM 등 장단점을 대략 알고는 있지만 특정 언어를 전문화하려고 한다면 동작 원리까지 세세하게 알아야 한다고 생각했습니다. 이번 포스팅에서는 .java 파일이 어떤 과정을 거쳐 .class 파일로 컴파일이 되는지 알아보겠습니다.
0. javac Main.java
javac는 Java Development Ket에 포함되어 있는 자바 컴파일러 입니다.
1. Lexical analysis (어휘 분석)
# 용어
토큰 - 의미를 갖는 최소 단위 ex) int, =, main
오토마타 - 추상적인 계산 모델로서, 일련의 상태와 그 상태 간의 전이를 나타내는 이론적인 프레임워크
# 역할
1. 소스코드의 문자열을 '토큰'으로 분해
2. 주석, 공백 등의 불필요 요소 제거
3. 구문 분석을 위한 토큰 스트림 생성
# 과정
1. 정규식으로 토큰 패턴 정의
프로그래밍 언어에서 인식하고자 하는 토큰 (ex 키워드, 리터럴, 연산자)의 패턴을 정의
2. 비결정적 유한 오토마타 (NFA)
https://talkingaboutme.tistory.com/entry/Study-NFA-DFA
패턴을 비결정적 유한 오토마타로 변환하며 이것은 하나의 상태에서 주어진 입력 심볼에 대해 여러개의 가능한 전이가 존재할 수 있습니다.
3. 결정적 유한 오토마타 (DFA)
NFA는 입력에 따라 여러 가능한 상태전이를 가질 수 있기 때문에 이를 결정적인 형태로 만들기 위해 DFA로 변환합니다. 변환 방법은 powerset construction, subset construction이 있고 결과로 얻는 DFA는 주어진 입력에 대해 단 하나의 상태 전이 만을 가지므로 처리 속도가 향상됩니다.
4. 입력 문자열 토큰으로 변환
DFA를 사용하여 입력 문자열을 토큰으로 변환합니다.
2. Syntax analysis (구문 분석)
# 용어
문법 - 프로그래밍 언어의 문법적 구조를 정의하는 규칙의 집합. 주로 BNF, EBNF로 표현
파스트리 - 소스 코드의 문법적 구조를 표현
추상 구문 트리 - 파스트리에서 불필요한 정보를 제거한 더 간결한 트리
# 역할
1. 소스 코드의 문법적 구조 확인
2. 토큰들의 계층적 관계를 표현하는 트리 생성
3. 구문 오류 탐지
# 과정
1. 어휘 분석에서 얻은 토큰을 순차적으로 읽습니다.
2. 문법 규칙에 따라 토큰들의 관계를 파악하고, 파스트리나 AST 구축
구조 분석에 사용되는 알고리즘은 parser이며 두가지 속성을 가집니다. 하나는 방향성으로, top-down, bottom-up 중 어느 방식으로 분석할지 결정합니다. 두번째는 탐색방식으로,옆으로 탐색할지, 아래쪽으로 파고들지 결정합니다.
BNF(Backus-Naur Form)로 정의된 문법 규칙에 따라 파서 알고리즘에 의해 분석됩니다. 이로써 파싱 트리가 생성되고 본질적인 의미와 구조에 중점을 둔 AST로 변환됩니다.
https://gusdnd852.tistory.com/307
3. 오류 탐지
3. Semantic analysis (의미 분석)
# 과정
1. 심볼 테이블 구축 - 소스 코드의 모든 변수, 함수, 클래스 등의 식별자와 관련정보를 심볼 테이블에 저장합니다.
2. 타입 검사 - AST의 각 노드에 대해 타입 검사를 수행합니다.
3. 이름 바인딩 및 범위 확인 - 변수나 함수가 올바르게 선언되고 사용되었는지 확인합니다.
4. 의미 분석 - 소스코드가 의미적으로 올바른지 검증
4. 바이트 코드 생성
# 과정
1. 바이트 코드 생성 - 컴파일러가 AST의 각 노드를 순회하며 바이트 코드 명령어를 생성합니다. 바이트 코드는 플랫폼 독립적이며, 다양한 JVM 구현에서 동작하도록 설계 되어있습니다.
2. 바이트 코드 최적화 - 미사용 변수, 코드 제거 및 연산 단순화를 수행하지만 주요 최적화 과정은 JVM의 Just-In-Time 컴파일러에서 따로 수행됩니다.
5. References
https://untitledtblog.tistory.com/10
https://vhxpffltm.tistory.com/48
https://talkingaboutme.tistory.com/entry/Study-NFA-DFA
https://yngie-c.github.io/nlp/2020/05/09/nlp_lexical_syntax_analysis/
https://gusdnd852.tistory.com/307
https://shyeon.tistory.com/20
https://jake-seo-dev.tistory.com/124
chatgpt
'Back-end' 카테고리의 다른 글
[JVM 동작원리] 2. Runtime Data Area (0) | 2023.10.12 |
---|---|
[JVM의 동작원리] 1. 클래스 로더 (0) | 2023.10.10 |
agile 방법론, microservice, dev-ops, cloud (0) | 2023.07.15 |
Web server 와 Web application server (0) | 2023.03.23 |
JAVA란 (0) | 2022.12.24 |