본문 바로가기
C/C언어 기초지식

C언어 기초지식 #2 : 프로그램 작성 과정

by RuNicks 2019. 11. 15.

프로그램의 작성 과정

이번에 알아볼 내용은 사람이 소스 코드를 작성하는 것부터 실행파일이 실행되기까지의 과정을 설명합니다.

소스코드 작성 후 실행파일로 파일을 실행하는 것은 누구나 할 수 있다고 생각합니다.

하지만 그 과정이 컴퓨터에 내부적으로 어떻게 돌아가고 있는지를 아는 것은 개발자로서 당연히 갖추어야 할 기본 지식이라고 생각합니다.

 

요리사에게 어떠한 요리를 알려달라고 했을 때 그냥 내가 하는 거 보고 순서대로 재료 넣으면 끝납니다 라고 하는 것보다

양파를 넣은 후 양파의 이러한 성분 때문에 다음에는 이런 재료를 넣는 것이 가장 맛있게 만들 수 있는 방법이라고 알려줄 수 있는 요리사가 진정한 요리사겠죠?

 

아래의 그림은 유명한 교과서의 자료 수정하여 더욱더 세부적으로 편집한 그림입니다.

※ 보통 교과서나 흔히 4가지의 Step으로 알고 있지만, 내부적으로 좀 더 세세하게 6가지의 Step으로 나누어 설명합니다

 

Step1. 프로그램 작성

- 인간이 프로그램 문법에 맞게 소스코드를 작성합니다.

- 소스코드 작성이 완료되면 소스파일이 생성됩니다. ( 확장자명은 .c )

- 소스파일을 전처리기로 전달합니다 .

 

Step2. 전처리

- C 소스코드의 # 흔히 #include 또는 #define의 내용을 소스코드에 치환한다.

※ 단순한 #define 같은 경우 소스코드에 바로 치환되며, #include 한 파일의 함수를 사용하였다면 해당 함수의 정보를 담아둔다.

- 전처리 과정이 완료되면 "전처리 결과 파일"이 생성됩니다. ( 확장자명은 .i )

- 전처리 결과 파일을 컴파일러에게 전달합니다.

여기서 중요한 것은 전처리 과정은 컴파일이 진행되기 전에 발생한다는 것입니다. ( #include 가 잘못되어 출력되는 에러는 컴파일 과정 전에 발생되는 에러입니다 )

※ 전처리 과정이 끝난 "전처리 결과 파일"의 내용이며 #define NUM 100 이라는 내용이 코드에 그대로 치환되었으며, stdio.h에 선언되어있는 printf에 대한 정보가 포함되어있다.

 

Step3. 컴파일

- 컴파일러가 "전처리 결과 파일"을 어셈블리어로 변환하는 작업을 합니다.

- 컴파일 작업 완료후 내가 작성한 소스코드가 어셈블리어로 변환된 어셈블리어 파일이 생성됩니다. ( 확장자명은 .s )

- 어셈블리어 파일을 컴퓨터가 이해할 수 있는 기계어로 변환하기 위해 어셈블러에 전달합니다.

"전처리 결과 파일"의 내용이 어셈블리어로 변환 되었습니다.

 

Step4. 어셈블

- 어셈블러가 어셈블리어 파일을 컴퓨터가 이해할 수 있는 기계어로 변환합니다.

- 어셈블 작업이 완료되면 오브젝트 파일(목적 파일)이 생성됩니다. ( 확장자명은 .o )

- 오브젝트 파일을 링커에게 전달합니다.

※ 어셈블리어 파일이 최종적으로 컴퓨터가 알아들을수있는 기계어로 변환 되었습니다.

 

Step5. 링크

- 오브젝트 파일과 표준 라이브러리 함수를 연결하여 하나의 파일로 통합합니다.

※ 내가 추가한 라이브러리에서 사용한 함수는 실체가없는 선언문 입니다. 링크란 라이브러리 파일에 존재하는 오브젝트 파일을 나의 소스파일에 병합해줍니다.

- 링크 작업이 완료되면 실행 파일이 생성됩니다. ( 확장자명은 .exe )

여기까지가 실행 파일(exe 파일)이 생성되는 과정입니다.

Step6는 실행파일을 실행했을때의 과정을 나타내며, 사실은 실행파일을 실행했을때도 세부적으로 복잡한 과정이 있습니다만 해당글에서는 간단히만 설명하고 넘어가도록 하겠습니다.

프로그램이 시작되는 과정은 다음에 따로 업로드 하도록 하겠습니다.

※ 여러가지 오브젝트 파일(목적파일)을 링커가 하나의 파일로 링크한후 실행파일이 생성됩니다.

 

Step6. 로딩

- 실행파일 실행시 로더는 실행 파일(exe 파일)을 컴퓨터의 주기억 장치(RAM)에 로딩(적재) 합니다.

- 주기억 장치(RAM)에 로딩(적재)된 실행파일을 CPU가 실행시킵니다.

※ 최종적으로 실행 파일을 실행시킨 결과

 

 

여기까지가 모든 과정의 설명이었습니다.

Step2 ~ Step4 까지 결과는 연속적으로 일어나며 전처리기 결과 파일(.i)과 어셈블리어 파일(.s)은 디스크에 저장 되지않습니다.

이러한 이유로 이 과정을 생략하고 오브젝트 파일(.o)이 생성되는 과정까지를 컴파일 과정으로 통합 해버리는 설명이 많지만 상세하게 제대로 알아둡시다!

 

아래 그림은 위의 편집하기 전의 원본 그림 입니다.

--------------------------------------------------------------------------------------------------------------------------------

 

다음주제

C언어 기초지식 #3 : 프로그래밍 개발환경 구축

댓글