[C++ Basic] # 01 C++ 처리과정
1. 프로그래밍이란?
컴퓨터가 특정 작업을 수행하도록 명령어와 논리를 설계하고 작성하는 과정입니다. 이는 컴퓨터가 이해할 수 있는 언어로 명령어를 작성하여, 계산, 데이터 처리, 자동화 작업 등 다양한 기능을 수행하게 만드는 작업을 의미합니다. 컴퓨터의 언어는 0과 1로 이루어진 2진수의 언어인데 이는 인간이 해석하기엔 어려움이 있어 컴파일러라는 도구의 도움을 받아 코드를 작성하고 프로그램을 만듭니다.
2. 컴퓨터의 주요 부품
CPU
- 컴퓨터의 데이터 처리 (인간의 두뇌의 해당)
- 가장 핵심이 되는 부품
- 혼자서는 할수 있는게 없다.
- 저장공간이 매우 적음
- 가장 빠른 속도
- 비싼 가격
- 중앙처리장치라고 불림
RAM
- 소위 메모리(또는 보조기억장치)라 불림
- 하드디스크 데이터를 읽어와 저장한다. (CPU가 작업할 데이터를 저장)
- 휴발성 데이터 (전원이 꺼지면 데이터가 사라진다.)
- 속도가 빠르다(CPU보단 느림)
- 가격이 비싸다
HDD(SSD) :
- 일명 하드디스크
- 데이터를 영구적으로 저장하는 장소
- 데이터가 비휘발성 (전원이 꺼져도 데이터가 사라지지 않는다.)
- 속도가 느리다.
- 가격이 저렴하다
3. 프로그램을 실행한다면?
1) HDD에서 프로그램을 RAM으로 가져온다.
2) CPU가 RAM에 있는 프로그램을 실행한다.
3) 실행된 프로그램은 RAM에 있는 데이터를 CPU가 처리한다.
4) 처리된 데이터는 RAM에 저장된다.
5) RAM에 저장된 데이터는 HDD에 저장된다.
4. 첫 프로그램 작성
#include <iostream>
int main()
{
std::cout << "Hellow World" << std::endl;
}
Hellow World C:\....\HelloWorld.exe(프로세스 28640)이(가) 0 코드(0x0)와 함께 종료되었습니다. 디버깅이 중지될 때 콘솔을 자동으로 닫으려면 [도구] -> [옵션] -> [디버깅] > [디버깅이 중지되면 자동으로 콘솔 닫기]를 사용하도록 설정합니다. 이 창을 닫으려면 아무 키나 누르세요... |
프로그램 작성을 하면 컴퓨터가 처리하는 순서는 아래와 같습니다.
소스 코드 작성(Source Code) > 전처리(Preprocessing) > 컴파일(Compilation) > 링크(Linking) > 실행(Execution)
1) 소스 코드 작성(Source Code)
- 프로그래머가 C++ 소스 코드를 작성합니다. 파일 확장자는 .cpp입니다.
- 이 소스 코드는 사람이 읽기 쉽지만, 컴퓨터는 직접 이해할 수 없습니다.
2) 전처리 (Preprocessing)
- C++ 컴파일러가 소스 코드를 컴파일하기 전에 전처리 작업을 수행합니다.
- 전처리기는 #include로 포함된 헤더 파일을 소스 코드에 삽입하고, 매크로를 처리하며, 조건부 컴파일 등을 처리합니다.
- 전처리 후에는 확장된 소스 코드가 생성됩니다.
3) 컴파일 (Compilation)
- 전처리된 소스 코드는 컴파일러에 의해 기계어로 변환됩니다.
- 이 과정에서 각각의 C++ 파일은 **오브젝트 파일(Object File)**로 변환됩니다. 오브젝트 파일은 기계어로 구성되어 있지만 아직 완전히 실행 가능한 파일은 아닙니다.
- 오브젝트 파일의 확장자는 운영체제에 따라 .o 또는 .obj로 나타납니다.
4) 링크(Linking)
- 여러 개의 오브젝트 파일과 필요한 라이브러리들이 **링커(Linker)**에 의해 결합됩니다.
- 링커는 각 오브젝트 파일의 함수나 변수 참조를 해결하고, 모든 필요한 라이브러리와 함께 실행 가능한 **실행 파일(Executable File)**을 생성합니다.
- 이때, 외부 라이브러리(예: 표준 라이브러리 libc++ 등)도 연결됩니다.
5) 실행 (Execution)
- 생성된 실행 파일은 운영체제에 의해 메모리에 로드되고, CPU가 이를 실행합니다.
- 실행 파일은 CPU가 이해할 수 있는 기계어로 되어 있기 때문에, CPU는 이를 차례대로 읽고 실행합니다.
5. C++ 프로그램 실행 구조도
+--------------------------+ +---------------------------------+
| Source Code (.cpp)| → | Preprocessor |
+--------------------------+ +---------------------------------+
↓
+---------------------------------+
| Expanded Source Code |
+---------------------------------+
↓
+---------------------------------+
| Compiler |
+---------------------------------+
↓
+----------------------------------+
| Object File (.o/.obj) |
+----------------------------------+
↓
+----------------------------------+
| Linker |
+----------------------------------+
↓
+----------------------------------+
| Executable File (.exe) |
+----------------------------------+
↓
+----------------------------------+
| Operating System |
+----------------------------------+
↓
+----------------------------------+
| CPU |
+----------------------------------+
각 단계의 주요 역할
- 전처리(Preprocessing): #include 및 #define 등과 같은 전처리 명령을 처리하고, 헤더 파일을 소스 코드에 삽입합니다.
- 컴파일(Compilation): 확장된 소스 코드를 기계어로 변환하여 오브젝트 파일을 생성합니다.
- 링크(Linking): 오브젝트 파일을 결합하고 필요한 라이브러리를 연결하여 실행 파일을 만듭니다.
- 실행(Execution): 운영체제는 실행 파일을 메모리에 로드하고, CPU는 명령을 실행합니다.
6. 메모리 내에서의 실행 구조
C++ 프로그램이 실행될 때, 프로그램은 메모리의 여러 영역에 데이터를 저장하며 작동합니다. 대표적인 메모리 영역은 다음과 같습니다:
- 코드 영역 (Code Segment): 컴파일러의 번역된 프로그램의 실행 코드가 저장되는 영역.
- 데이터 영역 (Data Segment): 전역 변수, 정적 변수 등이 저장되는 영역.
- 초기화된 데이터 영역: 초기화된 전역/정적 변수가 저장됨.
- 초기화되지 않은 데이터 영역(BSS): 초기화되지 않은 전역/정적 변수가 저장됨.
- 힙 (Heap): 동적으로 할당된 메모리가 저장되는 영역. 프로그램 실행 중에 메모리 할당 및 해제. (사용자가 직접 관리할 수 있는 메모리 영역)
- 스택 (Stack): 함수 호출 시 지역 변수, 매개변수와 반환 주소 등이 저장되는 영역.
프로그램이 실행되면서 전역 변수인 a가 Data영역에 제일 먼저 쌓이고 1이라는 int 값이 할당 됩니다. 그후 main 메서드가 Stack 영역에 올라가고 변수 b가 stack 영역에 저장공간을 할당받고 2라는 int값을 저장합니다. 그후 metohd 메서드가 호출 되면서 Stack 영역에 main 위로 쌓입니다. metohd 메서드가 실행되면서 c가 메모리에 올라가고 3의 값이 할당됩니다.
그후 metohd메서드가 종료되어 지역변수 c의 값이 해제되고 main메서드가 종료되면서 b의값이 해제되고 프로그램이 종료 되면서 a의 값이 해제 됩니다.