C 언어는 포인터라는 깊은 논리적인 사고를 요하는 연산자와 긴 코드때문에 어렵기로 악명이 높습니다.. 그러나 프로그래밍을 전문적으로 전공하는 사람들이라면 반드시 한 번쯤은 고비를 넘어가야 하는 필수 언어이기도 합니다. 필자 또한 돌아보면 1학년 2학기에 교수님께서 유독 C언어의 중요성을 강조하시면서 혹독하게 학생들을 훈련시켰던 기억이 있습니다. 4학년이 된 지금은 그 이유를 서서히 꺠닫고 있습니다.
그렇다면 어떻게 C언어가 탄생하게 되었을까? 우선 이름의 유래부터 살펴보자. 상단의 그림의 두 분의 성함은 켄 톰슨과 데니스 리치이고, 이 두분이 AT&T사의 벨 연구소에서 1969부터 1973년까지 4년에 걸쳐 C언어를 개발하셨다고 한다. 개발의 목표는 UNIX 운영체제를 만드는 데에 사용되었던 언어인 PDP-7 언어를 PDP-11 언어로 포팅하기로 결정하였다가 이 언어의 기능인 바이트 접근 기능을 활용하지 못하는 B언어의 기능을 보안하기 위해서 'B'보다 발전된 'C'언어가 개발되었다. 간단하게 정리하면, 당시 최고의 운영체제인 UNIX를 포팅 하기위해 만들어졌다고 보시면 됩니다.
C 언어는 1977년 리치와 스티븐 C. 존슨이 운영체제의 이식성을 높이기 위해 추가로 변경하였고, 존슨이 만든 Portable C Compiler가 C언어 플랫폼에 기초가 되었다고 합니다.
프로그래머 사이에서 C언어가 유명해지기까지 중요한 역할을 했던, C언어의 Reference라고 해도 과언이 아닐 정도로 유명한 책이 있습니다. 바로 속칭 K&R이라 불리는 브라이언 케니헨과 데니스 리치가 출간한 The C Programming Language입니다. 저도 C언어 과목을 배울 때 교수님께서 알려 주셔서 많이 참고했던 기억이 있습니다.
C언어의 최대 강점은 무엇일까요? 바로 '실행 속도' 입니다. 위에서 C언어가 운영체제를 만들기 위해 만들어진 언어라고 언급했었죠. 그렇습니다. 운영체제는 모든 응용 소프트웨어가 그 위에서 동작해야 하기 때문에, 속도가 가장 중요합니다. 따라서 그 어떤 언어보다 속도를 요구하는 언어이고, 하드웨어의 기계어와 1대 1 매칭이 될 수 있도록 설계되어야 합니다. C 컴파일러는 C언어를 다른 어떤 언어들보다 더 기계와 친숙한 언어로 변환합니다.
두번 째는 '사용성'입니다. 쉬운 그렇다고 해서 사람이 기계어로 코딩을 하는 것은 너무나 비생산적인 일이기 때문에(데니스 리치는 0과 1로 코딩을 할 수 있었다고 합니다 ㄷㄷ) 무작정 기계어가 좋은 것은 아닙니다. 또한 기계어는 하드웨어마다 다르게 동작하기 때문에 이식성의 문제가 있습니다. 그런데 C언어는 사람이 이해하는데도 어렵지 않으면서 기계어와 가깝게 설계되었기 때문에 속도와 사용성의 두 마리 토끼를 다 가질 수 있었습니다.
세번 째는 '이식성'입니다. 당시 컴퓨터 CPU들은 회사마다 다른 명령어로 동작하고 있고 이 때문에 한 회사의 어셈블리어로 운영체제를 작성하게 되면, 다른 컴퓨터에서는 동작하지 않았습니다. 그 엄청난 양의 코드를 새로운 언어로 다시 작성해야 한다는 불편함이 있었죠. C언어는 훌륭한 컴파일러 덕분에 대부분의 CPU에서 잘 동작하고, 성능도 준수하기에 다른 언어들보다 강점이 있습니다.(GCC 다들 아시죠~)
마지막으로는 '지속적인 개발과 표준 채택'입니다. C언어의 컴파일러는 컴퓨터 오픈소스를 창시한 GNU 프로젝트의 핵심 프로젝트로서, 임배디드 전자장치나 리눅스 커널에도 무료로 누구나 코드를 보고 사용될 수 있도록 널리 전파되었습니다. 또한 C언어는 미국 국가 표준 협회(ANSI, American National Standards Institute) 에서도 표준으로 채택되었습니다.
백준을 풀다 보면 아직도 C/C++ 언어로 문제를 푸는 사람들이(저를 포함해서) 가장 많다는 것을 느낍니다. 임배디드 회사에서도 입사 코딩 테스트에서 C나 C++로 언어를 제한하는 것을 보면 비록 다른 언어들이 치고 올라올지라도 아직 C는 현역이라고 생각합니다. 가끔은 새로운 언어의 여러 기능(클래스, 상속, 가비지 컬렉터) 등등의 기능이 없어 때론 뒤쳐지는 언어라 생각하고, 처음부터 C++을 배우지 뭣하러 C를 배우는가 생각이 들 수 있습니다. 그러나 C언어처럼 메모리를 직접 관리하고 포인터의 개념을 사용해봐야 새로운 언어에 장착된 기능이 얼마나 편리한지 그 진가를 알 수 있다고 생각합니다. 앞으로 C언어를 열심히 공부해봅시다.
이상으로 C 프로그래밍 언어의 역사 포스팅을 마치겠습니다.
참고: 위키피디아 C언어
'Languages > C' 카테고리의 다른 글
C언어 매크로(Macro)와 전처리기(Preprocessors) 총정리 (2) | 2020.05.24 |
---|---|
터미널에서 문자열의 끝 문자(널문자) 입력하기 '\0' (0) | 2019.10.02 |