-컴파일이란?
컴파일이란 쉽게 말하면 변환을 하는 것이다.
우리가 흔히 쓰는 언어들은 컴퓨터가 알아듣지 못하는 인간지향적으로 설계되어 있다.
이것을 컴퓨터가 알아들을 수 있도록 기계지향적 언어로 변환하는 방법이 컴파일이다
인간지향적 언어에서 기계지향적 언어로 바꾸는 일과 그 반대의 일 모두 컴파일이라 불린다.
즉 컴파일은 목적대상에 대한 이해를 위한 하나의 방법이다 그래서 일부 프로그래머들이 오브젝트를 만드는 단계라고 하는 것도 같은 맥락이다. 그리고 컴파일은 변환이고 컴파일러는 변환기라고 보면 된다. 컴파일러에 의해서 생성되는 기계어 명령문을 오브젝트 코드(object code)라고 하며, 오브젝트 코드가 포함되어 있는 디스크 상의 파일을 오브젝트 파일(object file)이라고 한다.
소스 파일을 컴파일 하게 되면 오브젝트 파일이 생성되고, 컴파일을 수행한 디렉토리의 파일목록
을 살펴보면, 소스 파일과 동일한 이름을 가지고 있지만 .C가 아니라 .OBJ라는 확장자를 가지는 파일을 볼 수 있을 것이다. .OBJ의 확장자를 가지는 파일은 오브젝트 파일이며 링커에 의해서 사용된다. UNIX 시스템의 경우 컴파일러는 .OBJ의 확장자가 아니라 .O의 확장자를 가지는 오브젝트 파일을 생성할 것이다.
-컴파일의 단계
C언어는 사용자가 제작한 소스파일을 실행파일로 만드는데 1. Preprocess, 2. Compile, 3.Link 이 세 가지 과정을 거친다.
* . c -->(Preprocess) * . i ① 전처리된 파일 생성
* . c -->(Compile) * . a , asm ② 어셈블리어 생성 중간파일
* . c --> assambly * . o , obj ③ 오브젝트 파일 생성
* . c -->(Link) * . exe ④ 실행파일 생성
Preprocess(전처리):
소스파일 내부에 있는 전처리 명령을 수행하는 과정이다. 전처리 명령은 소스파일 내부에 ‘#’으로 시작되는 명령어들이며 이 명령어들은 Preprocessor(전처리기)가 이 명령어들을 수행하게 됩니다.
전처리 명령어는 주로 소스파일을 컴파일 하기 전에 어떤 형태로 컴파일 할지 결정하거나, 소스코드의 가동성을 높이는 등의 역할을 수행하게 된다.
Compile(컴파일):
소스파일을 컴파일러를 이용해 기계어로 번역하는 과정이다.
번역하는 과정에서 C언어문법에 맞지 않거나 표준을 따르지 않으면, 컴파일 에러나 경고를 발생시키고, 아무런 문제 없이 과정을 마치게 되면 기계어로 번역된 ‘*.obj’파일을 생성하게 된다.
Link(링크):
컴파일 과정에서 생성된 ‘*.obj’파일과 소스코드에서 사용되는 함수들이 들어있는 ‘*.lib’파일을 이용하여 실행 가능한 파일을 만드는 과정이다.
실행파일을 만드는 과정에서 소스코드가 사용하는 변수나 함수가 주어진 파일에 존재 하지 않을 경우 이 과정에서 오류가 있다고 알려주며, 아무런 문제없이 과정을 마치게 되면 실행이 가능한 ‘*.exe’파일을 생성한다.
-I 파일
전처기 과정인 #include, #define, #if와 같이 #으로 시작되는 전처리 단계를 거치면 “소스명.i”라는 이름의 임시파일로 생성되지만 컴파일에 사용된 후 자동으로 삭제되어 디스크에 남지 않는다.
-오브젝트(OBJ)파일
목적 코드 또는 목적 파일은 컴파일러나 어셈블러가 소스 코드 파일을 처리하는 도중 만들어내는 코드의 대표이다. 목적 파일들은 "이진 파일"이라고 불리는 밀집된 코드를 포함하고 있다. 링커는 목적 파일을 함께 묶음으로써 보통 실행 파일이나 라이브러리를 만들어내는 데에 쓰인다. 목적 파일에서 유일하게 필수적인 요소로는 기계어(컴퓨터의 CPU가 직접 실행하는 코드)가 있다. 임베디드 시스템을 위한 목적 파일들은 기계어 말곤 아무것도 포함하고 있지 않다. 그러나 목적 파일들은 또한 연결, 디버그 목적으로나 다른 디버그 정보를 위해 런타임, 릴로케이션 정보, 프로그램 심볼의 코드로 사용하기 위한 데이터를 포함하기도 한다.
-asm 파일
어셈블리언어는 기계어의 2진 코드를 영문단어로 알아보기 쉽게 고쳐놓은 것이다.
즉 인간이 알아볼수있는 컴퓨터언어중 , 최하위에 있다. 기계어를 쉽게 어셈블리 언어로 만들고 ,
거기서 c언어가 탄생하였다.
c언어나 c++은 범용언어이기 때문에 한계성능을 이끌어내기는 무리가 있어, 최적화가 필요한경우 어셈블리어로 사용한다.
asm파일은 컴파일 과정중 생성되어 obj파일을 만들고 이 파일은 다시 링커라고 하는 프로그램을 통해 실행가능한 파일을 만든다.
어셈블리로 언어로 작성한 소스프로그램은 어셈블러로 실행코드로 변환할수 있다.