1-2.C/C++언어 소개

1-2-가.C/C++의 역사

C언어는 1972년 벨 연구소의 데니스 리치(Dennis Ritchie)에 의해 만들어졌다. 데니스 리치는 UNIX 운영체제의 개발을 맡고 있었는데 운영체제는 그 특성상 하드웨어를 직접 제어할 수 있어야 했다. 또한 당시의 컴퓨터 환경이 지금과는 달라 CPU의 속도나 메모리의 용량이 충분하지 않았기 때문에 프로그램의 크기는 작아야 했고 속도는 빨라야했다.

이런 모든 요구를 만족시킬 수 있는 유일한 언어는 어셈블리밖에 없었다. 그러나 어셈블리는 특정 기계에 종속적이며 이식성이 없기 때문에 여러 플랫폼에 수정없이 사용하는 것이 목적인 UNIX와는 잘 어울리지 않았다. C언어보다 먼저 발표된 포트란이나 베이직같은 고급언어들은 효율이 좋지 못해 대형 프로젝트에 쓰기에는 역시 부적합했다.

그래서 데니스 리치는 기존의 언어를 사용하지 않고 어셈블리의 강력한 기능과 고급언어의 이식성을 동시에 갖춘 새로운 언어를 직접 만들었다. 물론 데니스 리치가 혼자서 C언어를 다 만든 것은 아니며 과거 언어들의 장점을 취합 정리해서 만든 것이다. C언어의 뿌리는 최초의 구조적 언어인 ALGOL이며 데니스 리치는 동료인 켄 톰슨(Ken Thompson)이 만든 B언어를 개량하여 C언어를 만들었다. C언어의 계보를 그려 보면 다음과 같다.

이 언어에 C라는 이름을 붙인 이유는 단순히 B보다 한단계 더 발전했다는 의미로 B 다음의 알파벳인 C를 사용한 것이다. 그래서 혹자는 C언어 다음은 D언어가 나올 것이다라고 얘기하기도 하는데 이런 예상과는 달리 C언어의 다음은 C++이 되었다. C언어는 간결하면서도 강력한 프로그램을 작성하기에 적합하여 오늘날 가장 대중적인 프로그래밍 언어로 사용되고 있다.

C언어가 발표되기 전의 언어들은 각각 장단점이 있어서 특정 분야에서 독점적인 지위를 가지는 고유의 영역을 확보하고 있었다. 예를 들어 파스칼이나 베이직은 교육용 언어로 분류되었고 코볼은 상업용 소프트웨어 작성에 효율적이었으며 포트란은 과학 기술용 언어로 주로 사용되었다. 또한 리스프는 인공 지능 구현에 적합했으며 어셈블리는 시스템 프로그래밍을 위한 최적의 언어였다. 그러나 이런 분류는 모든 분야에 강점을 보이는 범용의 C언어가 등장함으로써 의미를 잃게 되었다. C언어가 모든 분야를 제압해 버린 것이다.

C언어는 그 강력함으로 인해 80년대 이후 여러 분야에 걸쳐 광범위하게 사용되기 시작했으며 가장 인기있는 언어가 되었다. 그러나 데니스 리치가 처음 C언어를 디자인할 때에 비해 컴퓨터 환경이 많이 변해 비효율적인 면들이 점점 드러나기 시작했으며 또한 애매한 문법들이 존재했었다.

각 컴파일러 개발사들은 경쟁적으로 수많은 C컴파일러를 발표했다. 컴파일러는 일종의 상품이기 때문에 타사 제품과 차별화되는 기능이 있어야 하고 변화된 환경에 적응할 수 있는 새로운 기능을 추가할 필요도 있다. 각 제작사들은 시장의 요구와 필요에 따라 조금씩 언어의 기능을 확장함으로써 C언어에도 많은 변종들이 생겨나게 되었다. 이렇게 되면 작성한 컴파일러에 따라 소스 차원의 호환성이 없어지는 문제점이 있으며 이는 사회적으로 큰 낭비를 초래하였다.

변화된 환경에 적응하고 경쟁으로 인해 훼손된 이식성을 복구하기 위해서는 표준의 제정이 절실히 필요해졌다. 그래서 미 표준 위원회인 ANSI는 83년부터 표준 제정 작업에 들어가 89년에 표준안을 완성했으며 90년에 ISO에 의해 승인(ISO 9899)되었다. 이때 제정된 C 표준을 ANSI C(또는 C90)라고 하며 그 이전의 C를 클래식 C(K&R C)라고 한다. ANSI C는 클래식 C에 비해 안전성을 높이고 애매한 기능을 정리하였으며 다음과 같은 기능을 추가했다.

 

표준 라이브러리 함수를 규격화했으며 헤더 파일도 통일했다.

함수의 원형 선언 기능이 추가되어 컴파일러가 함수 호출부에서 타입 체크를 할 수 있다.

정수, 실수 상수의 타입을 지정할 수 있는 L, U, F 등의 접미어가 추가되었다.

enum, void 형과 const, volatile 제한자가 추가되었다.

인접 문자열 상수를 합쳐 주고 확장열의 기능도 추가되었다.

함수 내부에서 선언하는 지역 배열이나 구조체를 초기화할 수 있다.

구조체끼리 대입할 경우 구조체 크기만큼 메모리 복사를 한다.

 

이후에도 C표준은 지속적으로 확장되었는데 95년에 유럽과 동양의 언어를 지원하기 위한 멀티 바이트 문자 지원이 추가되었다. 이때 제정된 C 표준을 C95라고 하는데 ANSI C에 비해 언어의 기능상 큰 변화는 없었다. 그리고 99년에 다양한 기능을 추가하고 C++의 장점을 흡수하여 다시 한 번 개정되었으며 2005년 경에 또 한 번 더 개정될 예정이다. 그러나 실제 여러분들이 사용할 C++은 ANSI C를 기준으로 하기 때문에 그 이후에 C문법에 대해서는 당분간 관심을 두지 않아도 될 듯 하다.