소스코드와 명령어 feat C언어의 컴파일 방식
우리는 통역가가 필요하다.
새로운 컴퓨터언어를 배워서 소스코드를 작성한다 한들 우리는 통역가가 필요하다.
왜냐하면 컴퓨터는 0과 1로 이루어진 기계어를 사용하기 때문이다.
고급 언어
우리가 소스코드에 흔히 사용하는 언어들 C#, C++, C등은 고급언어이다.
개발자가 읽고쓰기 편하게 만들어졌기 때문이다.
저급 언어
내부에서 실행될 때는 컴퓨터가 읽고 쓰기 편한 언어들로 변환이 필요하다.
1) 기계어 - 0과 1로 이루어진 명령어로 구성된 언어
2) 어셈블리어 - 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급언어
(어셈블리어는 기계어와는 다르게 소스코드에 직접적으로 명시하는 경우도 있다고 한다.)
고급언어가 저급언어로 변환되는 과정
** 먼저 변환과정에는 인터프리트와 컴파일 방식이 있는데 정확히 양분되는 개념은 아님을 알고있자.
고급언어가 저급언어로 변환되는 대표적인 방식중의 하나라고 이해하자.
1) 인터프리트
- 인터프리터에 의해 한줄씩 실행된다.
- 소스 코드 전체가 저급언어로 변환되기까지 기다릴 필요가 없는 방식이다.
- 소스 코드 인터프리트 중 오류가 발생하면 오류 발생 전까지의 코드는 실행된다.
- 즉, 위에서부터 한줄한줄 실행을하며 진행된다고 이해하면 될것같다.
2) 컴파일
- 소스코드를 전부 해석후에 실행된다. 따라서 인터프리터와 다르게 오류가 발생하면 소스코드 전체가 실행되지 않는다.
- 아래 C언어의 컴파일 순서를 통해 좀 더 자세히 알아보자
C언어의 컴파일 과정은
1. 전처리 과정
2. 컴파일 과정
3. 어셈블 과정
4. 링킹
이렇게 4단계로 이루어진다.
1) 전처리 과정
- 컴파일 전 처리해야할 작업들을 하는 단계이다.
- 우리가 #include<stdio.h> 와 같이 외부에 선언된 다양한 소스코드, 라이브러리를 명시한다.
- 프로그래밍 편의를 위해 작성된 매크로(#define) 및 컴파일할 영역(#if, #ifdef)를 명시한다.
-> 이과정이 끝나면 test.i라는 파일을 생성한다.
2) 컴파일 과정
- test.i라는 파일은 전처리가 완료되었으나 여전히 고급언어로 되어있다.
- 컴파일 과정을 통해 고급언어를 저급언어(어셈블리어)로 변경을 한다.
-> 이과정이 끝나면 test.s라는 파일을 생성한다.
3) 어셈블 과정
- 어셈블리어를 기계어로 변환하는 과정이다.
- 목적코드를 포함하는 목적파일(object file)을 생성한다.
-> test.o
4) 링킹
- 각기 다른 목적코드들을 하나의 실행파일로써 묶어주는 과정이다.
-> 실행파일이 만들어진다.(exe파일)
* 목적파일과 실행파일은 차이점이 있다.
둘다 기계어로 이루어져있지만 단순 목적파일은 다른 목적파일의 내용을 참조해 올 수 없다.
링킹 과정을 거치게 되면 참조된 각기 다른 목적코드들을 하나의 실행파일로써 묶어 실행파일이 된다.