d라이브러리









C언어 강좌① 경제적이며 배우기 쉬운 고급언어

C언어는 원래 유닉스(UNIX)라는 오퍼레이팅스시팀을 기술하기 위해 개발된 언어였다. 이제는 개인용 컴퓨터에서도 UNIX와 비슷한 수준의 오퍼레이팅 시스팀을 사용할 수 있게 되었다. C언어는 어셈블리언어에 필적하는 각종 특성을 갖추고 있다.

각종 컴퓨터 관련 잡지에 게재되는 프로그램이 C언어로 작성 될 정도로 이제는 보편화 되었다. 또한 개인용 컴퓨터에서도 C언어를 지원하는 C컴파일러가 다수 개발되어 그 효율이 상당히 개선되어 가고 있다. 이러한 추세로 발전한다면 C언어가 BASIC의 아성을 누르는 언어로 각광을 받을 것이다. 이번 호부터서 C언어의 문법을 몇 차례 다룬 후 그 응용적 연구를 위해 실제적인 개발 사례를 들어 C언어를 활용해볼 계획이다.

벨연구소에서 탄생

C언어는 '벨'연구소에서 개발한 언어로 크기가 작고 표현의 경제성을 고려했으며 범용 프로그램밍을 위한 환경을 제공하는 고급 언어이다. 그러나 사용자들은 저수준의 프로그램까지도 C언어를 사용할 수 있다 하여 '저수준형 고수준 언어'라고 부르고 있다. 이는 전통적인 C언어 프로그래머들이 어셈블리 언어로 프로그램을 개발한 경험이 많은 사람들이기 때문이다.

FORTRAN이나 BASIC과 같은 언어에 익숙한 사람들이 곧바로 C언어를 구사할 수 없겠지만 BASIC을 배우는 시간보다 더 단축된 시간을 요할 정도로 배우기 쉽다.

C언어를 배우는데 어려운 점은 고수준 언어로 프로그램을 하는 사람들에 의한 편견일 뿐이다. 필자가 85년부터 대학에서 C언어를 가르쳐 본 경험으로 보면 초보자가 BASIC과 C를 병행해서 컴퓨터의 프로그래밍 과정을 이수하면 전체 학습과정의 이해가 빨라지고 다른 언어에 쉽게 적응할 수 있음을 알았다.

C언어는 BASIC이 할 수 있는 그 무엇이나 모두 처리할 수 있다. BASIC의 많은 기능들이 C언어 자체에 제공되지 않고 있으나 C언어는 같은 기능을 만들어 낼 수 있는 기본적 기능을 충분하게 제공하고 있기 때문에 라이브러리(Library)를 잘 이용하면 된다. 다시 말하면 필요한 벽돌만 준비되어으면 무궁무진한 형태의 집을 지을 수 있는 것과 마찬가지이다.

개인의 소박한 열망에서 시작

'뉴저지'의 '머레이힐'에 위치한 벨연구소의 프로그래머 그룹에서 C언어와 UNIX는 탄생했다. '멀틱스'(MULTICS) 프로젝트에 관련된 MIT, '하니웰사' 그리고 벨연구소의 연구원들이 합동으로 MULTICS가 개발되었지만 중도에 벨연구소만 연구를 그만두었다. 이때 벨연구소가 MULTICS와 인연을 끊자 개발그룹의 일원이었던 '톰슨'(Ken Thom son)은 PDP-7을 사용하여 오퍼레이팅 시스팀을 개발하기 시작했다. 그는 먼저 어셈블리어 설계하였고 UNIX라 이름을 지었다. 많은 시스팀 수준의 프로그래머들은 이 UNIX를 MULTICS의 축소판인 것으로 알고 있으나 확실한 근거는 없다.

초기의 UNIX는 확실한 1인용 오퍼레이팅 시스팀이었다. 톰슨은 개인적인 흥미거리로 이 일을 시작하였지만 계속 관심의 초점이 되기 시작하였다. 그후'리치'(Dennis Ritchie)가 이 연구에 들어왔고 PDP-11상에서 개발 이식되기 시작했다. 연구가 진행되면서 톰슨은 B라고 불리우는 인터프리터를 작성하였다. B언어는 BCPL과 유사한데 이식성이 높은 언어였다. 톰슨은 코드를 BCPL로 만들 때의 즐거움을 B언어로 확장한 것이다. 언어의 이름을 B로 한 이유는 BCPL의 매우작고 간단한 부분으로 되어있기 때문이다. BCPL의 첫글자 B를 따서 지은 이름이다.

리치가 톰슨이 뜬 B언어에 관심을 갖고 손질한 후 C언어라 불리는 컴파일언어를 개발하였다. BCPL의 두번째 글자 C를 따서 지은 이름이다.

