프로그램은 어떤 과정을 걸쳐서 실행이 될까요?
여러분이 작성한 코드는 컴퓨터에서 어떻게 실행이 되는지 궁금하지 않나요?(안 궁금하셔도 아셔야합니다. 큼)
프로그램은 다음과 같은 순서로 실행됩니다.
1. 전처리기
#include, #define 같은 걸 처리하는 겁니다. 먼저 처리하니깐 '전' 처리기라고 하는 거죠
2. 컴파일러
이제 우리가 짠, 우리가 이해하기 쉬운 코드를 프로그램에게 조금 맞추어주어야합니다.
여러분도 아시다시피 컴퓨터는 0,1만 인식할 수 있습니다. 하지만 누가 010101101111010110 이런식으로 코딩을 할 수 있을까요. 그래서 만들어진 게 어셈블리어입니다. 저희가 좀 더 직관적으로 코딩을 하기 위함이었죠.
하지만 이도 어렵다 해서 더 직관적으로 만든 것이 현재 저희가 하는 printf("Hello, world!"); 와 같은 코딩인 겁니다.
컴퓨터가 해석할려면 역으로 돌아가는거죠.
컴파일러는 이 코드들을 어셈블리어로 바꾸어주죠.
칼리리눅스에서 gcc -S Hello.c 로 어셈블리어를 확인해보겠습니다.
3. 어셈블러
이제 위와 같은 어셈블리어를 01101110 10101 이런식으로 바꾸어줘야합니다.
이 역할은 어셈블러가 해줍니다.
4. 링커
링커는 참조해야 할 함수와 라이브러리를 모아서 하나의 실행파일로 만들어줍니다.
정리를 해보자면 프로그램이 실행 파일을 만드는 과정은 다음과 같습니다.
참고로 리눅스에서
gcc -v --save-temps -o 실행파일 소스코드.c
명령어를 치면 모든 과정의 파일을 볼 수 있습니다.
.c 는 소스코드 파일
.i 는 전처리기 이후 파일
.s 는 컴파일러 이후 파일
.o 는 어셈블러 이후 파일
차례로 보면 다음과 같습니다.
그럼 이렇게 컴퓨터가 읽기 쉽게 된 파일이 CPU 에 실행되는 과정은 어떨까요?
아래와 같습니다.
링커가 만든 실행 파일이 메모리로 로드(Load) 됩니다. 그리고 메모리에서 실행되는 것이 아니라 CPU 에서 순차적으로 실행되기 때문에 명령어들이 CPU로 페치(Fetch) 됩니다. 이 명령어는 복호화(Decode) 과정을 걸쳐서 실행(Execution) 됩니다.
1. Load
2. Fetch
3. Decode
4. Execution
컴퓨터 하드웨어의 개괄적인 구조와 함께 봅시다.
아직 감이 안 오죠? 이를 비교해보겠습니다.
다음 포스팅에서요~
'공부 > 시스템프로그래밍' 카테고리의 다른 글
Windows 자료형 (0) | 2020.09.29 |
---|