-
프로그래밍을 위하여 - 0x02 "소스코드가 프로그램이 되는 과정"Legacy/C&C++ 2015. 6. 10. 08:46728x90
소스코드가 프로그램이 되는 과정
우리가 비쥬얼 스튜디오 혹은 리눅스에서 소스를 작성한 후 컴파일을 시키면 위와 같은 과정을 거쳐 '실행프로그램'이 된다.
우선 선행처리기 다른 말로 전처리기(Preprocessor)가 하는 작업은 소스에서 #이 붙어있는 내용들을 바꿔주는 작업을 한다.
예를 들어 #define 혹은 #ifdef, #ifndef 같은 조건부 컴파일을 위한 구문들을 처리한다. 이러한 전처리 과정을 거치면 순수한 C코드인 Pure C가 된다.
위 그림에 나와있는 선행처리기 이후에 있는 소스프로그램이 그 후 컴파일러를 거치는데 컴파일러는 소스 프로그램이 문법에 맞는지 확인하는 과정을 거친다.
이때 확인을 위해 BNF(Backus–Naur form)이라는 표기법을 이용해 트리를 구성한 후 적법한 문법인지 확인하게된다. 우리가 컴파일 했을 때 나오는 문법적인 에러들을 이 BNF 트리를 만족하지 못하기 때문에 발생한다. 이 BNF 트리를 완성할 경우 컴파일러는 이를 어셈블리로 변경한다. ADD, Jcc(조건분기문) 같은 Mnemonic(사람이 알아보기 쉬운 어셈블리)로 변경한다. 이 과정을 마치면 모든 소스는 더 이상 C소스가 아닌 어셈블리 소스가 된다. 이 어셈블리 소스를 어셈블러가 컴퓨터가 알아보기 쉽도록 16진수로 만들어준다. 이 때 변수의 주소 같은 어셈블러까지 작업을 마치면 더이상 사람이 쉽게 알아볼 수 있는 소스가 남아있지 않고 OPCODE(Mnemonic에 대응되는16진수로)와 주소값 들만 남아있게 된다. 그 결과가 목적 프로그램(Object Program) 이러한 목적프로그램은 적게는 하나로 온전한 실행프로그램을 구성하기도 하고, 복수개로 이루어져있을 수 있다. 프로그래머가 작성한 목적 프로그램을 제외하고서도 printf 같은 미리 시스템에 정의되어있는 함수들을 사용할 수 있도록 연결해주는 역할을 하는 것이 링커이다.
전체적인 과정을 대략적으로 봤는데, 크게 다음 과정을 거친다고 보면 된다.
전처리기 -> 컴파일러 -> 어셈블러 -> 링커
각각의 과정들에 대한 자세한 내용은 직접 검색을 해보거나 책을 참고하는 것이 좋다. 어렵기도 하고 내용 자체도 많기 때문이다. 간단히 전체 과정을 살펴보려는 이 글의 취지와는 맞지 않을 것 같아 더 자세한 설명은 하지 않겠다. 다음 글에는 오류(Error)와 경고(Warning)에 대해 쓰겠다.
'Legacy > C&C++' 카테고리의 다른 글
프로그래밍을 위하여 - 0x03 "경고와 오류" (1) 2015.06.10 프로그래밍을 위하여 - 0x01 "C표준과 POSIX C" (0) 2015.06.10 프로그래밍을 위하여 - 0x00 "사전 준비" (0) 2015.06.10 [컴파일] 네임 맹글링 (Name Mangling, =Name Decoration) (0) 2015.05.04 문자열 변수와 상수 (0) 2015.01.19 C언어 공부법과 책추천 (2) 2015.01.12