어셈블리 언어로 작성된 UNIX는 PDP-11에 이식되고 연구소의 다른 사람들은 이 한사람의 착상에서 생긴 시스팀을 관심있게 다루기 시작했다. 다음 단계로 UNIX를 C언어로 다시 작성하기 시작하여 별 어려움 없이 그 작업을 끝냈다.

C언어가 처음 소개되었을 즈음에 UNIX가 거의 표현 가능하였으나 주변기기를 사용하기 위한 부분은 어셈블리언어로 작성하였다. UNIX에서 C언어를 이렇게 많이 사용한 것은 C가 효율이 좋다는 사실과 C를 사용하면 특정한 프로그래밍상의 문제가 기계 사이클수준에서 그 처리 과정을 짐작할 수 있기 때문이다.

보통 마이크로컴퓨터를 사용하는 사람들은 거의 BASIC 인터프리터의 세계에 묶여 있지만 일부는 BASIC 컴파일러, FORTRAN, PASCAL, COBOL, PROLOG, LISP 컴파일러까지 손을 뻗쳐 개발하고 있는 현실정에서, C언어가 차지하는 위치는 아직까지도 전문가 영역에 놓여 있지만 많은 상업적 소프트웨어 제작자들 뿐만 아니라 컴퓨터 애호가들의 사용빈도가 높아짐에 따라 초보자(비전문가)도 BASIC보다는 C언어를 우선적으로 공부해야 할지도 모른다.

앞서 설명했지만 C언어는 산업적 요구에서 개발된 것이 아니라 개인적 소망과 욕구, 더 좋은것을 만들려고 하는 개인의 소박한 열망으로부터 나온 것으로 우호적 경쟁속에서 계속적인 개발이 시도되어 몇사람의 지력과 창조력이 종합된 작품이라 할 수 있다.

BASIC의 아성에 도전한다

만약 여러분이 이미 BASIC언어를 사용해 보았다면 BASIC 컴파일러보다는 BASIC 인터프리터를 주로 사용하였을 것이다. 간단히 말하면 인터프리터 방식의 프로그램 실행은 한번에 한행분으로 문장을 해석 실행하는 것이다. 이러한 작업과정은 프로그램의 실행 속도가 떨어진다. 이것은 한행분의 문장을 읽기 위한 시간, 해당되는 기계의 루틴을 실행하기 위한 과정, 그리고 제어를 다시 인터프리터에 넘겨 주는 등의 시간이 필요하기 때문이다.

C언어에서도 마찬가지로 C 인터프리터가 개발되었다. 초보자가 C언어를 배우는 과정에서는 C인터프리터를 사용하는 것이 훨씬 유리할 것이다. 왜냐하면 초보자가 배워서 작성하는 프로그램이 대개 한 화면을 넘지않고 간단한 문법적 지식을 습득하기에는 최적이기 때문이다. 그리고 인터프리터에는 에디터(Editor)가 내장되어 있어서 작업속도가 훨씬 빠르다. 특히 "RUN/C Professional" 이라는 C인어프리터는 주메모리에 상주하면서 화면에디터를 제공하고 있으며 명령도 BASIC과 유사하여 C의 초급자를 위해서는 최적이라 하겠다.

따라서 이 연재에서는 계속 특별한 이유가 없는이상 "RUN/C Professional" C인터프리터를 사용할 것이며 실제적인 프로그램개발 사례를 설명할 경우 Microsoft C나 Cattice C 그리고 Turbo C를 소개할 계획이다.

RUN/C를 사용한 C언어의 실행

일단 독자들이 C언어를 전혀 모르는 것으로 가정하고 BASIC 프로그램을 예로들어 실행결과가 똑같은C프로그램을 설명한다.
〔BASIC 언어〕
 

[BASIC 언어]


〔C 언어〕
 

[C 언어]


위 두 프로그램의 실행결과는 똑같다. BASIC 프로그램은, GWBASIC으로 C프로그램은 RUN/C Professional 인터프리터로 실행시킨 예를 (그림1)과 (그림2)에서 보였다. 사용방법이 유사함을 한눈에 알 수 있을 것이다.
 

(그림 1) GWBASIC의 사용보기


RUN/C Professional 인터프리터의 각종 명령의 사용법을 (그림3)에 보였다. 각 명령의 기능을 정리하면 대략 다음과 같다.
 

(그림 2) RUN/C Professional 인터프리터의 사용보기


