본문 바로가기
Development/Compiler

컴파일러의 컴파일과 링크 처리 과정

by KingCat 2013. 12. 11.

- 전처리기를 찾아서 값을 다 바꿔놓는다. (전처리 과정)

- 헤더 파일들을 다 모아서 포함되어 있는 선언문들을 모은 후, 그 선언문들을 미리 정리해놓는다. (헤더 분석 과정)

- 이때, 헤더가 없거나 하면 파일이 없다고 컴파일 에러가 난다. (컴파일 에러)

- 코드 분석을 한다. 분석 전에는 이미 헤더 정리가 끝났으므로 분석에 필요한 테이블이 정리되어있다.

- 코드 분석 중 알 수 없는 자료형이나 함수가 나타나면 링크 에러가 발생한다. undefined type .... (링크 에러)

- 함수 분석 중 뒤에 이상한 문자가 오거나해서 이것이 함수인지, 무엇인지 헷갈릴때 컴파일 에러가 발생한다. (컴파일 에러)

- 타입별로 단어 분석이 모두 끝나고 assembly 언어가 모두 준비되면 obj 파일이 생성된다.

- 함수를 호출하는 구문에 함수 바디를 가져오는 것이 아니라, 위에서 분석한 함수 바디의 메모리 주소를 연결하게 된다.

- 만약 함수 정의가 안되어 있으면, 일단 컴파일러가 함수라는 것을 알았으면 컴파일 에러는 발생하지 않는다.

- 링크 도중 함수 바디를 찾아서 연결할 때, 함수 정의가 없는 것을 알게되면서 링크 에러가 발생한다.

 

- 프리컴파일을 하는 이유는? :

-> 헤더 파일 분석 중에는 cpp마다 코드 분석이 모두 일어난다.

-> 이때, 같은 헤더들을 include하고 있는 cpp들이 많을수록 중복 작업이 늘어나면서 비용이 증가한다.

-> 그래서 프리컴파일을 통하여 중복된 헤더는 다시 include 하지 않도록 설정할 수 있다.

 

- 함수 호출시 그 자리에 함수 바디의 주소를 연결하는 것이 아닌 코드 자체를 옮겨놓는 것은? : 인라인 함수

- 인라인 함수의 단점 : 코드가 길어지므로 바이너리 파일이 커지고, 결국 실행파일 실행시 큰 파일을 로드하므로 시작시 로드 시간이 조금 더 걸리게 된다.

- 요즘 컴파일러들은 인라인 함수 사용시 최적화를 시켜주나, 이중 for문이나 중첩 if문은 많은 부하를 가지므로 피하는 것이 좋다.

 

- 클래스는 타입 선언일뿐, 메모리에 올라가지 않는다. 컴파일 후 실행시 메모리가 할당된다. 클래스의 생성자 이니셜라이즈 같은 경우 실행시 메모리가 할당 될 때, 그 메모리에 속성이 부여되기 전에 이니셜라이즈를 통해서 주소를 찾아서 값이 할당이 먼저 되므로 const 자료형을 초기화해도 에러가 발생하지 않는다.

- 중괄호 안에 있는 코드들은 메모리가 할당되고, 속성이 부여되고 난 후에 메모리를 내용을 호출하는 것이다.

 

- 템플릿 : 컴파일하고 나면 사라진다. 컴파일시 템플릿이 사용된다면 사용되는 타이밍에 속성이 정해지고 그 속성에 따라 메모리에 올라가게 된다.