보편적인 프로그램 컴파일 과정
프로그램이란컴퓨터가 특정 작업이나 연산을 수행하도록 지시하는 명령어들의 집합.
프로그램? 컴퓨터가 특정 작업이나 연산을 수행하도록 지시하는 명령어들의 집합
컴파일? 고급 프로그래밍 언어로 작성된 언어를 컴퓨터가 이해할 수 있게 기계어(or 바이너리코드)로 변환하는 것
즉, 프로그램은 컴파일 된 파일이다.
프로그램의 컴파일 과정은 다음과 같다.
Soruce File
프로그래머가 작성한 원본 코드 파일( .c , .cpp 등)
Proprocessor
전처리기. 소스코드의 주석 제거, 매크로 치환, 파일 병합과 조건부 컴파일 처리. (전처리된 파일을 출력. 일반적으로 .i 확장자)
Compiler
전처리된 소스코드를 어셈블리 코드로 변환. 이 단계에서 문접 검사와 최적화가 이루어남. (어셈블리 코드 파일을 출력. 일반적으로 .s 확장자)
Assembler
어셈블리 코드를 기계어(목적코드, object code)로 변환하여 객체 파일을 생성한다. 어셈블러는 CPU가 직접 실행할 수 있는 기계어 명령어를 생성한다. (객체 코드 파일을 출력. 리눅스에서 .o 확장자. 운영체제별로 확장자 다름)
Linker
프로그램 내 여러 객체 파일과 라이브러리들을 결합해 실행파일을 생성. ( .exe , .out 등 확장자)
어셈블리코드 : 저수준 코드. 기계어보다는 인간친화적. MOV, ADD, SUB와 같은 명령어를 사용하여 작업을 수행.
기계어/목적코드 : 가장 저수준 언어로, 컴퓨터가 직접 이해하고 실행할 수 있는 0과 1로 이루어진 바이너리 코드.
CPU가 직접 처리할 수 있는 유일한 언어
Java의 컴파일 과정
* 자바는 전처리기(Preprocessor)가 존재하지 않음
javac
소스 코드 파싱 및 구문 분석, 타입체크
중간코드 생성 : AST(Abstract Syntax Tree)를기반으로 바이트 코드로 변환
이 바이트 코드는 중간표현(IR; Intermediate Representation)코드
바이트 코드 최적화, 바이트 코드 생성
Class loader
클래스 로딩 : .class 파일을 메모리에 로드
링크(Linking) : 검증, 준비, 해결 과정을 통해 로드된 클래스 파일을 링크.
Excute Engine
바이트 코드를 실행
Interpreter | JIT(Just In Time) 컴파일러 | |
특징 | 바이트 코드를 한 줄씩 읽고 실행. 즉시 실행 가능 -> 프로그램 시작 시 딜레이가 적음. 디버깅이 용이하고 초기 오버헤드가 낮음. |
자주 실행되는 바이트 코드를 네이티브 머신 코드로 컴파일하여 성능 향상. 실행 중 코드 실행 패턴을 분석하고 런타임 정보를 활용하여 최적화를 수행. 프로그램이 실행되는 동안 필요한 부분만 컴파일 하므로 전체 프로그램을 처음부터 컴파일할 필요 없음 |
단점 | ❗️ 반복적 연산이 많은 경우 반복적으로 바이트 코드를 해석해야 하므로 런타임 오버헤드가 발생할 수 있으며, 한 줄씩 해석하기 때문에 성능이 떨어질 수 있음 | ❗️ 초기 오버헤드가 발생할 수 있고, 변환 코드를 저장하기 위한 추가 메모리 필요. |
JVM은 일반적으로 두 가지 방법을 모두 사용하여 최적의 성능을 제공한다.
프로그램 시작 시에는 인터프리터를 사용하여 빠르게 실행을 시작하고, 이후 반복적으로 실행되는 코드가 발견되면 JIT 컴파일러를 사용하여 네이티브 코드로 변환한다. 이렇게 함으로써 프로그램의 초기 응답성을 유지하면서도 실행 성능을 최적화할 수 있다.
'Computer Science > Operating System' 카테고리의 다른 글
PCB(Process Control Block) (0) | 2024.10.23 |
---|---|
프로세스 메모리 구조, 프로세스/스레드 차이 (0) | 2024.10.22 |
페이지 교체 알고리즘 - FIFO, LRU, LFU, MFU, NUR, OPT(오프라인 알고리즘) (0) | 2024.10.17 |
가상메모리(2) - 페이지폴트와 스와핑, 스레싱 (1) | 2024.10.16 |
가상메모리(1) - 페이지테이블, TLB (0) | 2024.10.16 |