RUN명령 :에디터로 작성한 프로그램을 실행시킨다.
SAVE 명령 :에디터로 작성한 프로그램을 디스크에저장한다.
NEW 명령 :메모리상에서 에디터로 작성한 프로그램을 지워버린다.
LOAD명령 :디스크에서 사용하려는 파일을 메모리로 가져온다.
SYSTEM 명령 :RUN/C 인터프리터의 사용을 종료시킨다.
LIST 명령 :메모리상에 기억된 프로그램을 화면에 출력시킨다.
LLIST 명령 :메모리상에 기억된 프로그램을 프린터에 출력시킨다.
NLLIST 명령 :프린터에 행번호없이 프로그램의 내용을 출력한다.
EDIT 명령 :화면에디터(Screen editor) 방식으로 들어가 화면상에서 프로그램의 수정이 가능하다. 화면제어명령키의 기능이 Wordstar, Turbo Pascal, Sidekict와 같기 때문에 화면에디터를 한번 사용했던 독자는 별 어려움없이 이용할 수 있을 것이다.
화면에디터의 도움말을 RUN/C Professional 내에 기억하고 있으며 이는 (F1)키를 눌렀을 때 화면에 출력된다.
 

(그림 3)


SHELL 명령 :MS-DOS의 명령을 사용하기 위한 명령으로 MS-DOS 명령 사용 후 EXIT로 다시 RUN/C 인터프리터로 돌아갈 수 있다.
FILES 명령 :디스크에 기억되어 있는 파일명을 살펴 볼 수 있다.
KILL 명령 :디스크의 파일을 지워버릴 수 있다.
TYPE 명령 :인터프리터모드에서 곧 바로 디스크에 기억된 파일의 내용을 출력시킬 수 있다.
 

그림.


(표1) 화면에디터 방식에서의 키조작을 위한 제어 키의 각 기능
 

(표 1) 화면에디터 방식에서의 키 조작을 위한 제어 키의 각 기능


PREC 명령 :C언어의 연산자의 우선 순위표를 보여준다.
TRON 명령 :프로그램의 실행과정을 눈으로 확인해 갈 수 있고 각 문장의 실행상태를 확인 할 수 있다.
TROFF 명령 :트레이스 기능을 취소한다.
TRACE명령 :프로그램 실행도중에 각 변수값의 변화를 추적할 수 있는 명령이다.(토글방식으로 작동한다.)
PRON 명령 :각 문장이 실행되는 회수를 계산한다.
PROFF 명령 :PRON기능을 취소한다.
FRE명령 : 현재 사용가능한 남아있는 메모리의 공간의 크기를 출력한다.

RUN/C Professional 인터프리터를 사용하여 위 명령을 실행시켜보기 위해 다음의 C프로그램을 사용하였다. 같은 출력을 내는 BASIC 프로그램도 비교해보았다.
〔C언어〕
 

[C 언어]


〔BASIC〕
 

〔BASIC〕


BASIC이나 C에서나 모두 한행에 여러 문장을 사용할 수 있으나 문장분리기호(delimiter)가 다르다. 세미콜론(;)은 C에서 사용한다. 따라서 모든 문장 다음에 꼭 ; 기호가 사용되어야 한다. BASIC에서는 문장번호가 일부 분리기능을 담당하기 때문에 다음에 : 기호를 붙이지 않아도 된다. 만약 BASIC에서 문장뒤에 : 을 사용하면 무의미한 문장이 삽입되어 버린다.

그리고 프로그램이 실행되면 BASIC은 문장번호가 제일 작은 문장이 먼저 실행되는 데 C인터프리터에서는 main( )으로 시작하는 함수부터 실행된다. main 다음의 ( )기호는 main이라는 함수의 인수(argument)가 없음을 의미한다.

{ 와 }기호는 변수가 사용되는 영역을 나타내거나 복수개의 문장을 하나의 블럭으로 처리하기 위한 것이다. 프로그램을 구조적으로 표현하기 위해, 사용한 문장속에서 효율적으로 사용한다.

정수값을 출력하기 위해 printf함수를 사용하고 있으며 정수값 출력용 포맷으로 %4d를 사용한 것은 정수를 최대4자리까지 표현하기 위한 것이다.

다음호에서는 C언어의 입출력에 관계된 사항을 다루며 기본적 연산을 통해 C언어가 갖추고 있는 연산자의 기능을 살펴보겠다. 독자여러분께서는 RUN/C Professional 인터프리터를 구입하여 각종 명령을 익혀 두는 것이 좋을 것이다.

이 기사의 내용이 궁금하신가요?

기사 전문을 보시려면500(500원)이 필요합니다.

1987년 10월 과학동아 정보

  • 조동섭 교수

🎓️ 진로 추천

  • 컴퓨터공학
  • 소프트웨어공학
  • 정보·통신공학
이 기사를 읽은 분이 본
다른 인기기사는?