Hokusai

[4] 컴파일과정 본문

취업/3. SW 지식

[4] 컴파일과정

HOKUSAI 2019. 1. 8. 12:27
반응형

컴파일 과정


오늘은 임베디드 시스템에서 기본적으로 알아야할 내용들 중에
컴파일과정들을 살펴보도록 하겠다.

c언어는 고급언어로 프로그래머가 작성하기는 쉬우나 CPU가 그대로 이해할 수는 없다.
어느정도의 과정을 거쳐서 CPU가 이해할 수 있는 기계어로 번역이 된어야한다.

먼저, 우리는 test.c라는 c언어로 작성한 소스코드의 내용들을 작성하였다고 가정해보자!


                                                     <컴파일 과정>

위 그림의 흐름을 이해하기위해 세부적인 내용을 알아보겠다.

-전처리기
 입력한 소스코드를 전처리기를 통해서 test.i 파일이 생성된다. "이제 컴파일이 실행하는 단계구나 !" 라고 생각하자면 된다.
(헤더파일을 보면 '#'이라고 되어있는 것들을 전처리기 구문이라고 하는데, 이러한 것들을 실행하기위해선 라이브러리들을 저장해야 함)

-컴파일러
 test.i를 컴퓨터가 읽을 수 있는 기계어로 변환하기 위한 번역기이다.  고급언어는 사람을 위해 만들어진 것이며, 0과 1밖에 모르는 컴퓨터는 스스로 해석하는것이 불가능하므로 이 과정이 없어서는 안된다.
기계어로 변환하기 전 c언어보다 하층에 있는 어셈블리어로 변환하고 이 어셈블리어 다음 기계어로의 변환이 이루어진다.    (ex. 고급언어 → 어셈블리어 → 기계어 )

-어셈블러
 test.s를 이제 완전히 기계어로 바꾸어주는 번역기이다. 이 과정이 지나면 목적파일이라는 .obj가 생성이 된다.

-소스파일을 번역하여 곧바로 실행파일로 만들어지않고 목적파일이라는 중간과정을 거치는 이유?
 여러개의 소스를 합쳐 하나의 실행파일을 만들어낼 수 있어야 하기 때문이다.
하나의 소스에 필요한 모든 명령을 다 기술할 수 없으므로 소스를 여러개 작성하고 
이것을 모두 연결하면 완전한 실행파일이 나오게 된다.

-링커
 test.obj 파일을 다른 목적파일 + 이미 만들어진 라이브러리들을 결합시킨다. 이 단계를 
거치면 실행파일(.exe)이 완성된다.
( 소스를 여러개 작성해서 최종적으로 링크하는 방식을 분할 컴파일이라고 하는데, 여러 
 사람이 같이 작업하거나 기능별 모듈을 개발할 때 일반적으로 사용하는 방법이다. )

-마무리
 마지막으로 이 실행파일을 실행하면 운영체제의 로더(Loder)가
로드(Load)(메모리에 프로그램을 적재)하게되며 프로그램이 메모리에 로드된 상태를
우리는 "프로세스(Process)가 발생했다"라고 한다.


-왜 프로그램은 실행하기위해 메모리에 적재되어야하는가?
 우리가 코드를 작성하고 변환작업을 거침 파일들이 저장되는 곳은 흔히말하는 스토리지(ex, HDD, SDD 등)이다. CPU와 스토리지가 직접 데이터를 주고받기에는 너무 느리기 때문에 CPU가 처리하기 위한 모든 프로그램은 최소 메모리(ex. RAM)에 적재되어야 한다. (최소라고 말하는 이유 : 메뫼 종류에는 순차적으로 여러 개가 존재하기 때문이다.) 흔히 우리가 사용하는 RAM은 휘발성이기 때문에 평소에는 스토리지에 저장해 두었다가 필요한 부분만 메모리에 적재시켜서 사용하게 된다.


반응형

'취업 > 3. SW 지식' 카테고리의 다른 글

[5] 리눅스 명령어 모음  (0) 2019.01.16
[3] 코드,데이터,스택,힙  (0) 2019.01.08
[2] SW개발 지식테스트 대비  (0) 2019.01.08
Comments