C 프로그래밍
1. C언의 개요.
C 언어는 1972년경 벨 연구소의 데니스 리치(Dennis Ritchie)라는 사람에 의해 디자인되었는데 1960년대 ALGOL로 시작해서 Cambridge의 CPL(1963), Martin Richards의 BCPL(1967) 그리고 같은 벨 연구소의 Ken Thompson의 B언어에 기본을 두고 있다.
이러한 C 언어는 범용프로그래밍 언어로 만들어졌지만 전통적으로 시스템프로그래밍에 쓰여졌고, 그 좋은 예로 유명한 C 언어는 UNIX라는 운영체제를 개발하는데 사용되었으며 그 이후 C 언어는 날이 갈수록 그 인기가 더해졌는데 그 이유는 아래와 같다.
첫째, C 언어가 여러 가지 애플리케이션의 제작에서 완벽에 가까운 기능을 제공하기 때문이다. C 언어는 포인터, 구조, 문자열과 같은 유용한 데이터형을 지원하였고 막강한 연산자와 제어구조를 가졌으며 입/출력, 기억장소 할당, 문자열 제어 등의 부분에 대한 다양한 기능을 가지고 있는 실행시간 라이브러리(Run-time Library)를 많이 가지고 있다.
둘째, C언어는 효율성을 갖고 있다. C 언어 자체는 조그마한 언어로서 컴퓨터의 하드웨어와 직접적으로 연결이 되는 데이터형과 연산자를 지원하고 있다. 그래서 실질적으로 컴퓨터의 하드웨어와 언어간의 차이점을 최소화시켜 작은 크기의 프로그래밍으로도 다양한 제어와 응용을 가능케 했다.
셋째, C언어는 호환성이 높다는 것이다. 거의 100%에 가까운 운영체제들이 C 언어를 지원하고 있다. 그래서 하나의 시스템에서 만든 프로그램이 컴파일만 새로 한다면 다른 시스템에서도 거의 부과작업 없이 실행이 된다. 실례로 마이크로소프트사나 시멘텍 등에서 만든 C 언어 컴파일러는 몇 개의 추가 상용 라이브러리만 첨가시켜 주면 컴파일시 옵션만 바꿔주고 거의 프로그램에는 직접 손대지 않고서도 Windows 95/98이나 Windows NT 그리고 매킨토시와 UNIX(유닉스)의 X-Window 애플리케이션을 만들어 낼 수 있다는 것이다.
그리고 마지막 이유로 엄청난 수의 C 언어 프로그램과 프로그래머들이 있다. 세상에서 가장 강력하고 뛰어난 운영체제인 UNIX가 처음 개발되었을 때 UNIX 운영체제는 미국의 많은 대학에 무료로 제공됐고 UNIX 운영체제 자체가 C 언어로 만들어졌기 때문에 많은 수의 학생들이 컴퓨터공부를 위해 C 언어를 배우고 쓰게 되었다.
당연한 결과이겠지만 이런 이유로 압도적인 수의 C 언어 프로그래머와 프로그램이 쏟아졌고 보다 나은 C 언어의 개발에 집중적인 연구가 이루어졌던 것이다.
그러나 C 언어에 단점이 없는 것은 아니다. C 언어는 너무나 간결하고 강력하며 프로그래머에게 최대의 자유를 허용하는 효용성 때문에 자칫 C 언어 초심자가 악의없이 만든 오류가 있는 프로그램이 전체 시스템에 치명적인 타격을 입힐 수 있을 만큼 위험한 프로그램이 될 가능성이 생겼다. 또한 컴파일러가 잡아낼 수 없는 조그마한 오류가 심각한 사태를 일으킬 수 있을 만큼 너무나 세세하게 하드웨어를 제어할 수 있는 능력 때문에 다른 컴퓨터로의 이식에 예견치 못했던 오류가 생길 수도 있었다.
이러한 여러 가지 단점에도 불구하고 C 언어가 계속해서 명성을 쌓아나간 이유는 바로 C 언어의 모토가 "간결한 것은 아름답다"라는 것 때문이다. 지나친 제약과 제한을 두지 않는 대신에 강력함을 선사하는, 다시 말해서 모든 책임은 프로그래머 스스로가 짊어지되 전지전능한 능력을 부여해준다는 논리가 먹혀들어 간 것이라고 할 수 있다.
2. C 언어를 사용하기 위한 준비
모든 프로그래밍 언어들이 그러하듯이 C 언어도 쉽게 배우기 위해서는 스스로 프로그램을 작성하고 실행해 보아야 한다. 여기서는 프로그램을 작성하기 전에 준비해야 할 사항에 관해 기술하고자 한다.
프로그래밍은 알고리즘을 컴퓨터에 전달시키는 활동이다. 알고리즘은 단계가 완전하게 정의된 계산절차이다. 우리는 일상언어로 명령을 내리고, 다른 사람이 이 명령을 따르도록 하는 데 익숙해 있다. 프로그래밍과정은 컴퓨터가 모호성을 발휘하지 않고 모든 단계를 상세히 정의하여 야 한다는 점을 제외하고 그러한 과정과 유사하다.
컴퓨터에서는 이들 명령어들이 아주 정확한 언어로 기술되어야 하는 것을 요구한다. 문제해결 과정은 문제의 정의로부터 시작하여 알고리즘을 구현하고 이 알고리즘을 C 언어로 코딩한 후 해결방법을 검토하게 된다
일반적으로 어떤 언어로 작성한 프로그램이 실행되기 위해서는 컴파일러라는 번역기에 의해 기계어로 바뀌어야 되는데 이러한 컴파일러의 밑에는 운영체제라 불리는 특별한 프로그램군이 기계에 상주하고 있는데, 이 강의에서는 운영체제를 UNIX라고 가정하고 진행하기로 한다.
따라서 UNIX에서 사용되는 주요 텍스트 편집기는 vi가 있으며 학생들은 C코드로 구성된 파일을 생성시키기 위해서 어떤 종류의 텍스터 편집기를 이용할 수도 있다.
이러한 C언어를 사용하여 작성한 파일을 원시파일이라 부르고, 이 원시파일을 컴파일하기 위해서는 UNIX의 경우 cc명령어가 요구된다. cc명령어는 컴파일러를 호출하기 때문에 명령어의 이름이 곧 컴파일러의 이름이다. 그와 같이 ‘C 컴파일러’ 와 ‘cc컴파일러’는 모두 같은 의미로 쓰기도 한다. 대략적으로 말하자면 컴파일러는 원시코드를 실행할 수 있는 목적코드로 번역한다.
UNIX의 경우 이 번역된 코드는 a.out라는 파일에 자동적으로 생성되는데 그 과정은 아래와 같다.
1) c로 끝나는 이름으로 텍스트 파일을 생성하고, C 프로그램을 입력한다.
예를 들면,
vi test.c
vi는 UNIX의 텍스트 편집기이다. 편집기를 이용하기 위해서는 텍스트의 삽입과 수정을 위한 편집기 명령어를 알아야 한다.
2) cc 컴파일러를 이용하여 프로그램을 번역한다.
예를 들면.
cc test.c
만일 코드에 에러가 없다면 실행 가능한 파일인 a.out가 자동적으로 생성되고, 프로그램은 실행준비가 된다. 만일 에러가 있으면 단계 1부터 다시 시작한다. 이 단계에서 발생하는 에러를 문법 에러(syntax error) 또는 번역시간 에러라 한다. 또한 lint라 불리는 프로그램은 문법에러를 찾고 다른 사항들을 검사하는 데 사용된다. 한편 터보 C의 경우나 MS C의 경우 본 교재에 있듯이 번역된 후의 실행파일은 test.exe가 생성된다.
lint test.c
3) 프로그램을 실행한다. 실행은 다음의 명령으로 수행된다.
a.out (터보 C나 MS C 의 경우 test.exe)
에러 없이 프로그램 번역이 끝나면 실행을 시작한다. 전형적으로 프로그램에 실행시간 에러가 없다면 실행이 끝나고 프롬프트가 화면에 다시 나타게 된다.
그러나 여러 가지 이유로 프로그램을 변경할 필요가 있으면 단계 1부터 다시 시작한다.
프로그램에서는 여러 종류의 에러가 발생한다. 문법 에러는 컴파일러가 찾아낸다. 그러나 다른 에러들은 프로그램이 실행될 때에서야 나타난다. 두 번째 경우의 에러를 실행시간 에러라 한다. 예를 들어 프로그램에 0으로 나누는 계산이 코드화 된다면 이것은 실행시간 에러로 나타난다.
3. 프로그램작성과 실행 예
프로그램 출력의 첫 번째 예로, 화면에 ‘today is Sunday'라는 구절을 인쇄하는 프로그램을 작성해 보기로 한다.
main()
{
printf("today i s Sunday\n");
}
텍스트 편집기를 이용하여 파일명이 .c로 끝나는 파일에 이 내용을 입력한다. 파일명은 연상식 어휘로 선택하는 것이 좋은데, 위의 프로그램은 today.c파일에 작성하였다고 가정하자. 명령
cc today.c
는 cc 컴파일러를 불러낸다. 만약 코드에 에러가 없다면 실행 가능한 파일 a.out를 생성한다. 다음에 명령
a.out
는 프로그램을 실행시키고 화면에 아래의 내용을 프린트한다.
today is Sunday
번역된 목적코드의 디폴트 파일명은 a.out이다. 만일 또 다른 프로그램을 번역한다면, 그것은 파일 a.out에 중복되어 기록되고 새로운 실행가능코드가 생성되어 이전의 실행파일은 없어지게 된다. 그러므로 a.out에 있는 실행가능 코드를 저장하고자 한다면 그 파일을 다른 이름으로 전환하여 저장해야만 한다. 전형적으로 파일 today.c가 원시코드라면 a.out에 있는 그에 대한 실행가능코드는 today로 이동시키는 것이 좋다. 이것을 수행하는 명령은
mv a.out today
많은 UNIX명령이 선택사항을 갖는데, 보통 마이너스 부호와 같이 쓴다. cc 명령어는 많은 선택사항을 갖는데, 그 하나가 -o이다. 선택사항에 따라서 번역된 결과를 -o뒤에 나타나는 파일명으로 출력시킨다. 따라서
cc -o today today.c
는 today.c를 번역하여 실행가능코드를 today에 넣는다.
today
이 명령어는 화면에 아래의 내용을 프린트한다.
today is Sunday
4. 프로그램 today의 분석
main ()
모든 프로그램은 main이란 명칭의 함수를 가지며, 이 함수로부터 실행된다. main 다음의 () 는 컴파일러에게 이것이 함수라는 것을 지정해 준다.
{
중괄호는 함수의 본체 부를 내포하며, 문장들을 함께 묶는데 이용된다.
printf()
C 시스템은 프로그램에 사용할 수 있는 함수들로 표준 라이브러리를 구성하고 있다. 이것은 화면에 출력시키는 표준 라이브러리의 함수이다.
“today is Sunday\n"
C의 문자열 상수는 이중 인용부호로 둘러싼 문자들의 열이다. 이 문자열은 printf()함수의 매개변수로서 인쇄하고자 하는 것을 제어한다. 문자열의 끝에 있는 두 문자 \n은 newline이라 불리는 하나의 문자를 나타낸다. 이것은 프린트되지 않으며 화면에서 커서를 새로운 라인으로 옮기는 작용을 한다.
}
이 오른쪽 중괄호는 위의 왼쪽 중괄호와 짝이 맞아야 되며 함수 main()를 종료시킨다.
printf() 함수는 화면을 따라 계속 인쇄하는 동작을 한다. newline 문자를 읽었을 때 새로운 라인으로 이동한다. 화면은 오른쪽으로, 그리고 위에서 아래로 프린트되는 2차원 영상장치이다. 판독이 가능하도록 출력은 화면 위의 적당한 위치에 나타나야 한다.
우리는 처음의 프로그램을 다음과 같이 다시 작성할 수 있다.
main()
{
printf("today");
printf("is ");
printf("Sunday");
printf("\n");
}
이 프로그램은 처음의 프로그램과 다르지만 똑같은 출력을 보여준다. 매번 printf()가 호출될 때 바로 전에 호출되었던 printf()가 끝난 위치로부터 시작된다. 그러나 위의 문장을 세 개의 라인에 프린트하기 위해 newline 문자를 이용하는 예는 아래와 같다.
main()
{
printf("today\n");
printf("is\n");
printf("Sunday\n");
이 프로그램을 실행하면 다음과 같은 출력을 얻을 수 있다.
today
is
Sunday
이상에서 우리는 UNIX를 기반으로 하는 컴파일러를 사용하여 작성된 프로그램을 어떻게 번역하고 실행하는지에 관해 학습하였다.
다음에는 변수와 식 그리고 치환에 관해 학습하기로 한다.
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
C언어 :: C언어 입출력 (1) | 2009.03.17 |
---|---|
C언어 :: 매크로 (0) | 2009.03.17 |
[C언어] C언어 변수 (0) | 2009.03.17 |
[C언어] C언어 선행처리기 (0) | 2009.03.17 |
[C언어] C언어 자료의 입/출력 (0) | 2009.03.17 |