2024. 6. 17. 13:57ㆍ자바
빌드는 컴퓨터가 우리가 작성한 소스 코드를 실행 가능한 형태로 변환하는 과정을 의미합니다.
이 과정에서는 소스 코드를 컴파일하고, 필요한 리소스를 모아서 실행 가능한 프로그램이나 실행 파일로 만들어 줍니다.
빌드의 분류
빌드는 크게 3가지로 구분됩니다.
- Compile : 소스코드 전체를 기계어로 번역
- Interpreted : 소스코드를 한 줄씩 번역하면서 실행
- Hybrid : 소스코드 전체를 중간코드(바이트코드)로 번역한 뒤 가상머신(VM)에서 한 줄씩 실행함
C 프로그램의 빌드과정
자바의 빌드 과정을 알아보기 전 우선 C/C++ 프로그램의 빌드과정에 대해서 알아봅시다.
C/C++ 프로그램은 대표적인 Complie Language로 빌드는 전처리 - 컴파일 - 어셈블 - 링킹 단계로 이루어집니다.
(C/C++의 빌드과정에 대해서 알아보는 이유는 제가 공부하면서 자료를 찾아보던 중 Java의 빌드과정과 C/C++의 과정에 차이가 있는데 빌드에 대해서 모르는 상태로 빌드에 대해서 검색했을 때 헷갈릴 수 있어서 이에 대해서 확실하게 구분할 필요가 있기 때문입니다.)
전처리(preprocessing)
전처리 과정에서는 전처리기를 통해서 소스코드에 포함된 매크로나 지시자 등을 미리 포함시켜 주는 과정을 말합니다.
번역을 위해 사용되는 표현, 용어등을 미리 정리해 두는 것을 말합니다.
#include, #define 등이 있습니다.
컴파일(compile)
컴파일 과정에서는 전처리된 고급 언어(소스 코드)를 저수준 언어(low-level Language)로 번역합니다.
보통 어셈블리어(Assembly Language)로 번역됩니다.
왜 바로 기계어로 번역하지 않고 어셈블리어로 번역할까요?
우선, 기계어와 어셈블리어는 일대일 대응입니다.
만약 CPU에 문제가 있어서 검사 및 디버깅을 해봐야 할 때 기계어를 일일이 해석할 수 없기 때문에 일대일 대응이 되는
어셈블리어를 사용해서 인간이 봤을 때 이해하기 쉽도록 어셈블리어를 사용합니다.
하지만, 이도 사람이 읽기 쉬운 고급 언어(Java, C...)가 아니기 때문에 "저수준 언어"라 합니다.
어셈블(assembly)
컴파일 과정에서 고급 언어를 저수준 언어로 번역했습니다.
이제는 기계가 이해할 수 있도록 저수준 언어를 기계어로 번역해 주는 과정이 필요합니다.
이 과정은 어셈블러(assembler)라는 프로그램에 의해서 수행됩니다.
이렇게 CPU가 이해할 수 있는 언어로 번역된 파일을 Object File이라고 합니다.
컴파일 과정이 기계가 이해할 수 있도록 번역하는 단계라는 넓은 의미로 본다면 전처리 과정부터 어셈블까지의 과정을 컴파일 과정이라고 부르기도 합니다.
링킹(linking)
링킹 과정은 기계어로 번역된 Object File들과 라이브러리 결합하여 최종 실행 가능한 하나의 프로그램을 생성하는 단계입니다.
Java의 빌드과정
Java는 대표적인 Hybrid 빌드 방식을 사용하는 언어입니다.
Java는 플랫폼에 독립적인 바이트코드(.class파일)을 생성하고, JVM이 실행 시에 동적으로 클래스를 로드하고 실행하기 때문에
전처리/어셈블/링킹 과정이 없습니다.
일반적인 자바 빌드 과정에서는 플랫폼에 의존하지 않는 바이트코드(.class 파일)까지만 생성하고 멈춥니다.
이 바이트코드는 애플리케이션 동작시에 JVM이 번역하지만, 이 단계는 런타임시 메모리 내에서 이루어지므로 빌드과정 과는 관련이 없습니다.
즉, 자바는 컴파일이 빌드 과정의 거의 전부라 할 수 있습니다.
빌드 과정에서 컴파일 전에 의존성 해결을 한다던지 등의 작업이 있을 수 있지만, 다양한 빌드 도구(Maven, Gradle 등)에 의해서 핵심 컴파일 과정에 추가되는 것뿐입니다.
참고
https://stackoverflow.com/questions/10497905/typical-build-process-of-java-application
https://st-lab.tistory.com/176
https://www.geeksforgeeks.org/compiling-a-c-program-behind-the-scenes/
'자바' 카테고리의 다른 글
Optional (0) | 2024.04.24 |
---|---|
[JVM] Class Loader (0) | 2024.04.18 |
[JVM] Garbage Collector (0) | 2024.04.18 |
[JVM] Runtime Data Area (0) | 2024.04.18 |
[JVM] JVM 이란 (0) | 2024.04.18 |