본문 바로가기
TIL & WIL

[TIL] 크래프톤 정글 1주차 CS:app1(컴퓨터 시스템과 C프로그램의 컴파일 과정)

by 적용1 2024. 3. 26.
728x90

크래프톤 정글 1주차를 하며 CS:app(Computer Systems : A Programmer's Perspective)를 목차 1.3 까지 읽으며 공부하고 이해한 내용을 정리한 글이다.

 

1.1

먼저 컴퓨터 시스템은 텍스트 문자를 ASCII 표준을 이용하여 각 문자를 byte 길이의 정수로 나타낸다.(1byte = 8bit)

쉽게 말하자면 우리가 C 소스 코드를 적든, 메모장에 아무 문자를 적든 각 문자마다 1byte 형태로 인식이 된다는 것이다.

그렇기 때문에 같은 내용의 text여도 context(맥락)에 따라 컴퓨터에서는 다르게 실행될 수 있다.

 

C나 txt파일과 같이 아스키 문자로만 이루어진 파일을 text file, 그 외에는 binary file(0과 1로 이루어진 파일)이라고 한다.

ㄴ> 참고로 나중에 나오겠지만 C파일이 어떤 과정을 거치면 binary file형태로 저장된다.

1.2

C파일이 기계어로 번역되는 과정

 

C언어와 같은 (컴퓨터 기준)고급 언어들은 실행되기 위해서 다른 프로그램들에 의해 저급 기계어 인스트럭션으로 번역되어야 한다.

 

설명할 때 사용되는 hello.c

 

Instruction들이 실행 가능 목적 파일(Executable object file) 형태로 합쳐져서 바이너리 디스크 파일로 저장된다.

                                          └> == 목적 프로그램(object program)

ex) gcc -o hello hello.c

-gcc : 컴파일러 드라이버

-o : 컴파일 시 옵션

-hello : hello.c가 목적 파일 형태로 변역된 파일

-hello.c : 실행시킬 소스 파일

 

기계어 instruction으로 번역될 때 C와 같은 언어들은 4단계를 거치는데, 순서대로 전처리 단계, 컴파일 단계, 어셈블리 단계, 링크단계이다.

 

-전처리 단계

전처리기(cpp)는 C 프로그램을 #문자로 시작하는 디렉티브(directive)에 따라 수정한다.

ex) C파일 위의 #include <stdio.h>는 전처리기에게 시스템 헤더 파일인 stdio.h를 프로그램 문장에 직접 삽입하라고 지시한다.

그 결과 .i로 끝나는 새로운 C 프로그램이 생성된다.

-컴파일 단계

컴파일러(ccl)는 텍스트파일 hello.i를 확장자명이 다른 텍스트 파일 hello.s로 번역한다.

 

이 hello.s 파일에는 C언어가 아닌, 어셈블리어로 쓰여진 프로그램이 저장된다.

어셈블리어 예시(hello.c의 main함수를 어셈블리어로 표현한 것이다.)

-어셈블리 단계

어셈블러(as)가 hello.s를 기계어 instruction으로 번역하고, 재배치 가능 목적 프로그램(Relocatable object programs)의 형태로 묶어서 hello.o 라는 목작 파일에 저장한다.

 

여기서 hello.o는 main함수의 instruction들을 인코딩하기 위한 17바이트를 포함하는 바이너리 파일로, 열어보면 쓰레기 같은 데이터로 보일 뿐이다.

 

-링크 단계

hello프로그램이 현재 C 컴파일러에서 제공하는 표준 C 라이브러리에 들어있는 printf 함수를 호출 중이다.

 

printf와 같이 표준 C 라이브러리에 들어있는 함수들은 이미 컴파일된 별도의 목적 파일 printf.o와 같은 형태의 파일에 들어있으며, 이 파일이 hello.o와 결합되어야 한다.

 

링커 프로그램(ld)가 그 통합 작업을 수행한다.

 

그 결과인 hello 파일은 실행 가능 목적 파일(= 실행 파일)로 메모리에 적재되어 시스템에 의해 실행된다.

 

 

위와 같은 과정을 통해 사용자가 쓴 소스 코드가 기계어로 번역되어 실행되는 것이다.

1.3

1.3에서는 뒤에 있을 내용들을 예고하는 듯한 내용이 있었다.

 

컴파일 시스템이 어떻게 작동하는지 아는게 중요한 이유 3가지가 있었는데, 각각

 

-프로그램 성능 최적화

-링크 에러 이해

-보안 약점(security hole) 피하기

 

이다.

 

자세한 것은 앞으로 CS:app를 읽을 날이 상당히 많을 것으로 보여 뒤에서 더 자세한 설명이 나오면 정리해보도록 하겠다.

 

마지막으로 이 글을 작성하는 바탕이 된 수기로 작성한 파일을 올려놓겠다.

 

 

 

 

728x90