시작하기 전에 간단히 프로그램에 대해서 설명하고 넘어가겠습니다.
프로그램이란, 일의 순서를 말합니다. 레시피를 예시로 들어보겠습니다.
라면 만드는 법 : 냄비 준비 > 물 담기 > 가열하기 > 끓으면 면과 스프 투하 > 완성
위와 같이 순서를 나열한 것이 프로그램입니다. 하지만 사람과는 다르게 더 정확한 명령을 내려야 합니다. 물을 얼마나 담아야 하는지, 어떤 냄비를 준비해야 하는지, 면과 스프를 투하한 후에 얼마나 더 가열해야 하는 거지처럼 말이죠.
이처럼 정확한 표현의 규칙을 정의해 놓은 것이 프로그래밍 언어입니다.
C언어의 탄생
C언어는 1972년, Unix 시스템에 사용하기 위해 켄 톰슨이 만든 B언어를 데니스 리치가 발전시켜 만든 언어입니다. 생각보다 얼마 안 됐죠? 1969년에 만들어진 Unix는 대부분 어셈블리어로 작성돼서 컴퓨터의 하드웨어가 바뀌면 유닉스를 다시 개발해야 하는 문제가 있었습니다. 이런 불편을 해결하고자 만든 것이 C언어입니다.
C언어의 장점
- 시스템 프로그래밍이 가능하다.
- 운영체제(OS) 개발을 목적으로 만든 언어
- 하드웨어 제어하는 시스템 프로그래밍이 가능
- 이식성을 갖춘 프로그램을 만들 수 있다.
- 이식성 : 기종이 다른 컴퓨터에서도 올바르게 작동하는 성질
- 표준을 지켜 프로그램을 만들면 컴퓨터 종류가 바뀌어도 그 프로그램 활용이 가능
- 함수를 사용해 개별 프로그래밍이 가능
- 개발 과정에서 에러를 수정하기 쉽고 개발 후에도 유지 보수에 용이
- 잘 만들어진 함수는 새로운 프로그램에서 재활용이 가능
컴파일
우리는 앞으로도 쭉 C언어를 이용해서 개발을 할 것입니다. 하지만 컴퓨터는 C언어를 이해하지 못합니다. 마치 사용하는 언어가 다른 것처럼 말이죠. 그래서 우리는 C언어를 컴퓨터가 이해할 수 있게 기계어로 통역을 해줘야 합니다. 이 과정을 컴파일이라고 합니다.
컴파일은 소스 파일을 컴파일러를 통해 컴퓨터가 이해하는 기계어로 만드는 과정입니다. 이때 소스 파일이란, 우리가 C언어를 작성한 파일입니다(확장자 .c). 컴파일은 크게 세 가지 단계로 나뉩니다.
컴파일 단계
- Preprocess (전처리)
Preprocess 과정은 Preprocess Directive (전처리 지시자)에 따라 소스 파일을 가공하는 과정입니다. Preprocess Directive는 #include, #define 등이 있습니다. Preprocess 과정은 소스 파일을 컴퓨터에 맞게 편집하는 일이므로 이 과정을 수행해도 파일의 형태는 달라지지 않습니다. - Compile (컴파일)
Preprocess가 끝난 파일을 Complie하면 Object File이 됩니다(확장자 .o). Object File은 CPU가 해석할 수 있는 명령어(Instruction)들로 이루어진 기계어 파일이지만 바로 실행하는 것은 불가능합니다. 프로그램은 운영체제에 의해서 실행되므로 Object File을 설치된 운영체제가 인식할 수 있는 형태의 실행 파일로 바꿔야 합니다. - Link
운영체제가 인식할 수 있는 형태의 실행파일로 만들기 위해서 Object File에 startup code를 결합하는 과정을 수행합니다. 이를 Link 과정이라고 합니다. startup code는 프로그램을 실행하기 전에 필요한 준비 작업을 수행하며 main 함수를 호출해 우리가 작성한 프로그램의 코드가 실행되도록 합니다.
프로그래밍 언어를 배우는 일은 약속된 규칙을 배우는 것과 같다고 할 수 있습니다.
오늘은 간단히 배경지식을 다뤄봤습니다. 다음 시간부터는 본격적으로 C언어의 약속된 규칙들을 배우는 시간을 갖도록 하겠습니다.
감사합니다. 빠잇~!