C언어는 1970년대 초 AT&T의 벨 연구소에서 탄생한 프로그래밍 언어다. 시스템 프로그래밍 언어인 BCPL(basic combined programming language)에서 발전한 B언어를 계승했다. C언어는 개발 초기 'New B'로 불리기도 했다.
C의 아버지, 데니스 리치
C언어를 만든 인물은 멀틱스(Multics) 개발에 참여했던 데니스 리치다. 멀틱스는 운영체제로 1960년대 MIT 연구진을 중심으로 만든 시분할 방식의 운영체제 CTSS의 성공에 힘입어 기획됐다. 그러나 우여곡절 끝에 1969년 탄생한 멀틱스는 실사용하기에는 너무나도 복잡했다.
이에 대한 반작용으로 멀틱스 개발에 참여했던 벨 연구소 연구진들이 간결하게 만든 운영체제가 지금의 유닉스(Unix)였다. 초기 유닉스는 어셈블리어로 개발됐다. 이후 생산성 향샹을 위해 멀틱스 개발에 참여했던 데니스 리치가 자신의 경험을 바탕으로 C언어를 만들게 된 것이다.
빠르고 단순하게, C의 철학
유닉스를 만들기 위해 태어난 언어인 만큼 단순함이 C언어의 철학이 됐다. 당대의 다른 고수준 언어에 비해 비싼 메모리 자원을 훨씬 효율적으로 사용할 수 있었다. 또한 불과 수십쪽이면 배울 수 있는 간결성 덕분에 C언어는 폭발적 인기를 얻게 됐다. 심지어 C언어의 조상격인 BCPL이 before C programming lanuage의 약자라는 말장난까지 나왔다.
C언어가 어셈블리어를 대체하기 위해 탄생한 언어라는 증거는 현재도 찾아볼 수 있다. 일례로 C언어에서 배열을 만들 때 인덱스는 1이 아닌 0부터 시작한다. 이는 컴파일러가 오프셋 관점으로 제작된다는 점을 반영한 부분이다. 또 중첩 함수(함수 내에 함수를 정의하는 것)를 사용하지 못하게 함으로써 컴파일러가 단순해진다는 장점을 갖게 된다.
C의 영향력
C언어에는 전처리 매크로라는 기능이 존재하는데, C언어의 코드를 다음과 같이 프로그래머가 특정 단어로 치환하는 기능이다.
#define SQUARE(x) (x)*(x)
C언어는 대표적인 절차지향형 언어로서 수많은 기능을 프로그래밍하기에는 너무나도 복잡해진다는 단점을 안고 있다. 하지만 이렇게 전처리 매크로 기능을 이용하면 C언어를 베이스로 한 새로운 프로그래밍 언어의 제작이 가능하다.
C언어는 JAVA, Python 등 수많은 언어에 영향을 주기도 했다. 그럼에도 고수준 언어 중 가장 하드웨어에 근접하다는 특성 때문에 C언어는 성능을 중시하는 하드웨어 임베디드 시스템 프로그래밍에 여전히 사용된다. 실제 2012년 화성에 성공적으로 착륙한 탐사선 큐리오시티 역시 250만 줄의 C언어 코드로 작성됐다.
C언어를 배운다는 것
리눅스 시스템 개발자나 몇몇 임베디드 개발자를 제외하고 현업에서는 C 대신 C++를 많이 사용한다고 한다. 또 배우기엔 쉬워보이지만 쓰기엔 어려운 언어인 것도 사실이다. 어셈블리어 대신 사용하기 위한 언어답게 C언어는 프로그래머가 하드웨어에 대한 충분한 이해를 바탕으로 모든 에러 처리를 했다고 가정하기 때문이다.
결국 C언어를 잘 하기 위해선 컴퓨터 아키텍처에 대한 이해는 물론 메모리를 가리키는 포인터라는 복잡한 개념까지 컴퓨터의 동작 원리를 알아야 한다. C언어를 배운다는 것은 곧 컴퓨터 지식에 대한 기본기를 배우는 것이다.