프로그램의 작성과 실행 과정
프로그램이란 특정 프로그래밍 언어로 작성된 명령어들의 집합입니다. 프로그래머의 역할은 이러한 프로그램을 작성하고 테스트하는 것이며, C 언어로 작성된 소스 코드가 실제로 실행되기까지는 다음의 네 가지 단계를 거치게 됩니다.
- 프로그램 작성 및 편집
- 프로그램 컴파일
- 프로그램 링킹(Linking)
- 프로그램 실행
각 단계를 하나씩 자세히 살펴보겠습니다.
1단계: 프로그램 작성 및 편집
- 프로그램을 작성할 때는 텍스트 에디터(Text Editor)를 사용합니다.
- 텍스트 에디터를 이용하면 사용자가 문자 데이터를 입력하고, 수정하고, 저장할 수 있습니다.
- 대부분의 컴파일러에는 전용 텍스트 에디터가 함께 포함되어 있어 별도로 설치할 필요가 없습니다.
- 프로그램 작성이 끝나면 파일을 디스크에 저장합니다.
- 이렇게 저장된 파일을 소스 파일(Source File)이라고 부르며, 소스 파일은 컴파일러의 입력값이 됩니다.
2단계: 프로그램 컴파일
컴파일러(Compiler)는 사람이 작성한 소스 프로그램을 기계어로 번역해 주는 소프트웨어입니다. C 컴파일러는 내부적으로 두 개의 독립적인 프로그램으로 나뉘어 동작합니다.
- 전처리기(Preprocessor)
- 번역기(Translator)
전처리기(Preprocessor)
- 전처리기는 소스 코드를 읽고 번역기가 처리하기 좋은 형태로 준비하는 역할을 합니다.
- 전처리기 명령문은 항상
#기호로 시작합니다. 대표적으로#include,#define등이 있습니다. - 이 명령문들은 전처리기에게 특수 코드 라이브러리를 찾아 연결하거나 특정 내용을 치환하도록 지시합니다.
- 전처리 과정을 거친 결과물을 번역 단위(Translation Unit)라고 합니다.
번역기(Translator)
- 번역기의 역할은 프로그램을 기계어로 변환하는 것입니다.
- 번역기는 번역 단위를 읽어들여 오브젝트 모듈(Object Module)을 생성합니다.
- 다만 오브젝트 모듈에는 C 라이브러리 함수 등이 아직 포함되어 있지 않기 때문에 완전한 실행 파일은 아닙니다.
3단계: 프로그램 링킹(Linking)
링커(Linker)는 입출력(I/O) 함수, 각종 라이브러리 함수, 그리고 소스 프로그램에 포함된 함수들을 하나로 묶어 최종 실행 가능한 프로그램, 즉 실행 파일을 만들어냅니다. 이 단계를 거쳐야 비로소 운영체제에서 바로 실행할 수 있는 완전한 파일이 완성됩니다.
4단계: 프로그램 실행
로더(Loader)는 완성된 실행 프로그램을 메모리에 적재하여 실행 준비를 마치는 소프트웨어입니다. 실행 과정에서 프로그램은 사용자로부터 데이터를 입력받고, 해당 데이터를 처리한 후 결과를 출력합니다.
예제 1: 세 수의 평균 구하기
다음 예제는 키보드로 입력받은 세 개의 숫자에 대한 평균값을 계산하는 프로그램입니다.
#include<stdio.h>
int main(){
int a,b,c,d; // 정수형 변수 4개 선언
float e;
printf("Enter values of a,b,c:");
scanf("%d,%d,%d",&a,&b,&c); // 키보드로부터 3개의 값 입력받기
d=a+b+c;
e=d/3;
printf("Average=%f",e); // 결과 출력
return 0;
}실행 결과
Enter values of a,b,c :2,4,5 Average=3.000000
예제 2: 원의 둘레 계산하기
다음 예제는 입력받은 반지름 값을 이용해 원의 둘레를 계산하는 프로그램입니다.
#include <stdio.h>
#define PI 3.1415 // PI 값 정의
main (){
float c,r;
printf("Enter radius of circle r=");
scanf("%f",&r);
c=2*PI*r;
printf("Circumference of circle c=%f", c);
}실행 결과
Enter radius of circle r=5.6 Circumference of circle c=35.184799
이처럼 C 프로그램은 작성 → 컴파일 → 링킹 → 실행의 네 단계를 거쳐 최종 결과물을 만들어냅니다. 각 단계에서 사용되는 도구(에디터, 전처리기, 번역기, 링커, 로더)의 역할을 정확히 이해하면 컴파일 오류나 링크 오류 발생 시 원인을 빠르게 파악하고 해결할 수 있습니다.