“When someone says: ‘I want a programming language in which I need only say what I wish done’, give him a lollipop.”
'누군가가 원하는 것을 말하기만 하면 되는 프로그래밍 언어를 원한다고 하면, 그에게 사탕을 줘라'
– 앨런 펄리스(Alan J. Perlis)

이 책의 서두부터, C언어가 무엇인지를 한 문장으로 정의해준다. "가장 넓게 쓰이는 프로그래밍 언어로, 1970년 초반(1972년)에 벨 연구소에서 만들어진 언어이다. C에 대한 전반적인 역사, 무엇을 위해 만들어졌고, 시간이 지나며 어떻게 변했는지를 소개한다. 1.1에서는 C의 역사를, 1.2에서는 장단점을 소개한다.

 

1.1 History of C

Origins

  C는 벨 연구소의 Ken Thompson, Dennis Ritchie 등이 개발한 UNIX OS에서 파생되었다. UNIX는 그당시 다른 OS들과 마찬가지로 어셈블리어로 쓰여졌다. 어셈블리어는 유지보수하기 매우 힘들었기에, Thompson은 UNIX의 더 나은 발전을 위해 high-level의 언어가 필요하다고 결심한다. 그렇게 BCPL의 앞글자인 B라는 언어를 만들었다. 이어서 Ritchie가 UNIX 프로젝트에 참여하고 B로 프로그래밍하기 시작했다. 1970년, PDP-11을 UNIX에 적용시키기 위해 Thompson은 UNIX를 B로 일부 수정하였고, 1971년에 B가 UNIX에 적합한 언어가 아님이 명백해졌다.

 그렇게 1972년에 Ritchie가 B의 확장버전을 만들게 된다. 처음에는 새로운 B라는 의미의 NB라고 불렸으나 B와 다른부분이 많이 생기자 C로 바꾸었다. C언어는 1973년, UNIX를 C로 수정하기에 충분히 안정적이었다. C로 바꾸면서 갖게된 중요한 장점은 이식성이다. 다른 컴퓨터에서 작성된 C컴파일러는 UNIX가 돌아가는 다른 기계에서도 잘 작동했다.

Standardization

 C는 1970년대 이후로 계속 발전했지만, 특히 1977년에서 1979년에 K&R이라는 책이 나오면서 크게 발전했다. Brian Kernighan과 Dennis Ritchie가 출판했는데, 정식명칭은 The C Programming Language이고, C프로그래머들의 교과서가 되었다. 이 책은 지금도 사실상 C언어의 공식 표준으로 남아있다. 

 70년도에는, C프로그래머들이 비교적 적었고, 그들 중 대다수는 UNIX유저였다. 그러나 1980년이 되면서 C는 다른 OS를 기반으로하는 다양한 기계들에서도 적합하게 돌아가는것이 밝혀졌다. 특히, 이때 급성장한 IBM컴퓨터 플랫폼에서 발전하기 시작했다.

 C가 유명해지면서 문제도 생겼다. 새로운 C컴파일러를 쓰는 프로그래머들은 K&R에만 의존할 수 밖에 없었다. K&R은 몇몇 언어의 기능이 추상적이었고, 컴파일러들은 종종 이런 기능들을 다르게 대했다. 또한 K&R은 C에 속하는 기능과 UNIX에 속하는 기능에 대한 명확한 구분에 실패했다. 더 심각한 문제는, C가 K&R 출판 이후에도 새로운 기능이 추가되고 오래된 기능이 없어지는 등 계속 발전해갔다는 것이다. 철저하고, 정확하고, 최신의 자료의 필요성이 명백해졌다. 표준 없이, 다양한 야매가 생겨나기 시작했고, C의 이식성이라는 장점을 위협하게 되었다. 

  C의 US표준은 1983년에 ANSI(미국표준기구)의 지원 아래에서 이루어졌다. 많은 수정끝에, 1988년에 표준이 완성되었고, 1989년에 X3.159-1989라는 이름으로 정식 승인이 났다. 1990년에는 ISO(국제 표준화 기구)에서 ISO/IEC 9899:1990이라는 이름으로 국제 표준을 승인받았다. 이런 버전은 주로 C89, C90으로 불리며, 구식버전의 C는 차별화하기 위해 K&R C라고도 부른다. 부록C에 C89와 K&R C에 대해 비교해 두었다. 더 수정을 거쳐서 1999년에 ISO/IEC 9899:1999라는 이름으로 새로운 기준을 갖게 되었고 이를 C99라고 부른다. 

 C99는 아직 전세계적이지 않기 때문에, 몇백만줄의 코드가 옛버전의 C를 쓰기 때문에 C99의 기능이 먹히지 않는 컴파일러도 있다.

C기반 언어

C는 현재 프로그래밍 언어들에도 큰 영향을 미쳤다. 다음은 유명한 C기반 언어들이다.

  • C++ 는 C의 모든 기능들을 포함하지만, 객체지향 프로그래밍을 할 수 있도록 클래스와 다른 기능이 추가되었다.
  • JAVA 는 C++을 기반으로 하여 C기능들을 상속받았다.
  • C# 은 C++과 JAVA에서 파생된 최신 언어이다.
  • Perl 은 원래 꽤 간단한 스크립팅 언어였다. 시간이 지나 성장하면서 C의 기능들을 가지고 왔다.

 새로운 언어들이 나왔는데, C를 배워야할까? 필자는 다음과 같은 이유로 배우는 것이 좋다고 말한다. 첫번째로, C를 배우는 것은 C++과 JAVA 등 C기반언어의 기능에 대해 넓은 통찰력을 기를 수 있게 해준다. 최신언어를 먼저 배운 프로그래머들은 종종 C에서 상속된 기능이나 기본 기능을 숙련하는데 실패하기도 한다. 두번째로, 곳곳에 오래된 C프로그램들이 많다. 어떨때는 이런 코드들을 읽고 유지보수하는 것이 필요하다. 마지막으로 C는 여전히 새로운 소프트웨어를 개발하는데 넓게 쓰이고 있다. 특히 메모리나 CPU의 성능이 제한된 상황이나, C의 단순함이 필요한 상황에서.

 아직 C기반 언어를 써보지 않았다면, 이 책은 그런 언어들을 공부하는데 훌륭한 연습이 될것이다. 이 책에서는 데이터 추상화, 정보은닉, 그리고 객체지향 프로그래밍의 큰 틀을 다루는 원칙을 강조할 것이다. C++은 C의 기능을 모두 갖고 있기에, C++을 다루기 전에 이 책의 모든 것을 배워야한다. 많은 C의 기능들은 C기반 언어에서 찾아볼 수 있다.

 

+ Recent posts