728x90
728x90
프로그램을 컴파일하고 실행하는 방법은 크게 3가지로 나뉜다.
1. Compiler(컴파일러)
정적 컴파일 방식을 사용하는 언어 번역 프로그램이다.
- 런타임 전 소스 코드 전체를 미리 기계어로 변환하고 컴퓨터에서 실행한다.
- 다른 프로그램이나 하드웨어가 처리하기에 용이한 코드로 변환하기도 한다.
장점
- 실행 전에 미리 기계어로 변환했기 때문에 실행 속도가 빠르다.
단점
- 실행 파일 전체를 전송해야 하므로, 용량이 크다.
- 수정 후 실행하기 위해서는 컴파일 과정을 다시 거쳐야 한다.
- 특정 시스템에서 번역된 실행 파일은 다른 시스템에서 실행되지 않는다.
컴파일 언어 : C, C++, C#, Basic 등
2. Interpreter(인터프리터)
런타임에 프로그래밍 코드를 직접 한 줄씩 읽어가며 해당 기능에 대응하는 기계어 코드를 바로 실행하는 방법이다.
장점
- 한 줄씩의 실행속도가 빠르다.
- 한 줄씩 번역하여 실행하기에 전체를 컴파일하지 않아도 되어 디버깅에 편리하다.
단점
- 전체적인 실행속도가 느리다.
인터프리터 언어 : Javascript, Python, Ruby 등
3. JIT(Just-In-Time) Compiler
정적 컴파일 방식과 Interpreter 방식을 혼합한 방식이다.
- 런타임 시에 Interpreter 방식으로 기계어 코드를 생성하고, 코드를 캐싱한다.
- 여러 번 불리는 함수의 기계어 코드 생성을 방지한다.
- 자주 수행되는 코드를 캐시 공간에 넣어 빠른 실행속도를 가진다.
장점
- 캐싱 기법을 이용해 Interpreter에 비해 시간을 단축한다.
단점
- 속도가 컴파일러보다는 느리다.
Java 컴파일 과정
1. Java Compiler(소스 코드 → 바이트 코드)
- Java Compiler(javac)를 통해 소스파일(.java)를 바이트 코드 파일(.class)로 변환한다.
- JVM은 바이트 코드를 이해할 수 있다.
- C, C++ 은 컴파일을 하면 바로 바이너리 코드의 형태를 가진다.
2. JVM(바이트 코드 → 바이너리 코드)
- Class Loader를 통해 .class 파일들을 JVM의 메모리에 올린다.
- Loading : Runtime Data Area의 메서드 영역에 클래스를 저장한다.
- Linking : 구성 요소를 검증하고 메모리를 할당한다.
- Initialization : 클래스 변수들을 적절한 값을 초기화한다.
- 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 기계어로 변환하며 실행한다.
- Garbage Collector : 유효하지 않은 메모리를 할당 해제한다.
Linker(링커) & Loader(로더)
- 컴파일러를 통해 소스파일을 목적 파일 (C/C++에서는 .o)로 변환한다.
- 이후 링커를 통해 목적 프로그램들을 묶어 하나의 실행 가능한 파일로 변환한다.
- 이후 로더를 통해 메모리에 적재한다.
참고
728x90
728x90
'Computer Science > Operating System' 카테고리의 다른 글
Thread Safe(스레드 안전) (0) | 2023.03.08 |
---|---|
IPC(Interprocess Communication) 프로세스 간 통신 (0) | 2023.03.08 |
Deadlock(데드락) (0) | 2023.03.08 |
Mutex(뮤텍스) & Semaphore(세마포어) (0) | 2023.03.07 |
Process Scheduling Algorithm(프로세스 스케줄링 알고리즘) (0) | 2023.03.07 |