빌드(build)와 실행(run), 어떤 차이가 있는 거예요?
개발을 하다보면 단순히 Build와 Run이 비슷한 기능이라고 생각할 수 있지만, 사실 Build는 준비하는 과정이고, Run은 그 결과를 실제로 보여주는 과정이다.
예를 들어, Xcode, Visual Studio, Eclipse 같은 IDE에서 작업할 때, 빌드 버튼을 눌렀을 때는 코드를 컴파일하고 실행 파일을 생성한다. 하지만 Run 버튼을 누르면, 이미 빌드된 실행 파일이 실행되는 것이다.
단순히 설명했을 땐 위와 같은 의미를 지니며, 더 나아가 둘의 차이에 대해 명확하게 짚고 넘어가보는 시간을 가져보자
1. 빌드(Build) 과정
1.1 소스 코드
예를 들어, C 언어로 “Hello, World!” 라는 코드가 작성되어 있다고 하자.
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
1.2 컴파일
컴파일 단계에서는 소스 코드가 기계어(바이너리 코드)로 변환되는 과정이다. 이 과정은 보통 두 가지 주요 단계로 나눌 수 있는데,
1.2.1 구문 분석
- 소스 코드의 문법이 올바른지 확인하는 단이다. 컴파일러는 코드를 읽고, 각 명령어의 문법 규칙을 체크한다. 문법 오류가 발견되면, 컴파일러는 오류 메시지를 반환한다.
- 예를 들어, C 언어에서는 세미콜론(;)이 빠지면 구문 오류가 발생하는 상황.
1.2.2 중간 코드 생성
- 구문 분석이 완료되면, 컴파일러는 중간 코드(Intermediate Code)를 생성한다. 이 코드는 특정 플랫폼에 종속되지 않고, 여러 운영 체제에서 실행될 수 있는 형태를 갖는다.
- 중간 코드는 보통 단순한 명령어의 집합으로, 최적화(Optimization)가 가능함.
1.3 최적화
- 최적화 과정에서는 생성된 중간 코드가 성능 향상을 위해 개선된다. 이 과정에서는 실행 속도를 빠르게 하거나, 메모리 사용을 줄이는 등의 작업이 이루어진다.
- 예를 들어, 불필요한 변수를 제거하거나 반복되는 계산을 줄이는 등의 방법이 사용된다.
1.4 링크(Link)
- 링크 과정에서는 여러 개의 객체 파일(Object Files)을 하나의 실행 파일로 결합한다. 객체 파일은 컴파일러가 생성한 바이너리 코드로, 실행 가능한 프로그램의 한 부분이다.
- 이 단계에서 외부 라이브러리(예: 수학 계산 라이브러리, 사용자 인터페이스 라이브러리 등)를 포함시켜 프로그램의 기능을 확장한다.
1.5 결과물
빌드 과정이 완료되면, 최종 실행 파일이 생성된다. 이 파일은 일반적으로 특정 확장자를 가지며(예: Windows에서는 .exe, macOS에서는 .app), 사용자가 실행할 수 있는 형태를 갖는다.
2. 실행(Run) 과정
2.1 프로그램 실행
실행은 최종적으로 빌드된 실행 파일을 사용자가 동작시키는 과정이다. 사용자는 파일을 더블 클릭하거나 명령줄에서 실행 명령어를 입력함으로써 프로그램을 시작할 수 있다.
2.2 프로세스 생성
- 프로그램이 실행될 때, 운영 체제는 새로운 프로세스(운영 체제에서 실행되는 프로그램의 인스턴스)를 생성한다. 이 프로세스는 독립적인 메모리 공간을 가지며, 자신의 상태와 자원을 관리한다.
- 프로세스 생성 시 운영 체제는 프로그램 코드, 데이터, 스택, 힙 등을 메모리에 로드한다.
2.3 메모리 관리
운영 체제는 프로그램이 사용하는 메모리를 할당해준다. 메모리는 주로 다음과 같은 세 부분으로 나눠지는데,
- 코드 세그먼트: 프로그램 코드가 저장되는 부분
- 데이터 세그먼트: 전역 변수와 정적 변수가 저장되는 부분
- 힙(Heap): 동적 메모리 할당이 이루어지는 부분. 런타임 중에 메모리가 할당되고 해제된다.
2.4 프로그램 흐름
프로그램이 실행될 때, CPU는 명령어를 순차적으로 읽고 실행해. 이 과정은 다음과 같은 단계로 이루어진다.
- 패치(Fetch): 명령어를 메모리에서 읽어오는 단계
- 디코드(Decode): 읽어온 명령어를 해석하는 단계
- 실행(Execute): 해석한 명령어를 실행하는 단계
이 과정이 반복되면서 프로그램의 로직이 진행된다. 예를 들어, “Hello, World!“를 출력하는 프로그램은 printf 함수를 호출하여 화면에 해당 문자열을 출력한다.
2.5 종료
- 프로그램의 실행이 끝나면, 사용자는 프로그램을 종료할 수 있다. 종료 시, 운영 체제는 해당 프로세스가 사용했던 모든 메모리를 반환하고, 시스템 자원을 해제하게 된다.
- 프로그램 종료 시의 상태는 성공적으로 실행됐는지, 오류가 발생했는지 등을 반환하는 종료 코드(Exit Code)로 알려주는데, 보통 0은 성공, 1은 오류를 나타낸다.
3. 빌드와 실행의 차이
빌드
- 목적: 소스 코드를 실행 가능한 프로그램으로 변환하는 과정
- 단계: 소스 코드 → 컴파일 → 최적화 → 링크 → 실행 파일
- 결과물: 실행 가능한 바이너리 파일(예: .exe, .app)
실행
- 목적: 빌드된 프로그램을 실제로 동작시키는 과정
- 단계: 프로세스 생성 → 메모리 할당 → 프로그램 흐름 실행 → 종료
- 결과물: 프로그램이 사용자에게 제공하는 기능과 결과