C를 처음 접하신다는 분들이 예상외로 많은 것 같아서 그냥 생각나는대로 한번 적어 봅니다. ^^;
횡설 수설 하더라도.. 그러려니 해 주세요..
쉽게 한번 풀어 보려는데..
혹시라도 이해가 안되시는 부분이 있으시면 댓글로...
그럼 시작해 볼까요?
컴퓨터라는 놈은.. 0 or 1 밖에 모르는 무지한 기계입니다.
이 놈이랑 소통을 하기 위해서, 우리는 컴퓨터 언어라는 것을 쓰지요.. 그런데 왜 C고 C++이냐...
먼저 간단한 배경을 설명 드리면..
C 언어의 태생은 UNIX라는 운영체제의 탄생과 함께 합니다.
(주: 운영체제란 컴퓨터가 동작하는데 있어서 필수 적인 프로그램입니다. 윈도우즈, 리눅스 같은 놈을 이야기 하죠.)
Bell 연구소에서 UNIX라는 운영체제를 만들기 위하여 기존에 있던 ALGOL-60에서 이어진 B라는 언어를 개량하여 만들어 낸 것이죠.
초기의 UNIX 시스템은 Assembly Language 로만 작성이 되었습니다. 하드웨어를 직접 제어할 수 있는 언어는 당시에는 Assembly 밖에 없었으니까요.
그 당시 고급언어의 주종을 이루었던 언어로는 COBOL과 FORTRAN이 있었습니다. COBOL은, 회계 및 상업용 소프트웨어의 제작에 강점이 있었고, FORTRAN은 FORmular TRANslator 라는 이름에 걸맞게 수치 계산에 강점을 가지고 있었지요. 70년대의 컴퓨터 언어계의 스타였던 두 언어중 COBOL은 당시에 제작되었던 회계 및 은행 시스템을 구축하는데 사용되었으며, 그 때 제작된 시스템을 현재까지 쓰고 있기 때문에, 1999년에서 2000년으로 넘어갈 무렵 즈음에 밀레니엄 버그 라는 특수를 누리기도 합니다만, 현재 새로이 구축되는 곳에서는 거의 쓰지 않기 때문에, 이미 "고어"가 되어 버렸죠. FORTRAN과 같은 경우에는 수치계산에 특화되어 있고, 기존에 작성된 수 많은 수학 라이브러리 때문에, 현재 까지도 과학 계산 분야에서는 널리 쓰이고 있습니다.
잠깐 옆으로 샜는데.. C언어 이야기를 다시 한번 해 볼까요?
앞서 이야기 한 것 처럼 C는 Dennis Ritchie라는 사람에 의해 UNIX라는 운영체제를 만들기 위해서 만들어진 언어입니다. 운영체제를 만드는데 쓰여졌기 때문에, 기존에는 Assembly로만 가능하던 Low-Level 수준의 하드웨어 제어가 필요하게 되었고, 또한 사용자로 하여금 쉽고 편하게 접근할 수 있어야 한다는 컨셉을 가지고 만들어졌습니다.
당시에는 여러 종류의 CPU들이 막 만들어지고, 보급되기 시작한 시점이었습니다. 그리하여, 개인이 사용할 수 있는 컴퓨터, 즉 PC(Personal Computer)의 보급이 시작되었고, 이른바 "해커"라 불리우는 선지자들에 의해서 컴퓨터는 기존에 사용되던 빠른 계산만이 필요한 분야뿐만이 아니라, 다양한 용도로 사용이 확장되었습니다. 많은 해커들이 자신이 만든 소스 코드를 공개하였으며, 이로 인하여 많은 사람들이 컴퓨터라는 기계가 단순히 계산만을 위한 기계가 아니라, 무언가 새로운 것을 시도할 수 있도록 하는 보조장치로 사용할 수 있다는 것을 깨닫게 됩니다.
또 옆으로 새어 버렸군요.. ^^;
많은 종류의 CPU들이 보급되면서 사람들은 좀 더 편하게 프로그램을 짤 수 있는 방법을 생각하게 됩니다. CPU는 그 제조사 마다, 각각의 명령어 세트를 가지고 있으며, Assembly는 그 각각의 명령어에 1:1로 매칭이 되는 그나마 가독성을 가진 언어인데, 이 조차도 일반 사용자들이 보기에는 난해한 기호일 뿐, 접근하기가 쉽지 않습니다.
Assembly 같은 경우는 CPU에 따라 다른 명령어 체계를 가지고 있기 때문에, 다른 플랫폼(다른 종류의 CPU)를 사용하는 기계에서는 기존에 작성되었던 프로그램들을 모두 재작성해야 하는 번거로움이 있었죠. 그렇기에 사용자가 좀 더 보기 편하게 만들어 지는 언어들이 이른바 "고급 언어"라는 놈이며, 앞서 이야기 한 COBOL, FORTRAN, C 등이 이에 속하게 됩니다. 고급언어로 만들어진 프로그램들은, 각각 "컴파일러" 또는 "인터프리터"라는 녀석들이 CPU 구조에 맞게, Assembly로 변환시켜 줍니다. 그리 되면서 부터 사용자는 CPU에 따라, 다른 프로그램을 작성할 필요 없이 하나의 프로그램 소스를 가지고, 여러 종류의 CPU에 사용할 수 있게 된거죠. 이를 좀 어려운 말로 "이식성"이라고 합니다.
프로그램 소스를 컴파일하여 바이너리를 만드는데, 이 바이너리 라는 놈이 실제로 우리가 실행을 하는 놈이지요. 바이너리는 CPU에 맞는 machine code 즉.. 기계어로 변환되어 있는 놈이기 때문에, 예를 들어 우리가 사용하는 일반적인 PC(Windows를 사용하는 Pentium PC)에서 실행 되는 놈이 APPLE 매킨토시(Mac OS X를 사용하는 이쁜 아이맥?)에서 실행이 되지는 않습니다. 하지만, 같은 소스를 각각의 플랫폼에 맞는 컴파일러를 사용하여 컴파일을 할 경우에 간단한 수정을 통하여 사용할 수가 있게 됩니다. 이를 "소스 수준에서 호환성을 가진다" 라고 이야기 하며, "이식성이 좋다"고 이야기 하죠.
뭐 이야기가 길어졌군요..
다시 C 언어 이야기로 돌아와서 정리를 하면, 1972년 Dennis Ritchie는 B 언어의 성능을 개선시켜 Assembly 의 강력한 기능과 고급 언어의 이식성을 동시에 갖춘 C 언어를 개발하였습니다. 그래서 Assembly로 작성되었던 초기의 UNIX를 C 언어로 다시 작성하였고, 그 결과로 UNIX는 프로그램의 개발과 연구에 유용한 환경을 제공하는 훌륭한 OS로 새롭게 탄생하게 된 것이죠.
C 언어는 1970년대를 지나면서 UNIX와 함게 점차 보급되기 시작하였고, 1980년대 이후로 PC의 대중화에 힘입어 MS-DOS 등에서도 광범위하게 사용되었죠. 그러나 Dennis Ritchie가 처음 C 언어를 설계할 때에 비해 컴퓨터 환경이 많이 변해 비효율적인 면들이 점점 늘어나기 시작했고, 또한 애매한 문법들이 존재했었기 때문에, 각 컴파일러를 만드는 개발사들은 경쟁적으로 수많은 C컴파일러를 발표했습니다.(예: Turbo-C 시리즈를 만들었던 Borland사, Quick-C, MS-C를 만들었던 microsoft사 등). 각 제작사들은 시장의 요구와 필요에 따라 조금씩 언어의 기능을 확장함으로써 C언어에도 많은 변종들이 생겨나게 되었고, 이렇게 되면 서 작성한 컴파일러에 따라 소스 차원의 호환성이 없어지는 문제점이 발생하였으며, 이는 사회적으로 큰 낭비를 초래하게 되었죠. 변화된 환경에 적응하고 경쟁으로 인해 훼손된 이식성을 복구하기 위해서는 표준의 제정이 절실히 필요하게 되었고, 그래서 ANSI는 83년부터 표준 제정작업에 들어가 89년에 표준안을 완성했으며 90년에 ISO에 의해 승인(ISO9899)되었습니다. 이때 제정된 C 표준을 ANSI C(또는 C90)라고 하며 그 이전의 C를 Classic C(K&R C)라고 합니다. ANSI C는 클래식 C에 비해 안전성을 높이고 애매한 기능을 정리하고 새로운 기능을 추가하게 됩니다.
오늘은 여기까지만 한번 정리를 해 보죠..
반응이 괜찮으면.. C++이나. 기타 다른 언어에 대해서도 잠깐 썰을 풀어 볼지도 -_-;
만일 처음 C언어를 공부하시는 분이라면, 제가 여지까지 봐 왔던 C언어 책 중에서 A Book on C (줄여서 ABC 라고도 합니다.)를 추천 합니다. 예제들이 많고, 내용이 그리 어렵지 않아, 천천히 따라가다 보면, 어느 덧 C에 익숙해져 있는, 자신을 보게 될지도.^^;
참고 :
http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200006140005그리고, 나는 C언어는 좀 알기 때문에 귀찮은 문법 같은거는 다시 보고 싶지 않다. 하시는 분들은.. "The C Programming Language" 라는 책이 있습니다. C언어를 처음 만들었던 Ritchie와 Kernighan 이라는 사람이 쓴 책인데.. 압축적으로 많은 내용을 담고 있어서 정리를 하는 용도로는 꽤 괜찮더군요.. ^^;;
참고 :
http://kangcom.com/common/bookinfo/bookinfo.asp?sku=199608030003(참고로 두 책 모두 원서보다 번역본이 쌉니다. ^^; 번역 상태도 좋구요.. )
그럼 여기까지...