책/난 정말 C Programming을 공부한 적이 없다구요!

제 1장 C언어의 기본적인 이해와 개발 환경

hm02123 2022. 11. 2. 21:43
728x90

1-1 C 프로그래밍의 이해

1)  소스파일에서 실행파일의 생성 과정

 컴퓨터는 0과 1만을 이해할 수 있다는 사실은 모두가 알만한 사실이다. 하지만 우리는 0과 1로 코드를 작성하는 것이 아닌 C, Python과 같은 프로그래밍 언어로 코드를 작성한다. 매일 코드를 작성하면서 컴퓨터가 코드를 어떻게 이해하는지에 대한 질문은 한 번도 던진 적이 없었다. 

 이 책의 1장에서는 컴퓨터가 어떻게 원시 코드를 이해하는지에 대한 과정에 대해 다룬다.

 

 Visual Studio와 같은 개발 환경에서 빌드를 하면 실행파일인 .exe 파일이 생성되는 것을 알 수 있다. 즉 컴파일을 하게 되면 실행파일이 생성된다. 그럼 간단히 컴파일러가 실행파일을 뚝딱 만들어주는 것일까? 반은 맞고 반은 틀리다. 

 우리가 작성한 코드를 원시 소스라고 하면 컴파일러는 우리의 원시 소스를 어셈블리어라는 .asm 파일을 생성한다. 

 

 여기서 어셈블리어란 CPU에 일을 시키기 위한 명령어 체계를 가리킨다. 하지만 이 어셈블리어 또한 컴퓨터가 이해할 수 있는 0과 1로 이루어지지 않다. 어셈블리어를 어셈블러라는 프로그램이 바이너리 코드(0과 1로 이루어져 있는 코드)인 .obj (오브젝트 파일) 파일을 생성한다. 즉 컴파일러와 어셈블러를 거쳐야만 컴퓨터가 이해할 수 있는 바이너리 코드가 완성되는 것이다. 

 이를 또 한번 링커라는 프로그램이 각 운영체제의 포맷에 맞춰 실행파일인. exe 파일을 최종으로 생성하게 된다. 

(일반적으로 컴파일러가 어셈블러의 역할까지 수행한다.)

 

 

 

2) 변환자의 종류

 

 위 과정을 보고 나면 의문점이 생긴다. Windows의 실행파일은 Linux에서 실행되지 않으며 Linux의 실행파일은 windows에서 실행되지 않는다. 때문에 해당 운영체제의 포맷에 맞춰 링커가 실행파일을 다르게 만든다. 그렇다면 어셈블리어와 바이너 리어는 어떨까? 어셈블리어는 CPU에 일을 시키기 위한 명령어 체계라고 말한 만큼 CPU별로 어셈블리 명령어 체계가 다르다. Intel과 ARM의 CPU는 각각 다른 어셈블러를 사용한다. 그런데 위에서 일반적으로 컴파일러가 어셈블러의 역할까지 수행한다고 하였다. 다라서 CPU별로 컴파일러도 다르다.

 

3) C언어를 사용하는 이유

 

 이제 왜 우리가 C를 사용하는지 알 수 있다. 컴퓨터가 이해하는 바이너리 언어로 바로 코드를 작성할 수 있으면 좋겠지만 그랬다면 개발자가 아무도 없었을 것이다. 그나마 CPU가 이해할 수 있는 언어에 가까운 어셈블리어는 CPU마다 명령어 체계가 다르다. 따라서 C 언어를 이용하여 코드를 작성하고 컴파일러만 바꾸는 것이다. (물론 어셈블리어로 코드를 작성할 수 있으며 어셈블리어로 코드를 작성하는 사람도 많다.)

 

마침.

 

 1장 내용이 당연한 상식이라고 생각할 수 있지만 1학년 때 수업을 제대로 듣지 않아서 정말 흥미로운 내용이었다. 게다가 작년에 졸업생 선배의 세미나 첫 내용이라 더 흥미로웠던 것 같다. 

 1-2와 2장은 개발 환경 사용법이므로 리뷰하지 않도록 하겠다.

728x90